java - 为什么亚马逊 ec2 的性能会下降很多?

标签 java performance amazon-ec2

不详细讨论我的算法,只是给出一些实验结果。对于某些给定的输入,我的 Java 顺序算法在我的笔记本电脑(Intel Core i5 430M - 2 核、4 线程、2.27 GHz、4Mb 缓存、3Gb 内存)上运行 4 秒。该算法的并行版本使用 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. 您的线程有很多线程间通信,并且
  2. 一台物理机上运行多个虚拟机。

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

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

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

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

  • 物理主机有 16 个 HT 线程(8 个物理核心)
  • 每个虚拟机有 8 个虚拟核心
  • EC2 将在计算机上安装 3-4 个虚拟机(超额订阅)

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

关于java - 为什么亚马逊 ec2 的性能会下降很多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15953324/

相关文章:

php - 无法让 mbstring 在 Amazon linux 2 AMI 上工作

amazon-ec2 - EC/2 节点之间的速度有多快?

amazon-web-services - 如何查看在Amazon EC2 实例中启动的网站?

java - 无法让@Autowired 与 bean 一起工作

CSS 动画背景颜色需要太多的性能!寻找选择

java - 将 View 声明为不可见或将背景设置为透明并在需要时更改其背景资源是否更有效?

sql-server - 这些 sys.sp_* 存储过程在做什么?

java - 如何使用外部应用程序获取 Soap Web 服务的请求和响应详细信息?

java - 社交媒体网站上提及的主要网站图片

Java - 后缀表达式中的不规则空格