如何在 Linux 中找到記憶體洩漏?
我有一個數字海滴。最近我將它與另一個結合起來,現在系統將隨機(每隔幾天)完全最大化 CPU 使用率(對於單個使用者,而不是系統),它會拋出一堆“記憶體不足”錯誤。我無法使用 top 找出導致問題的過程,因為它是隨機發生的。
為了嘗試解決這個問題,我最近將可用記憶體和 CPU 能力提高了四倍。問題消失了大約一個月,現在又發生了,比以前更頻繁。
我不知道它什麼時候會罷工。當它發生時,它會鎖定整個系統,我必須硬重啟。我檢查了 /var/log/messages,我看到了來自 php、mysqld、spamd 和其他一些東西的一堆“記憶體不足”錯誤。我如何確定是哪個使用者導致了問題,更具體地說,我如何找出解決問題的方法?
就上下文而言,它是一個安裝了 cpanel 的正常網路託管系統。
閱讀 OOM 消息。它將列印出當時的記憶體使用詳細資訊和被殺死的 PID。該任務不一定是根本原因,它只是當時的核心看起來很大。
查看 /proc/meminfo 並使用 top 查看程序。您應該大致了解系統的記憶體大小。假設一個 4 GB 的實例打算將 2 GB 用於 DB 共享記憶體,1 GB 用於 Web 伺服器程序,1 GB 用於作業系統和管理工具。這些類別中的任何一個超過他們的估計都會導致記憶體壓力。
使用 cgroup 記帳精確測量每個服務的記憶體使用情況。容器可以做到這一點,儘管您沒有說您正在使用容器。
systemd 切片也使用 cgroups,如果那是您的服務管理器。設置 DefaultMemoryAccounting=yes並查看 systemd-cgtop 的輸出。嘗試使用netdata 的 cgroups 外掛等工具進行 cgroup 感知監控。一旦你知道它們應該是什麼,就在單元上設置資源限制。