귀하의 질문에 답하기 위해 먼저 일련의 실험을 수행했습니다. 최종 답변은 끝에 굵은 글씨로 표시되어 있습니다.

귀하의 질문에 답하기 위해 먼저 일련의 실험을 수행했습니다. 최종 답변은 끝에 굵은 글씨로 표시되어 있습니다.

zram 사용의 가장 큰 단점은LRU 반전:

오래된 페이지는 우선 순위가 더 높은 zram으로 이동하여 빠르게 채우는 반면, 새로운 페이지는 느린 스왑에서 스왑 인/아웃됩니다 [...]

이것zswap 문서zswap은 이 문제의 영향을 받지 않는다고 말합니다.

Zswap은 Frontswap API를 통해 압축할 페이지를 수신하고 LRU 기반으로 자체 압축 풀에서 페이지를 제거하고 압축 풀이 가득 차면 이를 백업 스왑 장치에 다시 쓸 수 있습니다.

max_pool_percent로 설정하면 zram 및 완전히 압축된 RAM의 모든 이점을 얻을 수 있습니까 100?

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기본값이 지정되어 있지 않지만아치 위키 페이지그렇다고 대답하세요 20.

압축 해제가 성능에 미치는 영향 외에도 max_pool_percent이것을 로 설정하면 어떤 위험/단점이 있습니까 100?

향상된 스왑 지원을 통해 zram처럼 실행됩니까?

답변1

귀하의 질문에 답하기 위해 먼저 일련의 실험을 수행했습니다. 최종 답변은 끝에 굵은 글씨로 표시되어 있습니다.

수행된 실험:

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
  • 페도라 27, xfce 스핀
  • 512MB RAM, 16MB 비디오 RAM, CPU 2개
  • 리눅스 커널 4.13.13-300.fc27.x86_64
  • 기본값 swappiness(60)
  • 일부 랩에서 사용할 수 있도록 빈 512MB 스왑 파일(랩 9에서는 300MB)을 생성했지만 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

후속 스와핑 작업 등으로 인해 실험 중에 다른 설정이 발생하여 이러한 값에 약 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) 스왑 파일(300M), 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가 완전히 로드되지 않았기 때문일 수 있습니다.

또한 낮은 값(10과 1)으로 몇 가지 실험을 실행했는데 swappiness둘 다 디스크 읽기가 너무 많아 최종 메모리 통계를 기록할 수 없게 되었습니다.

관찰 결과:

  • 주관적으로 높은 max_pool_percent가치는 부진을 초래합니다.
  • 주관적으로 실험 9의 시스템은 너무 느려서 유용하지 않았습니다.
  • 값이 높으면 max_pool_percent쓰기가 가장 적게 발생하고 값이 매우 낮으면 max_pool_percent쓰기가 가장 많이 발생합니다.
  • 실험 5와 6(zram 스와핑)은 Firefox가 약 62,000개의 섹터가 디스크에 기록되는 데이터를 기록한다는 것을 보여줍니다. 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의 대부분을 차지하고 파일 지원 페이지를 디스크에서 반복적으로 읽어야 했습니다.
  • 어떤 경우에는 스왑 디스크에 기록되는 데이터 양을 0에 가깝게 최소화하는 것이 가능 zswap하지만 확실히 이 작업에는 적합하지 않습니다.
  • 있을 수 없다"완전히 압축된 RAM"시스템이 작동하려면 RAM에 일정 수의 스왑되지 않은 페이지가 있어야 하기 때문입니다.

개인적인 의견과 일화:

  • 디스크 쓰기 시 zswap의 주요 개선 사항은 페이지를 압축하는 것이 아니라 페이지 캐싱을 줄이고 더 많은 익명 페이지(압축된 형식)를 RAM에 효과적으로 유지하는 자체 버퍼링 및 캐싱 시스템이 있다는 것입니다. (그러나 매일 Linux를 사용하는 주관적인 경험에 따르면 스왑 및 zswap기본값이 있는 swappiness시스템은 값이 없거나 높 거나 값이 더 높은 max_pool_percent시스템보다 항상 더 나은 성능을 발휘합니다 .)swappinesszswapzswapmax_pool_percent
  • 과도한 디스크 읽기로 인해 시스템을 사용할 수 없을 정도로 남은 페이지 캐시의 양이 너무 적어지기 전까지는 값이 낮을 swappiness수록 시스템 성능이 좋아지는 것으로 보입니다. 너무 높음과 유사합니다 max_pool_percent.
  • 스왑을 사용 zram하고 메모리에 보관해야 하는 익명 페이지 수를 제한하거나 zswap기본값과 함께 디스크 지원 스왑을 사용하세요.swappinessmax_pool_percent

편집: 질문의 세부 사항에 답하기 위한 향후 노력은 특정 사용 사례 zsmalloc에 사용된 할당자가 zram압축 측면에서 사용된 할당자와 어떻게 zbud비교되는지 알아내는 것입니다 zswap. 하지만 나는 그렇게 하지 않을 것입니다. 문서/인터넷에서 무엇을 검색해야 하는지 지적하기만 하면 됩니다.

편집 2: echo "zsmalloc" > /sys/module/zswap/parameters/zpoolzswap의 할당자를 에서 로 전환했습니다 zbud. zsmalloc위 실험의 테스트 설정을 계속하고 + zramzswap비교 zsmalloc하면 필요한 스왑 메모리가 zramswap 또는 와 zswap동일한 한 max_pool_percent, 디스크 읽기 및 쓰기 양이 두 사람은 매우 유사합니다. . 사실에 근거하여 저는 개인적으로 필요한 스왑 양이 zram실제로 RAM에 보관할 수 있는 스왑 양보다 적 다면 필요한 스왑 양이 내가 원하는 양을 초과하면 zram단독으로 진행하는 것이 더 낫다고 생각합니다. 실제로 RAM에 보관할 수 있다면 작업 부하를 변경하여 이를 방지하거나 스왑 및 사용을 비활성화하고 zram이 이전에 메모리에서 차지했던 것과 동일한 값(* 압축 비율 크기 ) 으로 설정하는 zram것이 좋습니다 . 그러나 현재는 이러한 추가 테스트를 제대로 작성할 시간이 없습니다.zramzswapzsmallocmax_pool_percentzram

관련 정보