我们使用 EC2 Auto Scaling,最近决定将实例类型从 m2.2xlarge 更改为 c1.xlarge(高内存到高 CPU),因为每个实例使用的平均 RAM 量为 2G,因此我们不需要 m2.2xlarge 提供的 34G,并且以相同的价格拥有 c1.xlarge 的更多 CPU 能力是个好主意。
但切换到 c1.xlarge 后,我们遇到了以下问题:
- 平均负载变为 50,而 CPU 利用率从 %70 下降到 %60。
- 从 6 个实例扩展到 4 个不会影响 CPU 利用率云监视指标。
- 由于 ELB 健康检查,响应时间似乎非常慢,并且实例不断被自动扩展所取代。
- 由于 CPU 利用率下降,Auto Scaling 将实例数量从 8 个减少到 4 个。
你能解释一下这种行为的原因是什么以及我该怎么办吗?
EC2 实例类型信息:
高内存双倍超大型实例
34.2 GB 内存 13 个 EC2 计算单元(4 个虚拟核心,每个核心有 3.25 个 EC2 计算单元) 850 GB 实例存储 64 位平台 I/O 性能:高 API 名称:m2.2xlarge
高 CPU 超大型实例
7 GB 内存 20 个 EC2 计算单元(8 个虚拟核心,每个核心有 2.5 个 EC2 计算单元) 1690 GB 实例存储 64 位平台 I/O 性能:高 API 名称:c1.xlarge
编辑:
$ iostat -x
Linux 2.6.38-13-virtual 02/17/2012 _x86_64_ (8 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
1.34 0.00 0.13 0.02 0.29 98.23
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
xvdap1 0.04 0.09 0.08 0.13 1.50 0.87 22.99 0.01 36.59 23.42 44.75 4.04 0.08
xvdb 0.00 0.00 0.01 0.00 0.03 0.00 9.37 0.00 1.04 0.95 15.00 1.04 0.00
$ iostat
Linux 2.6.38-13-virtual 02/17/2012 _x86_64_ (8 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
1.45 0.00 0.14 0.02 0.31 98.08
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
xvdap1 0.21 1.50 0.87 93689 54728
xvdb 0.01 0.03 0.00 1575 8
$ top
top - 05:30:08 up 17:20, 3 users, load average: 15.13, 10.24, 9.66
Tasks: 166 total, 20 running, 146 sleeping, 0 stopped, 0 zombie
Cpu(s): 65.3%us, 4.7%sy, 0.0%ni, 13.5%id, 0.0%wa, 0.0%hi, 0.7%si, 15.8%st
Mem: 7130236k total, 463440k used, 6666796k free, 19100k buffers
Swap: 0k total, 0k used, 0k free, 95136k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6457 ubuntu 20 0 257m 11m 4820 S 24 0.2 0:16.73 apache2
6416 ubuntu 20 0 257m 11m 4820 R 23 0.2 0:17.36 apache2
6375 ubuntu 20 0 257m 11m 4820 R 22 0.2 0:17.62 apache2
6402 ubuntu 20 0 257m 11m 4820 R 22 0.2 0:16.85 apache2
6472 ubuntu 20 0 257m 11m 4820 S 22 0.2 0:08.95 apache2
6311 ubuntu 20 0 257m 11m 4820 S 21 0.2 0:24.91 apache2
6446 ubuntu 20 0 257m 11m 4820 R 21 0.2 0:16.91 apache2
6372 ubuntu 20 0 257m 11m 4820 R 21 0.2 0:17.89 apache2
6460 ubuntu 20 0 257m 11m 4820 R 21 0.2 0:16.73 apache2
6379 ubuntu 20 0 257m 11m 4820 R 20 0.2 0:16.24 apache2
6380 ubuntu 20 0 257m 11m 4820 S 20 0.2 0:17.20 apache2
6450 ubuntu 20 0 257m 11m 4820 S 20 0.2 0:16.89 apache2
6426 ubuntu 20 0 257m 11m 4820 R 20 0.2 0:16.96 apache2
6432 ubuntu 20 0 257m 11m 4820 S 20 0.2 0:17.78 apache2
6433 ubuntu 20 0 257m 11m 4820 R 20 0.2 0:14.37 apache2
6476 ubuntu 20 0 257m 11m 4816 R 20 0.2 0:02.92 apache2
6386 ubuntu 20 0 257m 11m 4824 S 20 0.2 0:17.94 apache2
6475 ubuntu 20 0 257m 11m 4820 S 19 0.2 0:03.41 apache2
6355 ubuntu 20 0 257m 11m 4820 S 19 0.2 0:24.39 apache2
6417 ubuntu 20 0 257m 11m 4820 R 18 0.2 0:16.66 apache2
6455 ubuntu 20 0 257m 11m 4820 R 18 0.2 0:16.27 apache2
6393 ubuntu 20 0 257m 11m 4820 S 18 0.2 0:16.60 apache2
6325 ubuntu 20 0 257m 11m 4820 R 18 0.2 0:25.66 apache2
6403 ubuntu 20 0 257m 11m 4820 S 18 0.2 0:15.61 apache2
6474 ubuntu 20 0 257m 11m 4812 S 18 0.2 0:04.37 apache2
6477 ubuntu 20 0 257m 11m 4800 S 18 0.2 0:01.43 apache2
6315 ubuntu 20 0 257m 11m 4820 S 17 0.2 0:25.27 apache2
6376 ubuntu 20 0 257m 11m 4820 R 17 0.2 0:17.53 apache2
6478 ubuntu 20 0 257m 11m 4800 S 15 0.2 0:00.45 apache2
6359 ubuntu 20 0 257m 11m 4820 R 15 0.2 0:23.60 apache2
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvda1 7.9G 1.4G 6.1G 19% /
none 3.4G 112K 3.4G 1% /dev
none 3.4G 0 3.4G 0% /dev/shm
none 3.4G 72K 3.4G 1% /var/run
none 3.4G 0 3.4G 0% /var/lock
/dev/xvdb 414G 199M 393G 1% /mnt
XXXX.compute.internal:/share_0
99G 28G 66G 30% /data_0
XXXX.compute.internal:/share_17
99G 30G 64G 33% /data_17
XXXX.compute.internal:/share_13
99G 30G 64G 33% /data_13
XXXX.compute.internal:/share_18
99G 31G 64G 33% /data_18
XXXX.compute.internal:/share_15
99G 28G 66G 30% /data_15
XXXX.compute.internal:/share_10
99G 28G 67G 30% /data_10
XXXX.compute.internal:/share_16
99G 30G 64G 32% /data_16
XXXX.internal:/share_3
99G 29G 66G 31% /data_3
XXXX.compute.internal:/share_11
99G 30G 64G 32% /data_11
XXXX.compute.internal:/share_7
99G 28G 66G 30% /data_7
XXXX.compute.internal:/share
99G 58G 37G 62% /share
XXXX.compute.internal:/share_2
99G 28G 66G 30% /data_2
XXXX.compute.internal:/share_8
99G 28G 67G 30% /data_8
XXXX.compute.internal:/share_19
99G 28G 66G 30% /data_19
XXXX.compute.internal:/share_14
99G 31G 64G 33% /data_14
XXXX.compute.internal:/share_5
99G 28G 66G 30% /data_5
XXXX.compute.internal:/share_6
99G 28G 67G 30% /data_6
XXXX.compute.internal:/share_1
99G 28G 66G 30% /data_1
XXXX.compute.internal:/share_12
99G 31G 64G 33% /data_12
XXXX.compute.internal:/share_4
99G 29G 66G 31% /data_4
XXXX.compute.internal:/share_9
99G 28G 66G 30% /data_9
$ free -g
total used free shared buffers cached
Mem: 6 0 6 0 0 0
-/+ buffers/cache: 0 6
Swap: 0 0 0
sar 1
Linux 2.6.38-13-virtual 02/17/2012 _x86_64_ (8 CPU)
05:33:02 AM CPU %user %nice %system %iowait %steal %idle
05:33:03 AM all 69.27 0.00 5.90 0.00 13.83 11.00
05:33:04 AM all 70.88 0.00 7.62 0.00 16.50 5.01
05:33:05 AM all 64.41 0.00 5.35 0.00 17.90 12.34
05:33:06 AM all 66.41 0.00 9.16 0.00 13.09 11.34
05:33:07 AM all 74.55 0.00 7.06 0.00 11.21 7.17
05:33:08 AM all 62.31 0.00 7.49 0.00 13.38 16.81
05:33:09 AM all 73.65 0.00 5.61 0.00 16.04 4.70
05:33:10 AM all 76.79 0.00 8.20 0.00 9.70 5.31
05:33:11 AM all 70.91 0.00 5.86 0.00 14.21 9.02
05:33:12 AM all 73.95 0.00 6.37 0.00 12.51 7.17
05:33:13 AM all 63.50 0.00 6.03 0.00 17.52 12.95
05:33:14 AM all 61.92 0.00 4.42 0.00 17.66 16.00
05:33:15 AM all 63.56 0.00 6.42 0.00 15.11 14.91
05:33:16 AM all 72.63 0.00 7.51 0.00 14.90 4.97
05:33:17 AM all 60.68 0.00 6.17 0.00 15.09 18.06
$ sar -w 1
Linux 2.6.38-13-virtual 02/17/2012 _x86_64_ (8 CPU)
09:34:23 AM proc/s cswch/s
09:34:24 AM 0.00 4795.00
09:34:25 AM 0.00 4174.00
09:34:26 AM 0.00 4194.23
09:34:27 AM 1.00 3645.00
09:34:28 AM 0.00 4564.00
09:34:29 AM 0.00 4473.00
09:34:30 AM 0.00 4225.00
09:34:31 AM 0.00 4064.36
09:34:32 AM 0.00 4740.00
09:34:33 AM 0.00 4589.22
09:34:34 AM 0.00 3887.00
09:34:35 AM 0.00 4579.00
09:34:36 AM 0.00 4408.00
09:34:37 AM 1.00 4390.00
09:34:38 AM 0.00 4628.00
答案1
请添加sar -w 1
输出。我认为每秒的上下文切换次数会降低您的性能,因为运行的进程比可用的处理器多得多。我认为虚拟机上的上下文切换很昂贵。
如果这是真的,那么有一些内核可调参数可以帮助您减少上下文切换的次数:
检查 的值
systctl kernel.sched_min_granularity_ns
。使用类似于 的命令将其加倍。systctl kernel.sched_min_granularity_ns=2000000
重新测试。再将其加倍。重新测试。重复。尝试找到一个不会过多削弱交互性但不会允许太多上下文切换的值,并将其写入/etc/sysctl.conf
以便在启动时设置。将调度策略设置
apache
为 SCHED_BATCH - 启动它chrt -b 0 apache2
答案2
sar 输出显示了相当多的 %steal 时间,这基本上意味着物理硬件很忙并且虚拟机管理程序无法为 VM 提供其所需的 CPU 周期数量。