Linux

使用 zswap 和 max_pool_percent = 100 防止 zram LRU 反轉

  • February 19, 2019

使用 zram 的主要缺點是LRU 反轉

較舊的頁面進入優先級較高的 zram 并快速填充它,而較新的頁面被換入和換出較慢的

$$ … $$交換

zswap 文件說 zswap 不受此影響:

Zswap 通過 Frontswap API 接收用於壓縮的頁面,並能夠在 LRU 基礎上從其自己的壓縮池中逐出頁面,並在壓縮池已滿的情況下將它們寫回備用交換設備。

我可以通過設置max_pool_percent來獲得 zram 的所有好處和完全壓縮的 RAM100嗎?

Zswap seeks to be simple in its policies.  Sysfs attributes allow for one user
controlled policy:
* max_pool_percent - The maximum percentage of memory that the compressed
    pool can occupy.

這裡沒有指定預設值max_pool_percent,但Arch Wiki 頁面說它是20.

除了解壓縮的性能影響外,設置max_pool_percent為是否有任何危險/不利之處100

它會像使用改進的交換支持 zram 一樣執行嗎?

為了回答你的問題,我首先進行了一系列實驗。最終答案最後以粗體顯示。

進行的實驗:

1) swap file, zswap disabled
2) swap file, zswap enabled, max_pool_percent = 20
3) swap file, zswap enabled, max_pool_percent = 70
4) swap file, zswap enabled, max_pool_percent = 100
5) zram swap, zswap disabled
6) zram swap, zswap enabled, max_pool_percent = 20
7) no swap
8) swap file, zswap enabled, max_pool_percent = 1
9) swap file (300 M), zswap enabled, max_pool_percent = 100

實驗前設置:

  • 虛擬盒子 5.1.30
  • Fedora 27,xfce 旋轉
  • 512 MB RAM、16 MB 影片 RAM、2 個 CPU
  • linux核心4.13.13-300.fc27.x86_64
  • 預設swappiness值 (60)
  • 創建了一個空的 512 MB 交換文件(實驗 9 中為 300 MB)以供在某些實驗期間可能使用(使用dd),但還swapon沒有
  • 禁用所有 dnf* systemd 服務,執行watch "killall -9 dnf"以更確定 dnf 在實驗期間不會嘗試自動更新或其他東西,並將結果扔得太遠

實驗前狀態:

[root@user-vm user]# free -m ; vmstat ; vmstat -d 
             total        used        free      shared  buff/cache   available
Mem:            485         280          72           8         132         153
Swap:           511           0         511
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
0  0      0  74624   8648 127180    0    0  1377   526  275  428  3  2 94  1  0
disk- ------------reads------------ ------------writes----------- -----IO------
      total merged sectors      ms  total merged sectors      ms    cur    sec
sda   102430    688 3593850   67603   3351   8000 1373336   17275      0     26
sr0        0      0       0       0      0      0       0       0      0      0

隨後的 swapon 操作等導致實驗期間的不同設置,導致這些值的差異在大約 2% 以內。

實驗操作包括:

  • 首次執行 Firefox
  • 等待大約 40 秒或直到網路和磁碟活動停止(以較長者為準)
  • 實驗結束後記錄如下狀態(firefox 一直執行,除了實驗 7 和 9 的 firefox 崩潰)

實驗後狀態:

1) 交換文件,zswap 禁用

[root@user-vm user]# free -m ; vmstat ; vmstat -d 
             total        used        free      shared  buff/cache   available
Mem:            485         287           5          63         192          97
Swap:           511         249         262
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
1  0 255488   5904   1892 195428   63  237  1729   743  335  492  3  2 93  2  0
disk- ------------reads------------ ------------writes----------- -----IO------
      total merged sectors      ms  total merged sectors      ms    cur    sec
sda   134680  10706 4848594   95687   5127  91447 2084176   26205      0     38
sr0        0      0       0       0      0      0       0       0      0      0

2) 交換文件,啟用 zswap,max_pool_percent = 20

[root@user-vm user]# free -m ; vmstat ; vmstat -d 
             total        used        free      shared  buff/cache   available
Mem:            485         330           6          33         148          73
Swap:           511         317         194
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
0  0 325376   7436    756 151144    3  110  1793   609  344  477  3  2 93  2  0
disk- ------------reads------------ ------------writes----------- -----IO------
      total merged sectors      ms  total merged sectors      ms    cur    sec
sda   136046   1320 5150874  117469  10024  41988 1749440   53395      0     40
sr0        0      0       0       0      0      0       0       0      0      0

3) 交換文件,啟用 zswap,max_pool_percent = 70

[root@user-vm user]# free -m ; vmstat ; vmstat -d 
             total        used        free      shared  buff/cache   available
Mem:            485         342           8          32         134          58
Swap:           511         393         118
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
0  0 403208   8116   1088 137180    4    8  3538   474  467  538  3  3 91  3  0
disk- ------------reads------------ ------------writes----------- -----IO------
      total merged sectors      ms  total merged sectors      ms    cur    sec
