zramswapon 失败:不允许操作

zramswapon 失败:不允许操作

当我尝试zram在具有 32 个核心的计算机上启用该服务时,当设备数量大于 26 时,该服务会失败。此外,我没有看到任何配置文件,只有zramctl实用程序,没有针对我面临的问题列出明显的选择。

light-18-pro:~ # lsblk
NAME   MAJ:MIN RM    SIZE RO TYPE MOUNTPOINT
sda      8:0    0    300G  0 disk 
├─sda1   8:1    0    500M  0 part /boot/efi
├─sda2   8:2    0     35G  0 part /
├─sda3   8:3    0    1.9G  0 part [SWAP]
├─sda4   8:4    0     10G  0 part /home
└─sda5   8:5    0  223.5G  0 part /data
sr0     11:0    1      4G  0 rom  
zram0  253:0    0 1002.3M  0 disk [SWAP]
zram1  253:1    0 1002.3M  0 disk [SWAP]
zram2  253:2    0 1002.3M  0 disk [SWAP]
zram3  253:3    0 1002.3M  0 disk [SWAP]
zram4  253:4    0 1002.3M  0 disk [SWAP]
zram5  253:5    0 1002.3M  0 disk [SWAP]
zram6  253:6    0 1002.3M  0 disk [SWAP]
zram7  253:7    0 1002.3M  0 disk [SWAP]
zram8  253:8    0 1002.3M  0 disk [SWAP]
zram9  253:9    0 1002.3M  0 disk [SWAP]
zram10 253:10   0 1002.3M  0 disk [SWAP]
zram11 253:11   0 1002.3M  0 disk [SWAP]
zram12 253:12   0 1002.3M  0 disk [SWAP]
zram13 253:13   0 1002.3M  0 disk [SWAP]
zram14 253:14   0 1002.3M  0 disk [SWAP]
zram15 253:15   0 1002.3M  0 disk [SWAP]
zram16 253:16   0 1002.3M  0 disk [SWAP]
zram17 253:17   0 1002.3M  0 disk [SWAP]
zram18 253:18   0 1002.3M  0 disk [SWAP]
zram19 253:19   0 1002.3M  0 disk [SWAP]
zram20 253:20   0 1002.3M  0 disk [SWAP]
zram21 253:21   0 1002.3M  0 disk [SWAP]
zram22 253:22   0 1002.3M  0 disk [SWAP]
zram23 253:23   0 1002.3M  0 disk [SWAP]
zram24 253:24   0 1002.3M  0 disk [SWAP]
zram25 253:25   0 1002.3M  0 disk [SWAP]
zram26 253:26   0 1002.3M  0 disk 
zram27 253:27   0 1002.3M  0 disk 
zram28 253:28   0 1002.3M  0 disk 
zram29 253:29   0 1002.3M  0 disk 
zram30 253:30   0 1002.3M  0 disk 
zram31 253:31   0 1002.3M  0 disk 

错误信息是:

light-18-pro:~ # systemctl status zramswap.service 
● zramswap.service - Service enabling compressing RAM with zRam
   Loaded: loaded (/usr/lib/systemd/system/zramswap.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Tue 2021-03-09 09:59:46 CET; 2h 13min ago
  Process: 2048 ExecStart=/usr/sbin/zramswapon (code=exited, status=255)
 Main PID: 2048 (code=exited, status=255)

Mar 09 09:59:46 light-18-pro zramswapon[2048]: swapon: /dev/zram26: swapon failed: Operation not permitted
Mar 09 09:59:46 light-18-pro zramswapon[2048]: swapon: /dev/zram27: swapon failed: Operation not permitted
Mar 09 09:59:46 light-18-pro zramswapon[2048]: swapon: /dev/zram28: swapon failed: Operation not permitted
Mar 09 09:59:46 light-18-pro zramswapon[2048]: swapon: /dev/zram29: swapon failed: Operation not permitted
Mar 09 09:59:46 light-18-pro zramswapon[2048]: swapon: /dev/zram30: swapon failed: Operation not permitted
Mar 09 09:59:46 light-18-pro zramswapon[2048]: swapon: /dev/zram31: swapon failed: Operation not permitted
Mar 09 09:59:46 light-18-pro systemd[1]: zramswap.service: Main process exited, code=exited, status=255/n/a
Mar 09 09:59:46 light-18-pro systemd[1]: Failed to start Service enabling compressing RAM with zRam.
Mar 09 09:59:46 light-18-pro systemd[1]: zramswap.service: Unit entered failed state.
Mar 09 09:59:46 light-18-pro systemd[1]: zramswap.service: Failed with result 'exit-code'.

您知道它有什么问题吗?怎么解决呢?

答案1

swapon(2)系统调用的手册页说:

错误
EPERM 调用者不具有 CAP_SYS_ADMIN 功能。或者,已使用最大数量的交换文件;请参阅下面的注释。

注意
可使用的交换文件数量有一个上限,由内核常量 MAX_SWAPFILES 定义。在内核 2.4.10 之前,MAX_SWAPFILES 的值为 8;从内核 2.4.10 开始,它的值为 32。从内核 2.6.18 开始,如果内核是使用 CONFIG_MIGRATION 选项构建的(为页面迁移功能保留两个交换表条目),则限制会减少 2(因此:30) mbind(2) 和 migrate_pages(2))。从内核 2.6.32 开始,如果内核是使用 CONFIG_MEMORY_FAILURE 选项构建的,则该限制进一步减少 1。

因此,假设所有这些选项均已启用(检查您的内核配置),则限制为 32 - 2 - 2 - 1 = 27。根据输出,这恰好是您正在使用的交换设备的确切数量lsblksda3+zram0zram25)。 (我不知道为什么涉及的错误是 EPERM,“权限被拒绝”,而不是 ENFILE 或其他暗示“太多”的错误。)

您也许可以通过重新编译内核来增加该限制,但我只需修改 zram 脚本以创建更少的交换设备。为每个核心创建一个核心的想法是,如果多个核心想要同时交换,则不会出现争用。但是...如果您有 32 个核心尝试同时交换所有核心,这听起来已经很麻烦,因此减少数量可能并不重要。当然,您可以运行基准测试。

在我手头的 Ubuntu 系统上,要创建的设备数量在 中设置/etc/default/zramswap,因为CORES=4该设置由实际设置脚本读取,这在其他 Linuxen 中可能相似也可能不相似。

相关内容