在Amazon Web Services上,我使用t2.small
EC2实例作为 VPS,为 LAMP (PHP) 堆栈上的几个网站提供服务。我刚收到一张账单,几乎是我平时账单的三倍。我看到我的I/O 请求使用率非常高。我登录到服务器并注意到磁盘已满。我已经删除了一堆非关键文件和日志,磁盘 (EBS) 现在的容量小于 60%,但我想检查两件事。
- 如何判断大量 I/O 请求是否是由于磁盘已满?
- 如何判断我是否仍在处理 I/O 请求?
我没有启用特定于 AWS 的CloudWatch监控服务,所以我可能不会得到 #1 的答案,但任何建议都将不胜感激。
关于#2,我使用了这篇博文中提到的两种方法来确定我的 I/O 速率,看起来它非常非常高。以下是来自服务器的一些统计数据:
$ iostat
Linux 3.13.0-45-generic (dysphoria) 2015-10-08 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
2.74 0.01 0.69 16.83 0.43 79.30
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
xvda 170.08 10039.29 32.52 843300857 2731428
xvdf 0.01 0.02 0.00 1308 0
$ cat /proc/diskstats
1 0 ram0 0 0 0 0 0 0 0 0 0 0 0
1 1 ram1 0 0 0 0 0 0 0 0 0 0 0
1 2 ram2 0 0 0 0 0 0 0 0 0 0 0
1 3 ram3 0 0 0 0 0 0 0 0 0 0 0
1 4 ram4 0 0 0 0 0 0 0 0 0 0 0
1 5 ram5 0 0 0 0 0 0 0 0 0 0 0
1 6 ram6 0 0 0 0 0 0 0 0 0 0 0
1 7 ram7 0 0 0 0 0 0 0 0 0 0 0
1 8 ram8 0 0 0 0 0 0 0 0 0 0 0
1 9 ram9 0 0 0 0 0 0 0 0 0 0 0
1 10 ram10 0 0 0 0 0 0 0 0 0 0 0
1 11 ram11 0 0 0 0 0 0 0 0 0 0 0
1 12 ram12 0 0 0 0 0 0 0 0 0 0 0
1 13 ram13 0 0 0 0 0 0 0 0 0 0 0
1 14 ram14 0 0 0 0 0 0 0 0 0 0 0
1 15 ram15 0 0 0 0 0 0 0 0 0 0 0
7 0 loop0 0 0 0 0 0 0 0 0 0 0 0
7 1 loop1 0 0 0 0 0 0 0 0 0 0 0
7 2 loop2 0 0 0 0 0 0 0 0 0 0 0
7 3 loop3 0 0 0 0 0 0 0 0 0 0 0
7 4 loop4 0 0 0 0 0 0 0 0 0 0 0
7 5 loop5 0 0 0 0 0 0 0 0 0 0 0
7 6 loop6 0 0 0 0 0 0 0 0 0 0 0
7 7 loop7 0 0 0 0 0 0 0 0 0 0 0
202 0 xvda 14198708 1225 1686588426 26715600 87579 51756 5461696 11290600 0 16654328 38003076
202 1 xvda1 14198527 1203 1686586802 26715376 87579 51756 5461696 11290600 0 16654236 38002848
202 80 xvdf 447 6 2616 288 0 0 0 0 0 288 288
$ free -m
total used free shared buffers cached
Mem: 2000 1910 89 6 6 1216
-/+ buffers/cache: 688 1312
Swap: 0 0 0
尽管上述信息是在启动后不久获取的,但iostat
报告显示即使系统运行了几个小时后,初始 TPS 也在 50-80 范围内。该服务器为大约 20 个站点提供服务,其中只有 3 个站点每天的点击次数超过几次。每天有数百名访客。服务器和站点多年来一直保持这种配置,没有出现问题。直到最近 I/O 才开始激增,而代码、服务器配置或网站负载都没有相应的变化。
请注意,这个问题最初是在 Amazon Web Services 官方论坛上提出的,但似乎没有人能够在那里提供帮助。也许这个问题对于那个论坛来说太笼统了。
iostat 手册页中有重要信息,如果不理解,可能会导致对所提供数据的误解。
因此,您上面的简单 iostat 报告自系统启动以来收集的值。
以间隔运行 iostst 并丢弃第一组统计信息更为正常,例如
这将每 5 秒报告一次相关统计信息。
一旦您收集到正确的数据,您将能够更好地了解情况。
看一下atop命令。特别是使用特权运行它并选择
d
将启用每个线程的磁盘 io 统计信息。