使用「top」指令顯示 PHP FPM 進程使用的記憶體多於可用記憶體

使用「top」指令顯示 PHP FPM 進程使用的記憶體多於可用記憶體

我讀了這個關於理解的答案top,以及man top,但我認為我仍然無法將所提供的數據轉化為top實際資訊。

我登入了一個 Amazon EC2 實例,該執行個體是負載平衡組的一部分。它正在運行 PHP FPM,我已進行過濾top以僅顯示php-fpm進程:

top - 11:27:43 up 18:59,  2 users,  load average: 0.59, 0.79, 0.74
Tasks: 171 total,   1 running, 125 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  9.1 sy,  0.0 ni, 90.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   1935.6 total,    177.7 free,    692.3 used,   1065.7 buff/cache
MiB Swap:      0.0 total,      0.0 free,      0.0 used.   1052.0 avail Mem

  PID USER            PR    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                   
 1566 root            20  356.2m  30.5m  23.5m S        1.6   0:02.14 php-fpm: master process (/etc/php-fpm.conf)
 2188 webapp          20  442.2m  51.3m  31.8m S        2.7   2:18.47 php-fpm: pool www
 2189 webapp          20  442.1m  50.8m  30.4m S        2.6   2:19.21 php-fpm: pool www
 2190 webapp          20  444.2m  52.6m  30.4m S        2.7   2:20.14 php-fpm: pool www
 2191 webapp          20  442.1m  51.1m  31.3m S        2.6   2:22.69 php-fpm: pool www
 2192 webapp          20  442.2m  50.8m  31.6m S        2.6   2:19.64 php-fpm: pool www
 2193 webapp          20  436.3m  46.5m  32.0m S        2.4   2:17.29 php-fpm: pool www
 2194 webapp          20  452.2m  60.6m  30.4m S        3.1   2:19.82 php-fpm: pool www
 2195 webapp          20  438.1m  48.0m  31.6m S        2.5   2:17.78 php-fpm: pool www
 2197 webapp          20  442.2m  50.9m  30.6m S        2.6   2:18.28 php-fpm: pool www
12626 webapp          20  443.6m  50.4m  28.4m S        2.6   0:37.02 php-fpm: pool www
12627 webapp          20  443.5m  50.3m  28.6m S        2.6   0:35.68 php-fpm: pool www
12628 webapp          20  438.0m  45.1m  29.1m S        2.3   0:36.28 php-fpm: pool www
12629 webapp          20  443.9m  51.4m  29.3m S        2.7   0:35.26 php-fpm: pool www
12630 webapp          20  441.6m  48.9m  29.5m S        2.5   0:34.90 php-fpm: pool www
12631 webapp          20  443.6m  50.5m  28.7m S        2.6   0:34.93 php-fpm: pool www
12632 webapp          20  436.0m  43.2m  29.1m S        2.2   0:36.01 php-fpm: pool www
12635 webapp          20  441.6m  48.1m  28.3m S        2.5   0:34.56 php-fpm: pool www
12636 webapp          20  446.1m  55.0m  30.8m S        2.8   0:37.10 php-fpm: pool www
12637 webapp          20  441.9m  48.8m  29.0m S        2.5   0:35.16 php-fpm: pool www
12639 webapp          20  443.6m  50.3m  28.5m S        2.6   0:34.23 php-fpm: pool www
12640 webapp          20  438.0m  44.7m  28.9m S        2.3   0:36.33 php-fpm: pool www
12641 webapp          20  442.8m  49.5m  28.4m S        2.6   0:35.51 php-fpm: pool www
12642 webapp          20  443.8m  50.8m  29.1m S        2.6   0:36.22 php-fpm: pool www
12643 webapp          20  438.0m  44.2m  29.2m S        2.3   0:33.49 php-fpm: pool www
12644 webapp          20  440.0m  47.4m  29.3m S        2.5   0:36.44 php-fpm: pool www
12645 webapp          20  441.6m  48.7m  29.0m S        2.5   0:34.38 php-fpm: pool www
12646 webapp          20  441.6m  48.5m  28.8m S        2.5   0:34.53 php-fpm: pool www
12647 webapp          20  437.6m  44.5m  28.5m S        2.3   0:34.73 php-fpm: pool www
12648 webapp          20  437.7m  44.4m  28.6m S        2.3   0:33.64 php-fpm: pool www
12649 webapp          20  440.0m  46.9m  29.0m S        2.4   0:35.81 php-fpm: pool www
12651 webapp          20  444.1m  51.1m  29.0m S        2.6   0:34.77 php-fpm: pool www
12652 webapp          20  439.8m  47.0m  29.1m S        2.4   0:35.02 php-fpm: pool www
12657 webapp          20  443.9m  51.7m  29.9m S        2.7   0:35.35 php-fpm: pool www
12658 webapp          20  438.0m  45.5m  29.3m S        2.3   0:34.81 php-fpm: pool www
12667 webapp          20  441.9m  49.6m  29.6m S        2.6   0:34.21 php-fpm: pool www

這是我不明白的地方:

  1. VIRT該欄顯示什麼實際上?我知道它是虛擬內存,但在內存摘要的第 2 行,我可以看到有1052.0 avail Mem,而該列中的進程VIRT總和遠不止於此。
  2. 1052.0可用交換記憶體/虛擬記憶體是多少0.0
  3. 當列692.3的總和為 時,如何僅使用記憶體?至少不應該是嗎?如果我添加到這些中,看起來我會接近這個數字,但這背後的原因是什麼?%MEM88.6%1935 * 0.886 = 17141065.7 buff/cache692.3
  4. 為什麼主進程處於睡眠狀態(如列所示S)?至少不應該正在跑步?

我主要關心的問題

PHP ini 中的設定memory_limit設定為256M.這應該意味著 FPM 生成的每個子進程最多可以使用那麼多內存,對嗎?如果這是正確的,並且我有 35 個子進程(如當前所示top),那麼理論上它們可以使用(或嘗試使用)最多35 * 256 = 8960M記憶體。這比1935M我擁有的總數還要多。

另外,該列中的記憶體總和RES1749.6。換句話說,使用的記憶體是1749/1935 = 90.38%。但此時所有進程都處於睡眠狀態!如果流量激增並且記憶體消耗突然增加,那聽起來是災難性的。

我考慮將允許的記憶體從 減少256M128Mpm.max_children從預設值減少5012.這樣,PHP FPM 的總可能記憶體消耗將為12 * 128 = 1536M,這將在系統上的實際可用記憶體範圍內。那有意義嗎?

答案1

有幾點要考慮。首先,你看692.3 used,但你還需要考慮因素1065.7 buff/cache。如果對列求和,它應該與和RES的總和對齊。這是因為代表用於這些流程的數據,雖然不能立即可用,但應該很快就會可用。usedbuff/cachebuff/cache

至於和memory_limitpm.max_children您可以在應用程式中運行最耗資源的腳本並使用以下方法測量其記憶體使用情況記憶體_get_peak_usage()

取得該值,並添加一些用於資料集成長的容量,現在您就擁有了每個腳本所需的實際最大記憶體。有了這個數字,您現在可以估計pm.max_children您的伺服器可以處理的容量。向下調整該數字以允許伺服器上的其他進程。

現在您也可以設定更準確的值memory_limit- 但請注意,違反此值將導致您的腳本終止。我發現它通常最適合作為一種控制來阻止失控腳本殺死您的服務,並將其設置為高於我對內存要求最高的腳本,以允許將來更複雜的工作。

您還應該檢查 fpm (pm.*) 變數並進行相應調整。

相關內容