Linux

我的 VPS 崩潰了,我不知道為什麼

  • October 30, 2011

我現在有一個帶有 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):

但是,我發現的所有資訊似乎都沒有指向任何解決方案。我將升級到 Linode 提供的最新核心(從2.6.39.1-linode343.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 時,他們嚇壞了。:-)

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