問題
我最近在配備 i7-6820HQ、32GB RAM 和 512GB Micron 1100 SSD 的 Lenovo T460p 上安裝了 Ubuntu 16.04 LTS(核心 4.8.0-52)。我在安裝過程中選取了全碟加密方塊並使用了預設的分割區佈局。總的來說,性能很棒。
然而,隨著時間的推移,我的建置開始運行的時間大約是原來的兩倍。此外,在寫入大檔案的建置部分期間,任何需要磁碟 I/O 的(非建置)任務最終都會等待很長時間。這包括啟動新程式、在 Firefox 中載入頁面等。但如果我點擊一個鏈接,整個用戶界面就會鎖定,直到事情平靜下來。
總而言之,在一段時間之後,構建突然需要更長的時間,並且在構建過程中的某些時刻計算機基本上無法使用。
我可以做什麼來嘗試診斷或解決此問題?
故障排除訊息
不要經常重新啟動,因此在我遇到此問題之前系統通常會運行幾天。一旦我擊中它,我就會嘗試找出問題所在,然後重新啟動,以便我可以繼續工作。
解決該問題的唯一方法是重新啟動機器。我嘗試退出所有應用程序,註銷並重新登錄,並刪除緩衝區快取(連枷理論,因為它使用內存空間,磁碟同步發生得更頻繁),但只有重新啟動才有效。
作為一個遠景,我嘗試了解決方案這個答案但行為沒有改變。
每當我遇到問題時,運行
iotop
都會顯示線程使用 99% I/O。dmcrypt_write
當我不是遇到這個問題時,我還看到dmcrypt_write
以相對較高的 IO % 彈出到頂部,但它不會在那裡停留很長時間。如果我
dd if=/dev/urandom of=$HOME/bigfile bs=10k count=200k; sync
在一切正常工作時運行,dmcrypt_write
將會跳到頂部一兩秒,但它的持續時間與我的一個構建期間的持續時間相差甚遠。完整建置會產生約 1.4 GB 的資料。這是一個包含多個模組的 Java 專案。因此,會建立許多小檔案以及一些聚合所有這些小檔案的較大 JAR 檔案。
始終有足夠的可用內存,並且交換分區未被使用。
我的同事使用類似的計算機 (T460p) 也運行 Ubuntu,但沒有遇到此問題。他們似乎都有不同的不過,SSD 品牌/型號。
更新
這個問題又出現了,所以我根據這個問題的回覆做了一些更多的測試。
- 文件系統仍未使用該
discard
選項安裝,因此我運行假設這與啟用該選項fstrim
有點相似discard
- 當問題第一次發生時,我沒有做足夠的計時,但運行後
fstrim
,構建速度似乎恢復正常...但建置完成後,dmcrypt_write
線程啟動並使系統在一段時間內無法使用。建置系統以及系統變得可用的所有總時間似乎與以前大致相同。 - 我更改
/proc/sys/vm/dirty_ratio
為 2 和/proc/sys/vm/dirty_background_ratio
1 並運行了一些建置。建置花費的時間比正常情況要長,與我上次遇到此問題時的時間大致相同,但係統似乎沒有那麼多鎖定。將其更改回 20 和 10 會恢復到上述行為。 - 在乾淨啟動時,我嘗試設定
/proc/sys/vm/dirty_ratio
為 2 和/proc/sys/vm/dirty_background_ratio
1,時間與 20 和 10 相當。
答案1
我在 Debian 10+11 上遇到了類似的問題,如果我在 LUKS 磁碟上進行大量寫入操作,我的整個系統會凍結一段時間,然後再次回應,然後再次凍結...
不過我不用重新啟動 - 只需等到寫入作業完成即可。
正如 ScumCoder 所寫,有一個可用的修復程序。從核心 5.9 開始,該修復已整合到核心中。
以下命令為我解決了這個問題:
cryptsetup --allow-discards --perf-no_read_workqueue --perf-no_write_workqueue --persistent refresh nvme0n1p3_crypt
我使用命令提取了我的磁碟名稱“nvme0n1p3_crypt”dmsetup table
修復後我的寫作速度快了很多。
答案2
我和你有完全相同的問題,快速研究顯示了這篇文章:
https://blog.cloudflare.com/speeding-up-linux-disk-加密
CloudFlare 員工對 Linux 原始碼進行了大量挖掘,得出的結論是罪魁禍首是目前的dmcrypt
實作。他基本上是透過重寫內核的相應部分來解決這個問題的。
因此,據我所知,擺脫速度緩慢的唯一兩種方法是(1)編譯他的內核版本,或(2)偶爾重新啟動一次(正如您所說)。我選擇了後者。
答案3
不具體了解LUKS,但對於SSD 上的一般IO 問題,請確保您的fs 掛載啟用了丟棄,即grep Discard /proc/mounts 也可能會嘗試(以root 身份)“echo 1 >> /proc/sys / vm/dirty_background_ratio; echo 2 >> /proc/sys/vm/dirty_ratio",這將使系統在待寫出的資料較少時更快地啟動 IO。