Rhel

交換文件的最大數量 - 核心文件錯誤?

  • January 18, 2022

我正在寫一篇關於交換文件的文章。我決定檢查我可以創建和使用多少個交換文件。根據man 2 swapon,我知道它應該是 29 - https://man7.org/linux/man-pages/man2/swapon.2.htmlgrep 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.hmaster 分支相關,換句話說,現在早於5.17-rc-1

在 RHEL 8 下進行實驗時,AFAIK 基於 Linux- 4.18

如果我們仍然可以閱讀相同的公式,那麼在4.18.20 的 swap.h 中:

#define MAX_SWAPFILES \
   ((1 &lt;&lt; MAX_SWAPFILES_SHIFT) - SWP_DEVICE_NUM - \
   SWP_MIGRATION_NUM - SWP_HWPOISON_NUM)

SWP_MIGRATION_NUM然而,它採取了不同的價值:

#define SWP_MIGRATION_NUM 2

2 而不是 4。

考慮到您的配置設置,將此值應用於公式會給出:

MAX_SWAPFILES = 32 - 2 - 2 - 1 = 27

證明你的實驗結果和文件。

引用自:https://unix.stackexchange.com/questions/686726