0

不详细介绍我的算法,只是给出一些实验结果。对于某些给定的输入,我的 Java 顺序算法在我的笔记本电脑上运行 4 秒(Intel Core i5 430M - 2 核,4 线程,2.27 GHz,4Mb 缓存,3Gb 内存)。该算法的并行版本使用 1 个线程工作 6 秒,使用 2 个线程工作 5 秒,使用 3 个线程工作 4 秒。如果我通过 ssh 在 amazon ec2 上运行它,无论有多少线程,顺序时间为 6 秒,并行时间为 6 到 7 秒。

为什么你认为它更慢?因为亚马逊使用虚拟机并且在那里运行的代码比较慢?你的经验是什么?

我有一个应用程序,我想在具有大量内存和计算能力的环境中进行测试。目前它在亚马逊上是不成功的。

我使用普通的 Java 对象和hppc外部库(高性能原始计算库)。没有数据库和花哨的东西。

实例类型是c1,也许是这个(如果正确我会尽快告诉你,我知道是c1,但不知道是中型还是大型):

High-CPU Extra Large Instance
7 GiB of memory
20 EC2 Compute Units (8 virtual cores with 2.5 EC2 Compute Units each)
1690 GB of instance storage
64-bit platform
I/O Performance: High
EBS-Optimized Available: 1000 Mbps
API name: c1.xlarge
4

1 回答 1

2

根据我的经验,虚拟机具有非常昂贵的多线程任务切换惩罚,如果出现以下情况,可能会导致严重的性能损失:

  1. 您的线程有很多线程间通信,并且
  2. 有多个虚拟机在单个物理机器上运行。

虚拟机“核心”实际上作为线程映射到物理机的主操作系统上。如果主 OS 有 30ms 的线程量子并且 VM 也有 30ms 的线程量子,那么可能发生的情况是:

  1. VM 将尝试“唤醒”其一个虚拟内核上的睡眠线程。
  2. 向硬件操作系统发送信号以唤醒物理内核上的线程。
  3. 另一个 VM 正在使用它们。等待 30 毫秒的量子。
  4. 线程在硬件上唤醒。

如果您的其他线程期望响应比 30 毫秒快一点,那么您就遇到了瓶颈。更糟糕的是,基于 Linux 的服务器上非空闲线程调度的默认时间量实际上是 ~100 毫秒。

Amazon EC2 系统不仅仅是虚拟机,它们是共享单个物理机的虚拟机。为了在每个服务器机架上获得最大的收益,亚马逊还必须在一定程度上超额订阅系统。前任:

  • 物理主机有 16 个 HT 线程(8 个物理内核)
  • 每个 VM 有 8 个虚拟内核
  • EC2 将在机器上粘贴 3-4 个虚拟机(超额订阅)

这样做是因为许多应用程序不使用 8 核的满载。但是,如果您与使用完整 8 核的设备配对,那么......真是太糟糕了!我不确定实际的配对比率是多少,我想亚马逊无论如何都会不断调整它。

于 2013-04-11T16:28:04.017 回答