Estou escrevendo um artigo sobre swapfiles. Decidi verificar quantos arquivos de troca posso criar e usar. De acordo com man 2 swapon
, eu sei que deve ser 29 - https://man7.org/linux/man-pages/man2/swapon.2.html . Eu verifiquei minhas opções de configuração do kernel com grep CONFIG_MIGRATION /boot/config-$(uname -r)
e grep CONFIG_MEMORY_FAILURE /boot/config-$(uname -r)
. Mas quando escrevi um script simples para verificar:
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
Consegui ativar apenas 27 deles.
[root@localhost ~]# swapon
NAME TYPE SIZE USED PRIO
/swapfile-1 file 10M 0B -2
(...)
/swapfile-27 file 10M 0B -28
Isso significa que provavelmente há algo faltando na documentação.
Estou usando o EuroLinux 8 (apenas mais um clone do RHEL 8). Mas eu tentei também no Fedora com resultados idênticos. Eu tentei entender por que isso aconteceu examinando o arquivo do kernel swap.h ( https://github.com/torvalds/linux/blob/master/include/linux/swap.h ), mas isso me deixou ainda mais confuso é:
#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 ou 0
- SWP_MIGRATION é 2 ou 0
- SWP_HWPOISON_NUM é 1 ou 0
32 - X = 27 adiciona somente quando SWP_DEVICE_NUM e SWP_HWPOISON_NUM são usados. Ao mesmo tempo, man 2 swapon
diz que:
Since kernel 2.6.18, the limit is decreased by 2
(thus: 30) if the kernel is built with the CONFIG_MIGRATION
E as configurações estão definidas como sim.
[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
Qualquer ajuda para entender por que apenas 27 swaps estão disponíveis é apreciada.
Absolutamente nada de errado com os documentos.
Seu mal-entendido vem simplesmente do fato de você estar baseando seu cálculo em definições encontradas no
swap.h
git do Linus, que é oswap.h
relacionado ao branch master , ou seja, hoje à frente do 5.17-rc-1Ao fazer seus experimentos no RHEL 8 que, AFAIK, é baseado no Linux- 4.18
Em swap.h de 4.18.20 se ainda podemos ler a mesma fórmula:
SWP_MIGRATION_NUM
no entanto, está assumindo um valor diferente:2 em vez de 4.
Aplicando esse valor à fórmula levando em consideração suas configurações de configuração, obtém-se:
MAX_SWAPFILES = 32 - 2 - 2 - 1 = 27
Justificando os resultados de seus experimentos e a documentação.