Linux 運作緩慢,剩餘交換空間為 0

Linux 運作緩慢,剩餘交換空間為 0

我們的 Linux 伺服器回應速度非常慢。top沒有顯示任何過多的 CPU 使用率。我注意到,儘管有大約 5GB 的可用內存,但係統正在使用所有交換區,沒有剩餘的可用交換區。這可能是系統運作緩慢的原因嗎?除了減少進程數還有什麼解決方法嗎?

其次,即使有可用的空閒內存,為什麼 Linux 已經進行了交換?我認為只有當沒有實際記憶體剩餘時才使用交換。

free -m
             total       used       free     shared    buffers     cached
Mem:         32045      26218       5826          0        127        123
-/+ buffers/cache:      25967       6077
Swap:        16387      16387          0

更新:

  • 交換性處於預設等級:60
  • 我不認為這是一個 numa 系統
  • 我看到幾個 java 進程在 8GB 堆上運行:-Xms8000m -Xmx8000m

乍看之下似乎很瘋狂,但可能有人這樣做是有原因的。我認為這就是消耗大部分交換空間的原因,但我需要進一步研究 java 堆如何影響 Linux 交換空間和記憶體/效能。任何有關上述 java 堆配置對系統效能影響的指示都會非常有幫助。

答案1

使用 8GB 堆初始化了多少個 Java 進程?也許將最大值保持在 8 並降低初始堆大小。如果您有磁碟空間,也可以嘗試增加交換大小

答案2

你有tmpfs坐騎嗎?這些由交換備份,可能是可用交換空間為零的原因。做出syslogdmesg表現出任何意想不到的事情?您確定您的系統不會經常交換嗎?檢查vmstat -SK 1並驗證列siso(交換頁面進出,以 KB/s 為單位)。如果您需要知道哪些進程正在交換,請執行sudo iotop -od5。如果您執行的是 Ubuntu,則需要delayacct核心標誌才能獲得完整的統計資料。對我來說,對於如此大的系統內存,您的系統似乎具有非常小的快取和緩衝區。

交換用於提高整個系統的效能。例如,交換目前正在休眠的大型程式的部分內容,以允許將更多記憶體用於磁碟快取或檔案緩衝區。如果在這種情況下停用交換,系統實際上將擁有更小的磁碟快取和檔案緩衝區。由於您的交換空間已滿,因此您可能會遇到相同的問題。

如果您有任何「洩漏」記憶體的程式(即程式取得未真正使用的記憶體區塊),則交換空間尤其重要。這樣的「洩漏」可能不是程式中的錯誤,可能只是發生了記憶體很少使用的情況,因此最好將其視為洩漏。如果沒有交換空間,此類洩漏的記憶體就無法用作快取或緩衝區。

具有虛擬記憶體的正確運行的作業系統幾乎總是使用交換,除非整個工作集(所有存取的檔案、應用程式保留的所有記憶體以及所有寫入緩衝區)在系統的整個運行時完全適合記憶體。在大多數情況下,只有當系統不斷重新啟動或系統具有相對於整個檔案系統大小而言大量的 RAM 時,才會發生這種情況。

相關內容