sda   224321   1414 10910442  220138   7535   9571 1461088   42931      0     60
sr0        0      0       0       0      0      0       0       0      0      0

4) 交換文件,啟用 zswap,max_pool_percent = 100

[root@user-vm user]# free -m ; vmstat ; vmstat -d 
             total        used        free      shared  buff/cache   available
Mem:            485         345          10          32         129          56
Swap:           511         410         101
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
1  0 420712  10916   2316 130520    1   11  3660   492  478  549  3  4 91  2  0
disk- ------------reads------------ ------------writes----------- -----IO------
      total merged sectors      ms  total merged sectors      ms    cur    sec
sda   221920   1214 10922082  169369   8445   9570 1468552   28488      0     56
sr0        0      0       0       0      0      0       0       0      0      0

5) zram 交換,zswap 禁用

[root@user-vm user]# free -m ; vmstat ; vmstat -d 
             total        used        free      shared  buff/cache   available
Mem:            485         333           4          34         147          72
Swap:           499         314         185
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
5  0 324128   7256   1192 149444  153  365  1658   471  326  457  3  2 93  2  0
disk- ------------reads------------ ------------writes----------- -----IO------
      total merged sectors      ms  total merged sectors      ms    cur    sec
sda   130703    884 5047298  112889   4197   9517 1433832   21037      0     37
sr0        0      0       0       0      0      0       0       0      0      0
zram0  58673      0  469384     271 138745      0 1109960     927      0      1

6) zram 交換,zswap 啟用,max_pool_percent = 20

[root@user-vm user]# free -m ; vmstat ; vmstat -d 
             total        used        free      shared  buff/cache   available
Mem:            485         338           5          32         141          65
Swap:           499         355         144
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
1  0 364984   7584    904 143572   33  166  2052   437  354  457  3  3 93  2  0
disk- ------------reads------------ ------------writes----------- -----IO------
      total merged sectors      ms  total merged sectors      ms    cur    sec
sda   166168    998 6751610  120911   4383   9543 1436080   18916      0     42
sr0        0      0       0       0      0      0       0       0      0      0
zram0  13819      0  110552      78  68164      0  545312     398      0      0

7) 沒有交換

請注意,在記錄這些統計資訊時,Firefox 並未在此實驗中執行。

[root@user-vm user]# free -m ; vmstat ; vmstat -d 
             total        used        free      shared  buff/cache   available
Mem:            485         289          68           8         127         143
Swap:             0           0           0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
2  0      0  70108  10660 119976    0    0 13503   286  607  618  2  5 88  5  0
disk- ------------reads------------ ------------writes----------- -----IO------
      total merged sectors      ms  total merged sectors      ms    cur    sec
sda   748978   3511 66775042  595064   4263   9334 1413728   23421      0    164
sr0        0      0       0       0      0      0       0       0      0      0

8) 交換文件,啟用 zswap,max_pool_percent = 1

[root@user-vm user]# free -m ; vmstat ; vmstat -d 
             total        used        free      shared  buff/cache   available
Mem:            485         292           7          63         186          90
Swap:           511         249         262
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
1  0 255488   7088   2156 188688   43  182  1417   606  298  432  3  2 94  2  0
disk- ------------reads------------ ------------writes----------- -----IO------
      total merged sectors      ms  total merged sectors      ms    cur    sec
sda   132222   9573 4796802  114450  10171  77607 2050032  137961      0     41
sr0        0      0       0       0      0      0       0       0      0      0

9)交換文件(300 M),zswap啟用,max_pool_percent = 100

Firefox 卡住了,系統仍然瘋狂地從磁碟讀取。由於已寫入新的交換文件,因此該實驗的基線有所不同:

             total        used        free      shared  buff/cache   available
Mem:            485         280           8           8         196         153
Swap:           299           0         299
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
0  0      0   8948   3400 198064    0    0  1186   653  249  388  2  2 95  1  0
disk- ------------reads------------ ------------writes----------- -----IO------
      total merged sectors      ms  total merged sectors      ms    cur    sec
sda   103099    688 3610794   68253   3837   8084 1988936   20306      0     27
sr0        0      0       0       0      0      0       0       0      0      0

具體來說,由於此更改,已寫入額外的 649384 個扇區。

實驗後狀態:

[root@user-vm user]# free -m ; vmstat ; vmstat -d 
             total        used        free      shared  buff/cache   available
Mem:            485         335          32          47         118          53
Swap:           299         277          22
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
7  1 283540  22912   2712 129132    0    0 83166   414 2387 1951  2 23 62 13  0
disk- ------------reads------------ ------------writes----------- -----IO------
      total merged sectors      ms  total merged sectors      ms    cur    sec
sda   3416602  26605 406297938 4710584   4670   9025 2022272   33805      0    521
sr0        0      0       0       0      0      0       0       0      0      0

從 2022272 中減去額外的 649384 個寫入扇區得到 1372888。這小於 1433000(見下文),這可能是因為 Firefox 沒有完全載入。

