Linux
CentOS 中的許多主要頁面錯誤
我們有一個相當複雜的 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 分鐘,然後自行終止。一分鐘後,Cron 重新啟動它。
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
我在腳本上執行了 strace,這就是我得到的結果。
% 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 程序有多大。它可能類似於一個附加了數據而不是被擦除和覆蓋的變數,或者它可能是您需要立即限制您正在處理的數據集的大小。
如果您需要更多幫助,您可能希望將此問題送出給 PHP 特定論壇。