确定导致磁盘 I/O 过高的原因

确定导致磁盘 I/O 过高的原因

我的 VPS 和磁盘 I/O 有问题。我的服务器运行的是 nginx + PHP-FPM + APC。数据库位于另一个专用 VPS 上。我的网络服务器上有几个 WordPress MU 网站。平均 I/O 速率为 6k 块/秒。

我试图了解导致高 I/O 的原因。

‘free -m’的输出:

            total   used   free   shared   buffers   cached
Mem:         1005    973     31        0        96      568
-/+ buffers/cache:   307    697
Swap:         255      8    247

‘iotop’的输出:

Total DISK READ: 0.00 B/s | Total DISK WRITE: 3.90 M/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND
 2150 be/4 root        0.00 B/s    0.00 B/s  0.00 % 65.25 % [flush-202:0]
 6694 be/4 www-data    0.00 B/s   19.64 K/s  0.00 %  0.00 % php-fpm: pool www
 6700 be/4 www-data    0.00 B/s   23.56 K/s  0.00 %  0.00 % php-fpm: pool www
 8646 be/4 www-data    0.00 B/s  424.12 K/s  0.00 %  0.00 % php-fpm: pool www
10974 be/4 www-data    0.00 B/s   19.64 K/s  0.00 %  0.00 % php-fpm: pool www

“flush-202:0”进程有时会达到 99% 的 I/O。我了解到这是磁盘缓存刷新进程,但是什么原因导致它运行,我该如何修复它?

答案1

我不确定 iotop 示例是否显示了异常。如果当时没有太多 I/O 发生,则刷新过程在任何时间点占 I/O 的很大百分比都不是问题。

我会安装在顶上,它可以像 iotop 一样显示实时数据,但其优势在于还可以全天记录样本。安装后的第二天,我会使用 打开记录的数据atop -r log_filename,然后使用 查看样本直到我发现系统级输出中报告的 I/O 很高的时候。然后我会将每个进程的输出切换到磁盘d查看哪些进程正在生成 I/O 活动。

答案2

这可能是 APC 的问题。

如果它对你有用,请在你的 PHP 配置中设置:

apc.mmap_file_mask = /tmp/apc.shm.XXXXXX

如果这不起作用,请完全删除 apc.mmap_file_mask 设置。

如果不是 APC,那么它就是其他使用磁盘支持缓存的东西。例如虚拟内存,或者 varnish 缓存,或者可能是使用 DBM 文件的东西。那里有很多可能性。甚至可能是数据库引擎。

APC 用户现在可能应该迁移到 Zend 的 opcache,它随 PHP 的后续免费发行版(以及我记得的早期付费发行版)一起提供。查看 opcache 的调整对于管理 I/O 负载可能仍然很重要。 https://www.sitepoint.com/understanding-opcache/是一个有用的介绍,并链接到几个可用于检查缓存性能(特别是命中率)的工具。

答案3

你可以使用 pidstat 程序来实现这一点。有些发行版没有安装它。但你可以从以下网址下载 sysstate 包:这里并编译它。不要安装它,而是复制出它编译的 pidstat(或者只是在当前目录中运行它)。您可以传递“-d”标志来获取所需的输出。

相关内容