Linux

CentOS 中的許多主要頁面錯誤

  • July 25, 2014

我們有一個相當複雜的 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 特定論壇。

引用自:https://serverfault.com/questions/615580