AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 406925
Accepted
Tom Hale
Tom Hale
Asked: 2017-11-25 22:37:21 +0800 CST2017-11-25 22:37:21 +0800 CST 2017-11-25 22:37:21 +0800 CST

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

  • 772

使用 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 一样运行吗?

linux swap
  • 1 1 个回答
  • 4167 Views

1 个回答

  • Voted
  1. Best Answer
    Jake F
    2017-11-27T09:04:32+08:002017-11-27T09:04:32+08:00

    为了回答你的问题,我首先进行了一系列实验。最终答案最后以粗体显示。

    进行的实验:

    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近似默认值。swappinessmax_pool_percent

    编辑:未来可能会回答您问题的更详细点的工作是找出您的特定用例中使用的分配器如何zsmalloc在zram压缩方面与中使用的zbud分配器进行比较zswap。不过,我不会这样做,只是指出要在文档/互联网上搜索的内容。

    编辑 2: echo "zsmalloc" > /sys/module/zswap/parameters/zpool将 zswap 的分配器从 切换zbud到zsmalloc. 继续我的上述实验的测试夹具并zram与zswap+进行比较zsmalloc,似乎只要所需的交换内存与zram交换或 as相同,两者之间zswap的max_pool_percent磁盘读写量非常相似. 我个人基于事实的看法,只要zram我需要的交换量小于zram我能承受的实际保存在 RAM 中的交换量,那么最好单独使用zram;并且一旦我需要的交换量超出内存中的实际容量,最好要么更改我的工作负载以避免它,要么禁用zram交换并使用zswapwithzsmalloc和 setmax_pool_percent相当于 zram 之前在内存中占用的内存(zram* 压缩比的大小)。不过,我目前没有时间对这些额外的测试进行适当的编写。

    • 12

相关问题

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

  • 需要一些系统调用

  • astyle 不会更改源文件格式

  • 通过标签将根文件系统传递给linux内核

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    JSON数组使用jq来bash变量

    • 4 个回答
  • Marko Smith

    日期可以为 GMT 时区格式化当前时间吗?[复制]

    • 2 个回答
  • Marko Smith

    bash + 通过 bash 脚本从文件中读取变量和值

    • 4 个回答
  • Marko Smith

    如何复制目录并在同一命令中重命名它?

    • 4 个回答
  • Marko Smith

    ssh 连接。X11 连接因身份验证错误而被拒绝

    • 3 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Marko Smith

    systemctl 命令在 RHEL 6 中不起作用

    • 3 个回答
  • Marko Smith

    rsync 端口 22 和 873 使用

    • 2 个回答
  • Marko Smith

    以 100% 的利用率捕捉 /dev/loop -- 没有可用空间

    • 1 个回答
  • Marko Smith

    jq 打印子对象中所有的键和值

    • 2 个回答
  • Martin Hope
    EHerman JSON数组使用jq来bash变量 2017-12-31 14:50:58 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Drux 日期可以为 GMT 时区格式化当前时间吗?[复制] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC 如何复制目录并在同一命令中重命名它? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve “root”用户的文件权限如何工作? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe 将默认编辑器更改为 vim for _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey 如何下载软件包而不是使用 apt-get 命令安装它? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao 为什么目录 /home、/usr、/var 等都具有相同的 inode 编号 (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg —list-keys 命令在将私钥导入全新安装后输出 uid [未知] 2017-11-26 18:26:02 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve