交换文件的最大数量 - 内核文档错误?

交换文件的最大数量 - 内核文档错误?

我正在写一篇关于交换文件的文章。我决定检查可以创建和使用多少个交换文件。根据man 2 swapon,我知道应该是 29 -https://man7.org/linux/man-pages/man2/swapon.2.html。我使用grep CONFIG_MIGRATION /boot/config-$(uname -r)和检查了我的内核配置选项grep CONFIG_MEMORY_FAILURE /boot/config-$(uname -r)。但是当我编写一个简单的脚本来检查时:

for i in {1..33}; do 
    SWAP_FILE="/swapfile-$i"
    sudo dd if=/dev/zero of=$SWAP_FILE bs=1M count=10
    sudo chmod 600 $SWAP_FILE
    sudo mkswap $SWAP_FILE
    sudo swapon $SWAP_FILE
done

我只能激活其中 27 个。

[root@localhost ~]# swapon
NAME         TYPE SIZE USED PRIO
/swapfile-1  file  10M   0B   -2
(...)
/swapfile-27 file  10M   0B  -28

这意味着文档中可能缺少某些内容。

我正在使用 EuroLinux 8(只是另一个 RHEL 8 克隆)。但我也在 Fedora 上尝试过,结果相同。我试图通过查看 swap.h 内核文件来了解为什么会发生这种情况(https://github.com/torvalds/linux/blob/master/include/linux/swap.h)但这让我更加困惑,因为:

#ifdef CONFIG_DEVICE_PRIVATE
#define SWP_DEVICE_NUM 4
#define SWP_DEVICE_WRITE (MAX_SWAPFILES+SWP_HWPOISON_NUM+SWP_MIGRATION_NUM)
#define SWP_DEVICE_READ (MAX_SWAPFILES+SWP_HWPOISON_NUM+SWP_MIGRATION_NUM+1)
#define SWP_DEVICE_EXCLUSIVE_WRITE (MAX_SWAPFILES+SWP_HWPOISON_NUM+SWP_MIGRATION_NUM+2)
#define SWP_DEVICE_EXCLUSIVE_READ (MAX_SWAPFILES+SWP_HWPOISON_NUM+SWP_MIGRATION_NUM+3)
#else
#define SWP_DEVICE_NUM 0
#endif
#ifdef CONFIG_MIGRATION
#define SWP_MIGRATION_NUM 2
#define SWP_MIGRATION_READ  (MAX_SWAPFILES + SWP_HWPOISON_NUM)
#define SWP_MIGRATION_WRITE (MAX_SWAPFILES + SWP_HWPOISON_NUM + 1)
#else
#define SWP_MIGRATION_NUM 0
#endif
#ifdef CONFIG_MEMORY_FAILURE
#define SWP_HWPOISON_NUM 1
#define SWP_HWPOISON        MAX_SWAPFILES
#else
#define SWP_HWPOISON_NUM 0
#endif

#define MAX_SWAPFILES \
    ((1 << MAX_SWAPFILES_SHIFT) - SWP_DEVICE_NUM - \
    SWP_MIGRATION_NUM - SWP_HWPOISON_NUM)
  • (1<< SWAPFILES_SHIFT) = 32 (SWAPFILES_SHIFT=5)
  • SWP_DEVICE_NUM 为 4 或 0
  • SWP_MIGRATION 为 2 或 0
  • SWP_HWPISON_NUM 为 1 或 0

仅当使用 SWP_DEVICE_NUM 和 SWP_HWPOISON_NUM 时,32 - X = 27 才会相加。与此同时,该人士man 2 swapon表示:

Since kernel 2.6.18, the  limit  is  decreased  by  2
       (thus:  30)  if  the  kernel is built with the CONFIG_MIGRATION

并且配置设置为 yes。

[root@fedora ~]# grep CONFIG_MIGRATION /boot/config-$(uname -r)
CONFIG_MIGRATION=y
[root@fedora ~]# grep CONFIG_MEMORY_FAILURE  /boot/config-$(uname -r)
CONFIG_MEMORY_FAILURE=y

如果您能帮助理解为什么只有 27 个交换可用,我们将不胜感激。

答案1

文档绝对没有问题。

你的误解仅仅来自于你的微积分基于swap.h从 Linus 的 git 中找到的定义,这swap.h主分支,换句话说,现在领先于5.17-rc-1

在 RHEL 8 下进行实验时,据我所知,它是基于 Linux 的 -4.18

4.18.20 的 swap.h如果我们仍然可以读取相同的公式:

#define MAX_SWAPFILES \
    ((1 << MAX_SWAPFILES_SHIFT) - SWP_DEVICE_NUM - \
    SWP_MIGRATION_NUM - SWP_HWPOISON_NUM)

SWP_MIGRATION_NUM然而采用不同的值:

#define SWP_MIGRATION_NUM 2

2 而不是 4。

将此值应用到考虑到您的配置设置的公式中,得出:

最大交换文件数 = 32 - 2 - 2 - 1 =27

证明实验结果和文档的合理性。

相关内容