我的 VPS 崩潰了,我不知道為什麼
我現在有一個帶有 Linode 的 VPS。我的監控服務提醒我,我託管的網站已關閉。我使用 Lish(Linode 的通過 SSH 連接但不使用 SSH 直接帶外訪問控制台)的方法來查看任何錯誤消息。這是我看到的:
我檢查了我的 Munin 日誌以查看記憶體使用是否出現峰值,並且確實在交換圖的適當時間出現了峰值:
但是,記憶體圖上沒有峰值(儘管交換似乎確實略有上升):
我重新啟動了伺服器,從那以後它一直執行良好。我檢查了 Apache 訪問和錯誤日誌,沒有發現任何可疑之處。伺服器重新啟動之前 syslog 中的最後一個條目是 IMAP 守護程序的錯誤,並且似乎不相關:
Oct 28 18:30:35 hostname imapd: TIMEOUT, user=user@xxxxxxxxxxxxx.com, ip=[::ffff:XX.XX.XX.XX], headers=0, body=0, rcvd=195, sent=680, time=1803 # all of the startup logs below here Oct 28 18:40:33 hostname kernel: imklog 5.8.1, log source = /proc/kmsg started.
我嘗試檢查 dmesg 但也沒有發現任何可疑之處。最後幾行:
VFS:在設備 202:0 上以只讀方式掛載根(ext3 文件系統)。 devtmpfs:已安裝 釋放未使用的核心記憶體:釋放 412k 防寫核心文本:5704k 防寫核心只讀數據:1384k NX-保護核心數據:3512k init:無法生成控制台設置主程序:無法執行:沒有這樣的文件或目錄 udevd[1040]:開始版本 173 在 /dev/xvdb 上添加 524284k 交換。優先級:-1 範圍:1 跨:524284k SS init: udev-fallback-graphics 主程序 (1979) 以狀態 1 終止 init:普利茅斯主程序(1002)被 SEGV 信號殺死 init: plymouth-splash 主程序 (1983) 以狀態 2 終止 EXT3-fs (xvda):使用內部日誌 init: plymouth-log 主程序 (2017) 以狀態 1 終止 init: plymouth-upstart-bridge 主程序 (2143) 以狀態 1 終止 init: ssh 主程序 (2042) 以狀態 255 終止 init:故障安全主程序(2018)被 TERM 信號殺死 init: apport 預啟動程序 (2363) 以狀態 1 終止 init: apport post-stop 程序 (2371) 以狀態 1 終止
我嘗試用Google搜尋錯誤消息(
kernel BUG at mm/swapfile.c:2527!
)並找到了一些與 Xen 相關的主題(Linode 使用 Xen):
- Xen-devel 回复:mm/swapfile.c:2527 處的核心錯誤!是 3.0.0 Xen - Xen 源
- 郵件列表存檔:回复:回复:mm/swapfile.c:2527 處的核心錯誤!是 3.0.0 Xen pv guest - BUG:無法處理
但是,我發現的所有資訊似乎都沒有指向任何解決方案。我將升級到 Linode 提供的最新核心(從
2.6.39.1-linode34
到3.0.4-linode38
)。我現在還能做些什麼來診斷這個問題,或者將來如果它再次發生的話?有什麼我錯過的嗎?是否有人對可能引發此問題的原因有任何想法?
如果我可以提供任何其他資訊,請告訴我。萬分感謝。
該問題與 Xen 中的錯誤有關(在問題中提到)。更新到最新版本的核心 (
3.0.4-linode38
) 解決了這些問題(伺服器反复崩潰,直到我更改了核心版本)。這些問題似乎不是由於記憶體不足引起的,而是由於核心對記憶體管理不善(或 Xen 中的一些錯誤)。
您是在重新啟動系統之前還是之後拉出 Munin 圖?如果之後,空白部分之後的部分可能在您重新啟動之後,並且無關緊要。我猜是之後,因為您的交換使用量急劇下降……
在您的問題中,您忽略了空白部分…您說“該圖未顯示記憶體使用量上升”,但它們真正顯示的是在記憶體可能上升期間沒有數據。munin 是一個很棒的工具,但它在報告這樣的實例方面很糟糕,因為它只每 5 分鐘報告一次資訊,如果系統繁忙,它可能根本不會報告任何內容。
您是否對可以執行的 Apache 實例數量進行了記憶體計算?我的意思是執行“ps awwlx –sort=rss | grep apache”並查看每個 Apache 實例使用了多少記憶體。例如:
root@theobromine:~# ps awwlx --sort=rss | grep apache 0 0 18497 18485 20 0 1788 528 - S+ pts/0 0:00 grep apache 5 33 18458 5384 20 0 28468 6700 - S ? 0:00 /usr/sbin/apache2 -k start 5 33 18470 5384 20 0 28468 6700 - S ? 0:00 /usr/sbin/apache2 -k start 5 33 18480 5384 20 0 28468 6700 - S ? 0:00 /usr/sbin/apache2 -k start 5 33 18481 5384 20 0 28468 6700 - S ? 0:00 /usr/sbin/apache2 -k start 5 33 18457 5384 20 0 28468 6708 - S ? 0:00 /usr/sbin/apache2 -k start 5 0 5384 1 20 0 28336 11796 - Ss ? 0:16 /usr/sbin/apache2 -k start
這是我們正在查看的第 8 列。在這種情況下,每個實例使用 6.7MB,這實際上相當小。但現在我看看我有多少記憶體:
root@theobromine:~# free total used free shared buffers cached Mem: 775196 643848 131348 0 77964 268788 -/+ buffers/cache: 297096 478100 Swap: 1148636 3368 1145268
所以我有 800MB 的 RAM……現在,我可以算一算,說在最好的情況下我可以執行 800/6.7 = 119 個 Apache 實例。但這不會為任何其他應用程序或作業系統或記憶體等留下任何空間……
但實際上你最多有 478MB(“免費”下的第二列),減去目前執行的 Apache 的數量(6.7*6——我上面只執行了 6 個 Apache 實例),剩下大約 520MB 的 RAM(如果你沒有記憶體,當然)。所以我真正可以執行的最大值更像是 77 個實例。
那麼我實際執行了多少?
root@theobromine:~# grep MaxClients /etc/apache2/apache2.conf # MaxClients: maximum number of server processes allowed to start MaxClients 150 # MaxClients: maximum number of simultaneous client connections MaxClients 150
啊,Apache 並沒有限制我使用更少的記憶體。因此,如果超過 77 個客戶端同時連接到我的 Web 伺服器,我可能會開始崩潰。
我經常看到這種情況:“我需要能夠同時處理 500 個 Web 連接。” 但是你看看他們的 Apache 實例,他們正在使用 60MB(不是一個非常大的大小),但是當你說他們需要將他們的 VPS 升級到 32BG 的 RAM 時,他們嚇壞了。:-)