我们有这个apache进程,它不时变成io-bound。 使用atop,我们可以看到它是一个写操作。
使用lsof -p <PID>我们可以看到由httpd进程打开的文件列表。 首先我们认为“login”文件一定是问题。 所以我们把它们关掉只是为了testing。 但是写操作仍然继续。
我们将继续testing其他一些事情。 例如,我们使用php会话variables很多。 也许php会话文件正在写所有的文字。
但有没有办法快速识别由httpd进程写入的文件? 这样我们可以把精力集中在这些文件上。
更新:
build议使用strace命令。 这里是输出的两行。
write(23, "\27\0\0\0\3SET CHARACTER SET utf8", 27) = 27 write(23, "\17\0\0\0\3SET NAMES utf8", 19) = 19
我们在这台服务器上没有mysql进程。 strace也显示了什么是写入以太网端口?
UPDATE2:在高IO负载期间,占用大部分写入资源的进程给出以下输出以strace -e trace=write -p <PID> :
— SIGCHLD(Child exited)@ 0(0)—
写(9,“!”,1)= 1
写(19,“选项* HTTP / 1.0 \ r \ n用户代理:Apache(内部虚拟连接)\ r \ n \ r \ n”,70)= 70
不过,我不知道这些是写在哪里。
UPDATE3:尝试下面的命令,将显示所有文件打开写入:
lsof | grep -e "[[:digit:]]\+w"
以下是我无法检查的唯一两条线。 其他文件不显示任何重要的写入活动。 下面的项目可以暂时写入硬盘?
httpd 14173 apache 9w FIFO 0,6 205676000 pipe httpd 14173 apache 1w CHR 1,3 3346 /dev/null
原因:
最后我们发现io-boundness的原因是php会话文件。 移动php会话文件到另一个硬盘驱动器也立即将io-boundness移动到该硬盘驱动器。 我们可能会把会话转移到redis或其他基于内存的系统。 有趣的是,即使下面的答案在技术上是正确的,他们并没有把我们引导到会话文件,并让我们看着系统的不同点。
strace -e trace=write -p <PID>
我认为lsof是查看当前打开的文件的最佳工具
lsof -p <pid>
你确定要看正确的过程吗? 每个Apache“服务器”是一个独立的进程,所以你应该循环控制每个孩子(你从StartServers指令中定义的数字开始)。
要查看连接:
netstat -nap | grep <pid>