为什么在亚马逊ec2上性能会下降很多?

时间:2013-04-11 15:50:26

标签: java performance amazon-ec2

不详细介绍我的算法,只给出一些实验结果。对于某些给定的输入,我的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

1 个答案:

答案 0 :(得分:2)

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

  1. 您的线程有很多线程间通信,
  2. 在一台物理计算机上运行多个VM。
  3. 虚拟机“核心”实际上作为线程映射到物理机的主操作系统上。如果主操作系统的线程量为30毫秒且VM的线程量为30毫秒,则可能发生的情况是:

    1. 虚拟机会尝试“唤醒”其中一个虚拟核心上的休眠线程。
    2. 向硬件操作系统发送信号以唤醒物理核心上的线程。
    3. 另一个虚拟机正在使用它们。量子等待30ms。
    4. 线程在HW上醒来。
    5. 如果你的另一个线程期望响应速度比30ms快一点,那么你就有了自己的瓶颈。更糟糕的是,基于Linux的服务器上非空闲线程调度的默认量程实际上是~100ms。

      Amazon EC2系统不仅仅是虚拟机,它们是共享单个物理机的虚拟机。为了获得每台服务器机架最大的优势,亚马逊必须在某种程度上过度订阅系统。例如:

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

      这样做是因为许多应用程序不使用满载的8核。但是,如果你与使用完整8核的东西配对,那么......真可惜!我不确定实际的配对比例是多少,而且我想亚马逊不断调整它。