簡體   English   中英

Linux內存使用歷史

[英]Linux memory usage history

我有一個問題,我的服務器開始失敗一些正常的進程和檢查,因為服務器的內存已經完全充滿並被采用。

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

我使用“top”命令來查看現在占用最多內存的進程(在問題修復之后)並且它是一個Java進程。 所以從本質上講,我可以說出現在哪些進程占用了大部分內存。

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

@Andy已經回答了你的問題。 但是,我想補充一點,以便將來參考使用監控工具。 這樣的東西。 這些將為您提供崩潰期間發生的事情,因為您顯然無法一直監控所有服務器。 希望能幫助到你。

你是說內核OOM殺手熄滅了嗎? 登錄dmesg說什么? 請注意,您可以約束JVM以使用固定的堆大小,這意味着它在完整時將肯定地失敗而不是讓內核殺死其他內容。 但是你的問題的一般答案是否定的:在OOM失敗時無法可靠地運行任何東西 ,因為系統內存不足! 充其量,您可以使用單獨的進程輪詢進程表並記錄進程大小以捕獲內存泄漏情況等...

默認情況下,linux中沒有內存使用歷史記錄,但您可以使用一些簡單的命令行工具(如sar

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

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

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

這將禁止過度使用,並使OOM殺手的可能性非常低。 您還可以考慮添加一點交換空間(如果您還沒有),並將vm.swappiness設置為某個非常低的值(例如5 ,默認值為60 ),因此在正常的工作流程中你的應用程序不會進入交換,但如果你的內存真的很短,它會暫時開始使用它,你甚至可以用df看到它

警告如果您的服務器因內存過載,這可能導致進程收到“無法分配內存”錯誤。 在這種情況下:

  1. 嘗試限制應用程序的內存使用量
  2. 將它們的一部分移動到另一台機器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM