在亚马逊网络服务我正在使用t2.small
EC2实例作为 VPS 为 LAMP(PHP)堆栈上的几个网站提供服务。我刚刚收到了一张账单,几乎是我平常账单的三倍。我发现我的I/O 请求使用率极高。我登录服务器后发现磁盘已满。我删除了一堆非关键文件和日志,磁盘 (EBS) 现在的容量不到 60%,但我想检查两件事。
- 如何判断 I/O 请求数量过多是否是由于磁盘已满造成的?
- 我如何知道我是否仍在执行 I/O 请求?
我没有 AWS 特定的云监控监控服务已启用,所以我可能不会得到#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 个网站提供服务,其中只有三个网站每天的点击量超过几次。这些网站每天的访问量约为几百人次。服务器和网站多年来一直保持这种配置,没有出现问题。直到最近,I/O 才开始激增,而代码、服务器配置或网站负载并没有相应的变化。
请注意,这个问题最初是在亚马逊网络服务官方论坛但似乎没人能帮忙。也许这个问题对于该论坛来说太笼统了。
答案1
iostat 手册页中有一些重要信息,如果不理解,可能会导致对所呈现的数据的误解。
iostat 命令生成的第一个报告提供了自系统启动以来的统计信息。每个后续报告涵盖自上一个报告以来的时间。每次运行 iostat 命令时都会报告所有统计信息。
因此,上面的简单 iostat 报告的是自系统启动以来收集的值。
更常见的做法是间隔一段时间运行 iostst 并丢弃第一组统计数据,例如
iostat 5
这将每 5 秒报告一次相关统计数据。
一旦收集了正确的数据,您将能够更好地了解情况。
看看在顶上命令。特别是以特权运行它并选择d
将启用每个线程的磁盘 io 统计。