Linux-Kernel
哪個程序(核心執行緒)正在為 zswap 進行實際壓縮?
我可以想像實際上有兩個位置:
- 在屬於正在換入/換出 ram 的程序的核心空間中
- 從
[kswapd0]
但是,深入研究 kswapd 原始碼 (
mm/vmscan.c
,init/main.c
),我可以發現:kswapd 是單執行緒的,並且是在單執行緒上啟動的。(NUMA 系統除外,所有記憶體區域都有不同的 kswapd。但大多數普通 PC 都不是 NUMA 系統。)但是,從現在開始,我們有一個問題。我們可以假設,磁碟比記憶體慢得多,這就是我們不需要多執行緒 kswapd 來處理磁碟 I/O 的原因。但如果我們還需要使用內部 zswap 層,情況就不是這樣了。特別是從更高的壓縮率(放氣)中,cpu 可以並且很可能會成為瓶頸。
但是kswapd 是單執行緒的。
這是真的嗎?
是否計劃進行任何多執行緒 kswapd?真的需要嗎?
Ps 我在 linux 核心郵件列表中找到了這個執行緒。這是關於一個被拒絕的更新檔建議,什麼可以在非 NUMA 系統上啟用多執行緒 kswapd。他們在談論一切,除了這個 zswap 問題。也許是無關的。
PS2。語境:
- 我有一個高度 ram 過度使用的 Linux 系統(程序使用的 ram 比物理上可用的多得多)。
- 同時執行的程序數遠低於 CPU 核心數。
- 我正在大量使用 zswap。
- 在這種環境下,將所有可用的 CPU 核心用於壓縮/解壓縮記憶體頁面將非常有用。我目前最好的估計是頁面壓縮/解壓縮由
[kswapd0]
單個核心執行緒完成。我正在研究利用所有 CPU 核心進行壓縮/解壓縮的選項。從本質上講,這將是一種轉換剩餘 CPU 容量以彌補物理記憶體不足的方法。
經過大量調查,我想我找到了答案。
實際的壓縮是在
[kswapd]
.引用執行緒中拒絕郵件的作者表明,負責人至少有一些原因他沒有溝通,但更有可能他根本不知道來自 zswap。
我在我的系統上安裝了更新檔建議。它使
kswapd
多執行緒,即它可以壓縮所有 CPU 核心上的記憶體。該更新檔的作用就像魅力一樣,並顯著改善了 zswap-ping 環境。證明:我的系統(記憶體消耗量大的 qemu + pxz 壓縮器)嚴重超載,包括記憶體和 CPU。之後,我在
top
:PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 927 root 20 0 12,3g 3,6g 3612 R 141,8 23,1 36006:53 qemu-system-x86 5017 root 20 0 7607428 4,2g 1580 R 78,4 26,8 2:32.85 pxz 354 root 20 0 0 0 0 R 53,6 0,0 32:17.28 kswapd0:5 128 root 20 0 0 0 0 R 45,8 0,0 32:57.42 kswapd0:0 352 root 20 0 0 0 0 R 40,5 0,0 32:16.80 kswapd0:3 356 root 20 0 0 0 0 R 36,6 0,0 32:53.58 kswapd0:7 350 root 20 0 0 0 0 R 35,3 0,0 31:15.53 kswapd0:1 353 root 20 0 0 0 0 R 35,3 0,0 30:48.00 kswapd0:4 351 root 20 0 0 0 0 R 28,1 0,0 31:57.45 kswapd0:2 355 root 20 0 0 0 0 R 27,5 0,0 31:44.12 kswapd0:6
是的,它還意味著以下內容:
- 多執行緒 kswapd極大地提高了 zswap 性能,
- 它不包含在主線核心中,
- 是的,很可能是因為無能或害怕不穩定。
我在測試環境中使用的 zswap 參數如下(可以在 中設置
/sys/modules/zswap/parameters
):same_filled_pages_enabled:Y enabled:Y max_pool_percent:50 compressor:deflate zpool:z3fold accept_threshold_percent:90