최대 스왑 파일 수 - 커널 문서 버그?

최대 스왑 파일 수 - 커널 문서 버그?

저는 스왑 파일에 관한 기사를 쓰고 있습니다. 스왑 파일을 몇 개까지 생성하여 사용할 수 있는지 확인해 보기로 했습니다. 에 따르면 man 2 swapon29 -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_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

실험 결과와 문서화를 정당화합니다.

관련 정보