2012-10-24 75 views
7

我遇到了一個問題,在這個問題中,我的服務器開始因爲服務器的內存已滿並被佔用而開始出現一些正常進程失敗並進行檢查。Linux內存使用記錄

我查看了日誌記錄,發現它殺死了一些Java進程。

我使用「top」命令來查看哪些進程正在佔用最多的內存(修復問題之後),這是一個Java進程。所以實質上,我可以告訴哪些進程正在佔用最多的內存。

我想知道的是,如果有一種方法可以查看當故障發生時哪些進程佔用了最多內存?也許Linux會在特定時間跟蹤或記錄內存使用情況?我真的不知道,但如果我能看到那種細節,那將是非常棒的。

回答

2

你是說內核OOM殺手熄滅了嗎? dmesg中的日誌是什麼意思?請注意,您可以將JVM限制爲使用固定的堆大小,這意味着在滿的時候它會失敗,而不是讓內核殺死其他東西。但是你的問題的一般答案是否定的:在OOM失敗時,無法可靠地運行任何東西,因爲系統內存不足!充其量,您可以使用一個單獨的進程來輪詢進程表和記錄進程大小,以捕捉內存泄漏條件等...

+0

FWIW,你可以在一個使用mlockall用於()或類似的製作過程相對可靠記憶緊縮。 EG:http://stromberg.dnsalias.org/~strombrg/fallback-reboot/ – user1277476

+0

只適用於非常有限的應用。任何系統調用都可能由於內核中的分配失敗而失敗。產生外部過程是不可能的。由於緩衝區耗盡,文件系統I/O可能無限期地掛起。確實,這不是不可能的,但必須非常謹慎地完成。 –

3

@Andy回答了您的問題。不過,我想補充一點,以備將來參考使用監測工具。類似於these。這些會給你在崩潰期間發生的事情,因爲你顯然無法一直監控你所有的服務器。希望能幫助到你。

0

在linux中沒有內存使用的歷史記錄是默認的,但你可以用一些簡單的命令行工具來實現它,如sar

關於你的內存問題: 如果是在機器上做了一些混亂的OOM殺手,那麼你有一個很好的選擇,以確保它不會再發生(當然在減少JVM堆大小後)。

默認情況下,linux內核分配的內存比實際內存多。在某些情況下,如果沒有內核任務的內存,這可能會導致OOM殺手殺死大多數內存消耗的進程。 此行爲由vm.overcommit sysctl參數控制。

因此,您可以嘗試將其設置爲vm.overcommit = 2sysctl.conf,然後運行sysctl -p

這將禁止overcommiting和使OOM殺手做可怕的事情很低的可能性。你也可以考慮添加一點點的交換空間(如果你還沒有),並且設置vm.swappiness的值很低(例如5,默認值爲60),所以在正常的工作流程中你的應用程序將不進入交換,但如果你會在記憶真的很短,它會開始臨時使用它,你就可以看到它甚至df

警告這可能會導致接收「無法處理分配內存「錯誤,如果您的服務器由內存過載。在這種情況下:

  1. 試圖限制由應用程序的內存使用他們的
  2. 移動部分到另一臺機器