最大スワップファイル数 - カーネルドキュメントのバグ?

最大スワップファイル数 - カーネルドキュメントのバグ?

私はスワップファイルに関する記事を書いています。スワップファイルをいくつまで作成して使用できるか確認してみることにしました。によるとman 2 swapon29 -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_HWPOISON_NUM を使用する場合のみ追加します。同時に、その人は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

私が知っている限り、LinuxベースのRHEL 8で実験しています。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

4 代わりに 2.

構成設定を考慮する式にこの値を適用すると、次のようになります。

最大スワップファイル数 = 32 - 2 - 2 - 1 =27

実験結果と文書化を正当化します。

関連情報