为什么amazon ec2的性能会下降很多?

kaut 发布于 2019-03-09 java 最后更新 2019-03-09 14:31 3 浏览

不会详细介绍我的算法,只是给出一些实验结果。对于某些给定的输入,我的Java顺序算法在我的笔记本电脑(Intel Core i5 430M - 2核,4线程,2.27 GHz,4Mb高速缓存,3Gb内存)上运行4秒。该算法的并行版本使用1个线程工作6秒,使用2个线程工作5秒,使用3个线程工作4秒。如果我通过ssh在亚马逊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
已邀请:

bmagni

赞同来自:

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

  1. 您的线程有很多线程间通信,
  2. 在一台物理计算机上运行多个VM。
虚拟机“核心”实际上作为线程映射到物理机的主操作系统上。如果主操作系统的线程量为30毫秒且VM的线程量为30毫秒,则可能发生的情况是:
  1. 虚拟机将尝试在其虚拟核心之一“唤醒”睡眠线程。
  2. 向硬件操作系统发送信号以唤醒物理核心上的线程。
  3. 另一个虚拟机正在使用它们。量子等待30ms。
  4. 线程在HW上醒来。
如果你的其他线程期望响应速度比30ms快一点,那么你就会遇到瓶颈问题。更糟糕的是,基于Linux的服务器上非空闲线程调度的默认量程实际上是~100ms。 Amazon EC2系统不仅仅是虚拟机,它们是共享单个物理机器的虚拟机。为了获得每台服务器机架最大的优势,亚马逊必须在某种程度上超额认购系统。例如:
  • 物理主机有16个HT线程(8个物理内核)
  • 虚拟机每个
  • 有8个虚拟核心
  • EC2将在机器上粘贴3-4个虚拟机(超额预订)
这样做是因为许多应用程序不使用满载的8核。但是,如果你与使用完整的8核心的东西配对,那么......真可惜!我不确定实际的配对比例是多少,而且我想亚马逊不断调整它。