我的 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”标志来获取所需的输出。