我讀了這個關於理解的答案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
這是我不明白的地方:
VIRT
該欄顯示什麼實際上?我知道它是虛擬內存,但在內存摘要的第 2 行,我可以看到有1052.0 avail Mem
,而該列中的進程VIRT
總和遠不止於此。1052.0
可用交換記憶體/虛擬記憶體是多少0.0
?- 當列
692.3
的總和為 時,如何僅使用記憶體?至少不應該是嗎?如果我添加到這些中,看起來我會接近這個數字,但這背後的原因是什麼?%MEM
88.6%
1935 * 0.886 = 1714
1065.7 buff/cache
692.3
- 為什麼主進程處於睡眠狀態(如列所示
S
)?至少不應該它正在跑步?
我主要關心的問題
PHP ini 中的設定memory_limit
設定為256M
.這應該意味著 FPM 生成的每個子進程最多可以使用那麼多內存,對嗎?如果這是正確的,並且我有 35 個子進程(如當前所示top
),那麼理論上它們可以使用(或嘗試使用)最多35 * 256 = 8960M
記憶體。這比1935M
我擁有的總數還要多。
另外,該列中的記憶體總和RES
為1749.6
。換句話說,使用的記憶體是1749/1935 = 90.38%
。但此時所有進程都處於睡眠狀態!如果流量激增並且記憶體消耗突然增加,那聽起來是災難性的。
我考慮將允許的記憶體從 減少256M
到128M
並pm.max_children
從預設值減少50
到12
.這樣,PHP FPM 的總可能記憶體消耗將為12 * 128 = 1536M
,這將在系統上的實際可用記憶體範圍內。那有意義嗎?
答案1
有幾點要考慮。首先,你看692.3 used
,但你還需要考慮因素1065.7 buff/cache
。如果對列求和,它應該與和RES
的總和對齊。這是因為代表用於這些流程的數據,雖然不能立即可用,但應該很快就會可用。used
buff/cache
buff/cache
至於和memory_limit
:pm.max_children
您可以在應用程式中運行最耗資源的腳本並使用以下方法測量其記憶體使用情況記憶體_get_peak_usage()。
取得該值,並添加一些用於資料集成長的容量,現在您就擁有了每個腳本所需的實際最大記憶體。有了這個數字,您現在可以估計pm.max_children
您的伺服器可以處理的容量。向下調整該數字以允許伺服器上的其他進程。
現在您也可以設定更準確的值memory_limit
- 但請注意,違反此值將導致您的腳本終止。我發現它通常最適合作為一種控制來阻止失控腳本殺死您的服務,並將其設置為高於我對內存要求最高的腳本,以允許將來更複雜的工作。
您還應該檢查 fpm (pm.*) 變數並進行相應調整。