檔案傳輸時因磁碟 I/O 引起的 OOM Killer
大家好,我是無能。
在新家便宜地組裝了家用伺服器後,已經過了幾天。一個我一直以來隨意關注的問題,即使在記憶體充足的情況下也發生了。
發生了什麼事?
我的目前環境有點特殊,或者說,記憶體容量是 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 等待而產生的問題。