Linux 頁面快取會減慢具有 64GB RAM 的雙 CPU 伺服器上的 IO

Linux 頁面快取會減慢具有 64GB RAM 的雙 CPU 伺服器上的 IO

我的 Linux 頁面快取存在嚴重問題,它會減慢 IO 速度。例如,如果我使用 dd 複製 lvm 分區,linux 會將資料緩存在緩衝區或快取中(free –m)。這不是問題,但在緩衝區達到特殊值後,複製過程會停止並減慢到幾個 mbs 甚至 kbs。我已經對寫入磁碟或 /dev/null 進行了許多測試,問題與來源磁碟機或目標磁碟機無關。

詳細地:

  • 有兩個幾乎相同的伺服器。兩者都運行具有相同核心的 CentOS 6.5。它們具有相同的磁碟、相同的設定、相同的其他硬件,在所有方面都相同。唯一的區別是一台伺服器有 2 個 CPU 和 64 GB 內存,另一台伺服器有 1 個 CPU 和 32 GB 記憶體。
  • 這也是以下複製過程的圖像:https://i.stack.imgur.com/tYlym.jpg
  • 這裡有一個新版本也帶有 meminfo。 meminfo 來自不同的運行,因此值不相同,但行為完全相同:https://i.stack.imgur.com/4SIJG.jpg
  • 使用 dd 或其他檔案系統複製程式開始複製。
  • 緩衝區或快取開始填滿。一切皆好。
  • 緩衝區或快取達到最大數量(在 64GB RAM 伺服器上,值為 32GB 或 17GB;在 32GB RAM 伺服器上為所有可用記憶體)
  • 在 64GB RAM 伺服器上,複製過程現在停止或僅限於幾個 mbs。在 32GB RAM 伺服器上一切都很好。
  • 在 64GB RAM 伺服器上,我可以透過使用「sync; echo 3 > /proc/sys/vm/drop_caches」強制快取來暫時解決該問題。但當然,緩衝區立即再次開始成長,問題再次出現。

結論:

該問題要么與第二個 cpu 有關,要么與內存總量有關。我「感覺」問題可能在於,每個 cpu 都有自己的 32GB 內存,並且複製進程僅在 cpu 上運行。所以最後複製過程將緩衝區/高速緩存增加到近32GB或其他CPU未使用的內存,然後linux認為嘿還有內存所以讓我們進一步增加緩衝區但下面的硬體無法訪問內存,或者其他什麼像那樣。

有人有想法或解決方案嗎?當然,我可以使用 dd 和 direct 標誌,但這並不能解決問題,因為還可以透過 samba 等進行外部存取。

編輯1:

這裡還有來自 64GB RAM 伺服器的 /proc/zoneinfo: 1.http://pastebin.com/uSnpQbeD(dd 開始之前) 2.http://pastebin.com/18YVTfdb(當 dd 停止工作時)

編輯2:

  • 虛擬機器設定:http://pastebin.com/U9E9KkFS
  • /proc/sys/vm/zone_reclaim_mode 位於 32 GB ram 伺服器 0 和 64 GB ram 伺服器 1 上。安裝程式設定了這些。我將其臨時更改為 0 並重試測試。現在所有記憶體都用於緩衝區和快取。所以它看起來很棒並且就像其他伺服器一樣。但隨後它立即開始全速交換...我將交換度設為 0。並且它每秒都會增加緩衝區。所以它不交換緩衝區,而是交換虛擬機器的記憶體以獲得更多記憶體來增加緩衝區......太瘋狂了。但也許這很正常!

編輯3:

/proc/buddyinfo 和 numactl --hardware: http://pastebin.com/0PmXxxin

最後結果

  • /proc/sys/vm/zone_reclaim_mode 肯定是技術上正確的方式,但是機器在使用之後並沒有很好地工作。例如:如果我複製一個磁碟,linux 現在使用 100% 的空閒記憶體來緩衝(而不是像以前那樣只有 XGB 然後停止)。但在最後一個空閒記憶體被用於緩衝的那一刻,linux開始交換虛擬機器記憶體並增加緩衝區和快取的總量。我的系統通常不需要交換,因此交換記憶體與某些虛擬機器位於同一磁碟上。結果,如果對這些虛擬機器進行備份,Linux 會在我從磁碟讀取備份的同時寫入交換。所以交換虛擬機是不好的,但更糟的是linux破壞了我的備份讀取速度...所以將/proc/sys/vm/zone_reclaim_mode設為0並不能解決完整的問題...目前我運行在篩選一個每 ​​10 秒同步並刷新快取的腳本...不太好,但對我來說效果更好。我的系統上沒有網路伺服器或普通檔案伺服器。我只運行虛擬機,透過 samba 進行備份和儲存備份。我不喜歡這個解決方案。

答案1

您看到的行為是由於 Linux 在 NUMA 系統上分配記憶體的方式造成的。

我假設(不知道)32GB 系統是非 numa,或 numa 不足以讓 Linux 關心。

如何處理 numa 的行為由選項決定/proc/sys/vm/zone_reclaim_mode。預設情況下,linux 將偵測您是否使用 numa 系統,並在認為可以提供更好的效能時變更回收標誌。

記憶體被分成多個區域,在numa系統中,第一個CPU插槽有一個區域,第二個CPU插槽有一個區域。這些出現為node0node1。如果你養貓,你就能看到它們/proc/buddyinfo

當區域回收模式設定為 1 時,從第一個 CPU 插槽分配將導致與該 CPU 關聯的記憶體區域發生回收,這是因為從本地 numa 節點回收在效能方面更有效。從這個意義上說,回收是指刪除頁面,例如清除快取或交換該節點上的內容。

將該值設為 0 會導致在區域填滿時不會發生回收,而是將記憶體分配到外部 numa 區域。這是以另一個 CPU 的短暫鎖定為代價的,以獲得對該記憶體區域的獨佔存取。

但隨後它立即開始交換!幾秒鐘後:內存:總共 66004536k,已用 65733796k,空閒 270740k,34250384k 緩衝區 交換:總共 10239992k,已用 1178820k,空閒時間 9061738k

交換行為以及何時交換由幾個因素決定,其中之一是已分配給應用程式的頁面的活躍程度。如果它們不是很活躍,它們將被交換以支援快取中發生的更繁忙的工作。我假設您的虛擬機器中的頁面不會經常被啟動。

相關內容