檔案傳輸時因磁碟 I/O 引起的 OOM Killer

2 min

language: ja bn de en es fr hi ko pt ru zh-cn zh-tw

大家好,我是無能。

在新家便宜地組裝了家用伺服器後,已經過了幾天。一個我一直以來隨意關注的問題,即使在記憶體充足的情況下也發生了。

發生了什麼事?

我的目前環境有點特殊,或者說,記憶體容量是 16GB + 8GB 這種不完整的配置,但請理解我是用剩餘零件組裝的。

儘管如此,總共 24GB 的 RAM 在現在可能很常見,但我個人認為這已經是相當充裕的狀態了,所以我以為不會發生 OOM,結果卻發生了像 Linux 核心「責罵」一樣的 OOM 事件。

應用程式也只有 Apache、php-fpm、Redis 等,它們各自佔用的記憶體量微不足道...

為檔案傳輸傷腦筋

當我嘗試從還放在老家的家用伺服器透過 scp 傳輸檔案,或者為了儲存一定數量的映像檔而使用 aria2c 批次儲存到 2TB 的 HDD 時,就發生了這個問題。

那麼,為什麼僅僅是這個寫入處理就會導致 OOM 呢?這是因為檔案會先被記憶體接收,然後才寫入儲存區域,所以為了加速,需要先由記憶體作為快取來接收。

據說,當使用scp -r傳輸數百 GB 級別的檔案,並且這些檔案涉及隨機 I/O 處理時,真的會消耗大量資源。

而且,這不屬於單一程序記憶體使用,所以即使透過 top 檢查也無法在單一程序中看到,這純粹是 Linux 核心層面的問題,因此很難找出具體原因。

簡而言之,似乎是因為 I/O 等待導致暫時儲存在記憶體中的資料量無法跟上寫入速度,最終導致資源逐漸耗盡。

可修改的核心參數

作為核心可以做的事情,似乎可以設定快取多少等,我嘗試調整了一下,但感覺效果不大。

2.2. VFS 調優選項:研究與實驗 Red Hat 產品文件
更改 Linux 頁面快取設定以優化寫入 I/O 的筆記 - YOMON8.NET

現象上與這個人遇到的情況相似。

OOM Killer invoked due to slow disk I/O - #17 by Whis-key - troubleshooting - Storj Community Forum (official)
好久沒看到 Storj 這個詞了... 我的免費額度好像被擅自刪除了...

沒想到,僅僅是寫入 HDD 就會導致記憶體耗盡,真是令人頭疼...
這也與關於記憶體常說的「Linux 對 RAM 樂觀,Windows 對 RAM 悲觀」有關。雖然我理解其意圖是充分利用記憶體以提高效能,但我還是希望能找到方法來解決這個因 I/O 等待而產生的問題。

Related Posts