我有一台 Ubuntu 9.10 64 位元伺服器,它似乎耗盡了所有可用記憶體。根據我的 munin 圖表,幾乎所有用完的記憶體都在交換快取、快取和板緩存中。 (我認為這意味著虛擬記憶體緩存,我的假設正確嗎?)
一旦記憶體使用率接近 100%,某些(儘管不是全部)系統服務(例如 SSH)就會變得緩慢且無響應。重新啟動系統後,效能和記憶體使用情況暫時恢復正常。
一些有趣的花絮:
- 該系統運行 Apache 2、MySQL、Munin 和 sshd。
- 記憶體使用量峰值會在每天晚上的同一時間發生(晚上 10 點整)。
- 任何用戶的 crontab 中似乎都沒有任何內容,/etc/cron.d/* 中也沒有任何異常情況,更不用說晚上 10 點會發生的事情了。
我的問題是,如何找出導致記憶體不足的原因?我已經嘗試過常用的實用程式(例如 ps、top 等),但我似乎找不到任何不尋常的東西。
有任何想法嗎?先致謝!
答案1
你確定這和記憶體有關嗎?快取不應該佔用所有記憶體;它們是臨時的、動態的,並在需要活動記憶體時重新分配。快取只是為了加快速度並利用否則會浪費的記憶體。
我可能會看看是否有其他東西使系統陷入困境。使用 Top 時,您是否看到系統負載很高?與「正常」時期相比,那些時期的情況如何?您是否將 top 排序為 CPU 使用率和活動記憶體使用率?
您是否嘗試運行 iotop 來查看磁碟 I/O 並查看是否有東西正在敲擊驅動器?
所有的 crontab 是什麼樣的呢?
您是否在白天對 ps 進行了多次快照並在 10:00 左右進行比較,看看出現了哪些進程?
從長遠來看,使用 netstat 進行網路連線怎麼樣?當時系統進出有什麼異常狀況嗎?
聽起來它可能正在重建或索引系統資料庫,如“定位”,但它不應該減慢系統的速度以停止這樣做。
答案2
記憶力的使用和行動遲緩是同一個問題的症狀。當時發生的一些事情導致系統的磁碟快取崩潰。系統使用每一滴記憶體來避免過多的磁碟 I/O,但仍然失敗。
當大量磁碟讀取發生在最近未讀取的磁碟區域時,這種情況最為常見。最近使用的、可能再次使用的資料被從快取中推出,當需要讀回時,它必須與現有的讀取流競爭。
檢查是否存在執行大量磁碟 I/O 的進程。例如,updatedb
或某種備份腳本。如果事實證明它是一個自製工具,那麼將其更改為繞過磁碟快取可能會有所幫助,這樣它就不會強制其他內容脫離快取。它可能會有所幫助ionice
,因此不會對時間敏感的讀取造成太大影響。