我们有一个相当复杂的PHP脚本,会产生很多小的和主要的页面错误。
$> ps -o min_flt,maj_flt,time,cmd,pid 4686 MINFL MAJFL TIME CMD PID 3074640 255514 00:06:51 php scripts/daemon/PostProc 4686
这个脚本运行10分钟,然后杀死自己。 克朗在一分钟后开始备份。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 4686 apache 20 0 2138m 1.6g 2012 T 48.5 86.9 6:33.30 php
我不知道是什么原因造成如此多的页面错误。 我怀疑你也是。 但是我希望有人能指点我一些Linux命令,我可以用它来调查可能导致这些页面错误的原因。
谢谢!
编辑1
我对剧本跑了一下,这是我回来的。
% time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 20.15 9.297617 22 424130 gettimeofday 13.49 6.223247 64 96600 read 13.01 6.001955 158 37945 stat 8.40 3.876297 306 12677 open 7.43 3.425291 63 54691 write 6.47 2.985425 41 72945 sendto 6.00 2.765838 25 109401 recvmsg 4.84 2.234694 26 85617 close 4.79 2.210381 20 109401 fcntl 3.54 1.635305 22 72934 socket 3.01 1.387212 19 72906 poll 1.96 0.901874 25 35712 70 lstat 1.72 0.795357 22 36467 connect 1.62 0.745462 20 36467 getsockname 1.60 0.740286 20 36467 bind 0.77 0.353189 28 12719 fstat 0.67 0.309640 24 12664 lseek 0.51 0.236759 71 3346 brk 0.01 0.004424 36 123 munmap 0.00 0.000524 25 21 mmap 0.00 0.000000 0 2 mremap 0.00 0.000000 0 11 recvfrom 0.00 0.000000 0 1 shutdown 0.00 0.000000 0 4 uname 0.00 0.000000 0 1 flock 0.00 0.000000 0 1 unlink ------ ----------- ----------- --------- --------- ---------------- 100.00 46.130777 1323253 70 total
当正在运行的程序尝试访问不在RAM中的内存位时,就会发生页面错误,很可能是在磁盘上的交换文件中。 (义务维基百科文章)
运行命令的输出显示PHP程序试图分配2138MB(“VIRT”列),并且只能在RAM中保留1.6GB(“RES”列)。 ( 引用 )
每次脚本访问不在RAM中的内容时,都会生成一个页面错误,告诉操作系统它需要将更多的进程内存交换到磁盘之外。
回到你的问题:
但是我希望有人能指点我一些Linux命令,我可以用它来调查可能导致这些页面错误的原因。
你可能想看看一个简单的 PHP程序有多大。 它可能是一个variables,它附加了数据而不是擦除和覆盖,或者可能需要限制一次处理的数据集的大小。
如果你需要更多的帮助,你可能想把这个问题提交给PHP特定的论坛。
正如你所看到的,Apache进程正在使用86%的内存:
如果内存使用量不会随着时间的推移而增加,那么添加内存将解决这个问题。