我可以以某種方式區分交換抖動和非交換高 IO 延遲嗎?
每次我複製 VM 映像時,我的系統都會變得非常、非常少響應。我正在使用
virt-manager
,我可以看到 IO 是由多個qemu-img convert
執行緒執行的。我試圖收集一些資訊,看起來可能有很多交換(交換分區上的 I/O)。我有 8GB 記憶體和 2GB 交換空間。在複製期間和之後,
free -h
顯示已使用 100% 的交換空間。但是,這並不能告訴我當時系統交換了多少。在我複製 VM 之前,某些東西可能已經填充了交換。我正在使用機械硬碟。我目前的作業系統是 Fedora Linux 28。
當這種情況發生時,我該如何準備,收集相關資訊,看看是否有很多交換?
我想要一些我可以回顧並整理不同資訊的記錄。即,如果我執行一個簡單的
top
或iotop
命令,他們將覆蓋他們的舊輸出,我不希望這樣。更新
正如我在原始答案中所建議的那樣,我仍然認為收集這樣的資訊很有用。但:
我發現我的系統幾乎完全沒有響應的兩個最大原因。它們都與顛簸無關(交換或非交換)。
首先在
gnome-shell
. 它在主執行緒中等待 fsync()。這是(Wayland)圖形伺服器的主執行緒。在等待期間,顯示不會更新。該錯誤在 gnome-shell 3.30.2 中被觀察到,並且應該在 3.32 版本中得到修復。(可以通過將 GNOME 的 Wayland 會話與 Xorg 會話進行比較來診斷這一點。在 Xorg 會話中,滑鼠游標應該仍然能夠移動)。
第二個問題是 ext4 的一個已知問題。在寫入文件時,其他文件上的 fsync() 可能“最終等待無限時間”。所以這會影響 gnome-shell 錯誤。
即使修復了 gnome-shell,ext4 中的長時間延遲似乎也會影響 Firefox。上述 ext4 問題的修復已合併到 Linux 核心版本 5.3。$$ 1 $$$$ 2 $$.
血淋淋的細節記錄在這裡:簡單的文件複製(或寫入)在 Linux 文件系統上導致十秒以上的延遲
vmstat
是跟踪記憶體、交換和 IO 的傳統 Linux 命令。例如vmstat 5
,將每 5 秒列印一行統計資訊。
atop
是一個較新的工具,非常強大。執行atop
看起來類似於top
,但它包含更多資訊。當你想要一個日誌時,atop -w <file>
將改為寫一個二進制日誌,可以用atop -r <file>
. 該atop
軟體包還包括一項自動寫入日誌的服務,使用 10 分鐘間隔(預設情況下)。更新:
atop
2.4.0 增加了對 Linux Pressure Stall Information的支持。我希望這將有助於檢測由於記憶體壓力導致的停頓。記憶體壓力統計(顯示為ms
或mf
)atop
可以檢測交換和非交換抖動。從技術上講,這意味著它無助於區分交換和非交換抖動:-)。但我很想知道這些資訊。我沒有太多確認顛簸是我的問題……而且在更新中證明,顛簸實際上不是主要問題。關於我遇到的主要問題:我認為收集這方面的資訊更加困難。有一種通用的跟踪方法可能會有所幫助:
offcputime --state 2
. 儘管安裝此工具需要一些努力。上一個答案
我已經
atop
安裝了一個解決方法,可以在我將筆記型電腦掛起一夜之間使其正常工作。
atop
如果您長期存在記憶體消耗問題,該服務的日誌可以提供非常豐富的資訊。它可能會錯過較短的問題(由於預設的 10 分鐘記錄間隔)。
- 我的問題看起來持續了 10-20 分鐘。
- 交換使用量從之前樣本中的 1.4G 上升到 2G (100%)。
- 執行緒本身在 RAM 中的
qemu-img
大小並不大。該qemu-img
程序只有 2500 萬駐留。swout
是175735
。這是以 4096 字節的頁面來衡量的,這意味著大約 0.7G 被換出。同時,
cache
從0.8G增長到2.3G。free
記憶體保持在0.1G。我懷疑 qemu-img 正在做記憶體 IO,記憶體正在推出其他記憶體,這就是導致交換的原因。如果我沒有交換空間,我預計還會有一些問題;即載入的程式碼和其他記憶體將被逐出。
如果我
drop_caches
再cp
一個16G的文件,我可以觸發相當多的交換。我認為同樣的問題正在被複製cp
;我不認為這僅限於qemu-img convert
.