我還用低值swappiness(10 和 1)進行了一些實驗,它們都因磁碟讀取過多而陷入凍結狀態,從而阻止我記錄最終的記憶體統計資訊。

觀察:

  • 主觀上,高max_pool_percent值導致呆滯。
  • 主觀上,實驗 9 中的系統太慢以至於無法使用。
  • max_pool_percent值會導致最少的寫入,而非常低的值會max_pool_percent導致最多的寫入。
  • 實驗 5 和 6(zram 交換)表明 firefox 寫入的數據導致大約 62000 個扇區寫入磁碟。任何高於 1433000 的都是由於交換而寫入的扇區。請參見下表。
  • 如果我們假設實驗中讀取扇區數量最少的為基線,我們可以根據由於交換引起的額外讀取扇區數量來比較實驗。

作為交換的直接結果的書面扇區(大約):

650000   1) swap file, zswap disabled
320000   2) swap file, zswap enabled, max_pool_percent = 20
30000   3) swap file, zswap enabled, max_pool_percent = 70
40000   4) swap file, zswap enabled, max_pool_percent = 100
0       5) zram swap, zswap disabled
0       6) zram swap, zswap enabled, max_pool_percent = 20
-20000   7) no swap (firefox crashed)
620000   8) swap file, zswap enabled, max_pool_percent = 1
-60000   9) swap file (300 M), zswap enabled, max_pool_percent = 100 (firefox crashed)

作為交換的直接結果的額外讀取扇區(大約):

   51792             1) swap file, zswap disabled
  354072             2) swap file, zswap enabled, max_pool_percent = 20
 6113640             3) swap file, zswap enabled, max_pool_percent = 70
 6125280             4) swap file, zswap enabled, max_pool_percent = 100
  250496             5) zram swap, zswap disabled
 1954808             6) zram swap, zswap enabled, max_pool_percent = 20
61978240             7) no swap
       0 (baseline)  8) swap file, zswap enabled, max_pool_percent = 1
401501136             9) swap file (300 M), zswap enabled, max_pool_percent = 100

結果解釋:

  • 這是主觀的,也特定於手頭的案例;行為在其他案例中會有所不同。
  • Zswap 的頁面池佔用了 RAM 中原本可以被系統的頁面記憶體(用於文件支持的頁面)使用的空間,這意味著系統會反复丟棄文件支持的頁面並在需要時再次讀取它們,從而導致過度讀取。
  • 實驗 7 中的大量讀取是由相同的問題引起的 - 系統的匿名頁面佔用了大部分 RAM,並且文件支持的頁面必須從磁碟重複讀取。
  • 在某些情況下,可以將寫入交換磁碟的數據量減少到接近零,zswap但顯然不適合此任務。
  • 不可能有“完全壓縮的 RAM ”,因為系統需要一定數量的非交換頁面駐留在 RAM 中才能執行。

個人觀點和軼事:

  • zswap 在磁碟寫入方面的主要改進不是它壓縮頁面,而是它有自己的緩沖和記憶體系統,可以減少頁面記憶體並有效地將更多匿名頁面(以壓縮形式)保留在 RAM 中。(但是,根據我每天使用 Linux 時的主觀經驗,具有 swap 且zswap預設值為swappinessand的系統始終比任何值且沒有或具有高值的.)max_pool_percent表現更好。)swappiness``zswap``zswap``max_pool_percent
  • 低值swappiness似乎使系統表現更好,直到剩餘的頁面記憶體量太小以至於由於過多的磁碟讀取而導致系統無法使用。與太高類似max_pool_percent
  • 要麼單獨使用zram交換並限制您需要在記憶體中保存的匿名頁面的數量,要麼使用磁碟支持的交換,其中 和具有zswap近似預設值。swappiness``max_pool_percent

編輯:未來可能會回答您問題的更詳細點的工作是找出您的特定案例中使用的分配器如何zsmalloczram壓縮方面與中使用的zbud分配器進行比較zswap。不過,我不會這樣做,只是指出要在文件/網際網路上搜尋的內容。

編輯 2: echo "zsmalloc" > /sys/module/zswap/parameters/zpool將 zswap 的分配器從 切換zbudzsmalloc. 繼續我的上述實驗的測試夾具並zramzswap+進行比較zsmalloc,似乎只要所需的交換記憶體與zram交換或 as相同,兩者之間zswapmax_pool_percent磁碟讀寫量非常相似. 我個人基於事實的看法,只要zram我需要的交換量小於zram我能承受的實際保存在 RAM 中的交換量,那麼最好單獨使用zram;並且一旦我需要的交換量超出記憶體中的實際容量,最好要麼更改我的工作負載以避免它,要麼禁用zram交換並使用zswapwithzsmalloc和 setmax_pool_percent相當於 zram 之前在記憶體中佔用的記憶體(zram* 壓縮比的大小)。不過,我目前沒有時間對這些額外的測試進行適當的編寫。

引用自:https://unix.stackexchange.com/questions/406925