
所以我最近遇到了一些伺服器效能問題。目前我們正在運行具有 4GB 和 160GB 磁碟空間的 Fedora 伺服器。我們幾乎已經用完磁碟上的所有檔案了。我們正在運行多個網站,每個網站都有多個備份。但只有一個網站真正獲得流量。這是一個擁有大量訪客的電子商務網站。
最近載入時間很慢,我注意到我們的可用記憶體變得非常低(低於 1 GB)。我將重新啟動伺服器(現在我每天必須重新啟動 3 次),一切都會好起來的。我們一開始釋放了 2.2GB 內存,但 3 或 4 小時後,您會發現內存被耗盡,加載時間也在緩慢增長。我不知道這是從哪裡來的,或者我們是否應該升級到更好的伺服器。我只是不想升級然後意識到我在 MySQL 請求的某個地方遇到了瓶頸。
任何想法或建議將不勝感激。
編輯-
還有 3 個虛擬主機,我有超過 60,000 個檔案。
total used free shared buffers cached
Mem: 4003 3372 630 0 398 1717
-/+ buffers/cache: 1256 2746
Swap: 8189 0 8189
21:21:49 up 46 min, 1 user, load average: 3.75, 4.20, 4.03
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 2 0 592728 409640 1838360 0 0 165 411 953 473 9 8 47 36 0
這是頂部快照。
1356 mysql 20 0 1374m 219m 5320 S 5.6 5.5 14:06.21 mysqld
15796 root 20 0 103m 20m 440 D 1.0 0.5 0:04.42 sendmail
1081 root 20 0 103m 20m 440 D 0.7 0.5 0:21.73 sendmail
24013 root 20 0 97416 22m 2648 D 0.7 0.6 0:15.15 mailq
1525 root 20 0 247m 7980 3472 S 0.3 0.2 0:06.88 vlogger (access
1530 apache 20 0 539m 13m 3008 S 0.3 0.3 0:03.56 httpd
2399 apache 20 0 539m 12m 2748 S 0.3 0.3 0:00.85 httpd
5763 root 20 0 121m 4932 3868 S 0.3 0.1 0:00.07 sshd
12326 apache 20 0 539m 12m 2992 S 0.3 0.3 0:00.38 httpd
12421 apache 20 0 539m 12m 2988 S 0.3 0.3 0:00.45 httpd
16396 apache 20 0 538m 12m 2284 S 0.3 0.3 0:00.09 httpd
17050 root 20 0 15368 1256 868 R 0.3 0.0 0:00.09 top
1 root 20 0 37336 4104 1908 S 0.0 0.1 0:02.82 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.03 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/u:0
7 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/u:0H
8 root RT 0 0 0 0 S 0.0 0.0 0:00.11 migration/0
9 root RT 0 0 0 0 S 0.0 0.0 0:00.01 watchdog/0
10 root RT 0 0 0 0 S 0.0 0.0 0:00.14 migration/1
12 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/1:0H
13 root 20 0 0 0 0 S 0.0 0.0 0:00.02 ksoftirqd/1
14 root RT 0 0 0 0 S 0.0 0.0 0:00.01 watchdog/1
15 root RT 0 0 0 0 S 0.0 0.0 0:00.15 migration/2
17 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/2:0H
18 root 20 0 0 0 0 S 0.0 0.0 0:00.03 ksoftirqd/2
19 root RT 0 0 0 0 S 0.0 0.0 0:00.01 watchdog/2
20 root RT 0 0 0 0 S 0.0 0.0 0:00.11 migration/3
22 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/3:0H
23 root 20 0 0 0 0 S 0.0 0.0 0:00.02 ksoftirqd/3
24 root RT 0 0 0 0 S 0.0 0.0 0:00.01 watchdog/3
25 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 cpuset
26 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 khelper
27 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
28 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns
29 root 20 0 0 0 0 S 0.0 0.0 0:00.00 xenwatch
答案1
每分鐘啟動 sar 並輸出 ps 表。看我的詳細回答這裡。
下次伺服器崩潰時,用來sar -r
幫助追蹤什麼時候它發生了。現在使用 ps-cronjob 或我的輸出github 上 ps 的 Perl 包裝器,找出哪個進程可能是罪魁禍首。
假設伺服器在 12:00:00 到 13:00:00 之間發生了爆炸。使用sar -r -s 12:00:00 -e 13:00:00
。由此您應該會看到資料出現峰值。 (如果更容易的話,有一個基於 java 的實用程式可以進行繪圖,但通常不值得這麼麻煩。) 假設您在 12:15 看到一個峰值(或一個波谷)。現在掃描 ps 列輸出的時間範圍(例如 12:00 到 12:15),按 pid 排序,然後按時間排序,然後查看記憶體列:
awk '/^=== .* 12:00:/,/^=== .* 12:16:/' /var/log/sa/ps/today |
sort -k 1n -k 16
(排序選項假定時間位於第 16 列,但情況可能是也可能不是)。現在您可以再次透過 awk 過濾該輸出以查找輸出行之間的差異:
... | awk 'lastpid && lastpid==$1 && last != $0 { print} /^[0-9]/ { lastpid=$1;last=$0; }'
這是一個相當粗糙的過濾器。對於某些進程(其命令列一直在變化,例如 mysql、postgresql 和 snmpd),這不會很有幫助,但希望您可以調整 awk 來幫助您找到罪魁禍首。