如何确保I / O请求恢复到正常速度?

amazon web services上我使用一个t2.small EC2实例作为VPS服务于LAMP(PHP)堆栈上的一些网站。 我刚刚打了一张账单,几乎是我通常账单的三倍。 我看到我的I / O请求使用率非常高 。 我login到服务器,发现磁盘已满。 我已经删除了一堆非关键的文件和日志,磁盘(EBS)现在的容量小于60%,但我想检查两件事情。

  1. 如何判断I / O请求数量是否是由于磁盘空间不足造成的?
  2. 我怎么知道我是否还在烧I / O请求?

我没有启用AWS特定的CloudWatch监控服务,所以我可能不会得到#1的答案,但任何build议,将不胜感激。

关于#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个网站,其中只有三个获得超过每天点击。 那些每天几百人的订单。 服务器和站点多年来一直保持这种configuration,没有问题。 直到最近I / O才开始飙升,代码,服务器configuration或网站负载都没有相应的变化。

请注意,这个问题最初是在amazon web services官方论坛上提出的,但似乎没有人能够在那里提供帮助。 也许这个论坛的问题太笼统了。

iostat手册页中有重要的信息,如果不明白的话可能会导致对所提供数据的误解。

由iostat命令生成的第一个报告提供了有关自系统启动以来的时间的统计信息。 随后的每一份报告都涵盖自上次报告以来的时间。 每次运行iostat命令时都会报告所有统计信息。

所以,上面简单的iostat报告系统启动以来收集的值。

以间隔运行iostst并丢弃第一组统计信息是比较正常的

 iostat 5 

这将每5秒钟报告一次相关的统计数据。

一旦你正在收集正确的数据,你将能够更好地了解情况。


看看atop命令。 特别是运行它的权限和selectd将启用磁盘io统计每个线程。