我正在写一篇关于交换文件的文章。我决定检查我可以创建和使用多少个交换文件。根据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
32 - X = 27 仅在使用 SWP_DEVICE_NUM 和 SWP_HWPISON_NUM 时添加。与此同时,theman 2 swapon
说:
Since kernel 2.6.18, the limit is decreased by 2
(thus: 30) if the kernel is built with the CONFIG_MIGRATION
并且配置设置为是。
[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 个交换可用的帮助表示赞赏。
文档绝对没有问题。
您的误解仅仅是因为您的演算基于
swap.h
从 Linus 的 git 中找到的定义,即swap.h
与master 分支相关,换句话说,现在早于5.17-rc-1在 RHEL 8 下进行实验时,AFAIK 基于 Linux- 4.18
如果我们仍然可以阅读相同的公式,那么在4.18.20 的 swap.h 中:
SWP_MIGRATION_NUM
然而,它采取了不同的价值:2 而不是 4。
考虑到您的配置设置,将此值应用于公式会给出:
MAX_SWAPFILES = 32 - 2 - 2 - 1 = 27
证明你的实验结果和文档。