Por que não consigo "trocar" quando há muita memória?

10

Recentemente, notei que, embora haja muita memória no meu sistema:

# free -m
             total       used       free     shared    buffers     cached
Mem:         15965       9680       6284         35       1754       2560
-/+ buffers/cache:       5365      10599
Swap:         2047        258       1789

Não posso swapoff -acom meu arquivo de troca 2G

-rw-r----- 1 root root 2.0G Feb  9 21:34 /2GB.swap

Alterei os seguintes parâmetros do kernel via sysctlmas essa deve ser a causa:

vm.swappiness = 5
vm.vfs_cache_pressure = 200

Qualquer motivo para:

# swapoff -a
swapoff: /2GB.swap: swapoff failed: Cannot allocate memory

? dmesgnão registra nada quando swapofffalha. Estou usando o kernel do linux 4.19.20-041920-generic.


Outro exemplo, incluindo /proc/meminfo

# cat /proc/meminfo
MemTotal:       16348296 kB
MemFree:         6673788 kB
MemAvailable:   11233052 kB
Buffers:          525048 kB
Cached:          2837788 kB
SwapCached:       362556 kB
Active:          4728244 kB
Inactive:        2758260 kB
Active(anon):    3132940 kB
Inactive(anon):  1043676 kB
Active(file):    1595304 kB
Inactive(file):  1714584 kB
Unevictable:        2396 kB
Mlocked:            2396 kB
SwapTotal:       2097148 kB
SwapFree:        1124272 kB
Dirty:               336 kB
Writeback:             0 kB
AnonPages:       3786868 kB
Mapped:           699944 kB
Shmem:             53116 kB
Slab:            1770268 kB
SReclaimable:    1578564 kB
SUnreclaim:       191704 kB
KernelStack:       47216 kB
PageTables:        82968 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    10271296 kB
Committed_AS:   24712604 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
Percpu:             3552 kB
HardwareCorrupted:     0 kB
AnonHugePages:     26624 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
CmaTotal:              0 kB
CmaFree:               0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB
DirectMap4k:      714480 kB
DirectMap2M:    13891584 kB
DirectMap1G:     3145728 kB

e free -m

# free -m
             total       used       free     shared    buffers     cached
Mem:         15965       9447       6517         51        512       2771
-/+ buffers/cache:       6163       9801
Swap:         2047        950       1097

EDITAR

strace swapoff -a

root@MACHINE:~# strace swapoff -a
execve("/sbin/swapoff", ["swapoff", "-a"], [/* 22 vars */]) = 0
...
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=9469488, ...}) = 0
mmap(NULL, 9469488, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fd262737000
close(3)                                = 0
open("/proc/swaps", O_RDONLY)           = 3
fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd263a54000
read(3, "Filename\t\t\t\tType\t\tSize\tUsed\tPrio"..., 1024) = 102
readlink("/2GB.swap", 0x7ffcfbb3bea0, 4096) = -1 EINVAL (Invalid argument)
read(3, "", 1024)                       = 0
close(3)                                = 0
munmap(0x7fd263a54000, 4096)            = 0
swapoff("/2GB.swap")                    = -1 ENOMEM (Cannot allocate memory)
open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2570, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd263a54000
read(3, "# Locale name alias data base.\n#"..., 4096) = 2570
read(3, "", 4096)                       = 0
close(3)                                = 0
munmap(0x7fd263a54000, 4096)            = 0
open("/usr/share/locale/en_US.UTF-8/LC_MESSAGES/util-linux.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
...
open("/usr/share/locale-langpack/en/LC_MESSAGES/util-linux.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
write(2, "swapoff: ", 9swapoff: )                = 9
write(2, "/2GB.swap: swapoff failed", 25/2GB.swap: swapoff failed) = 25
write(2, ": ", 2: )                       = 2
open("/usr/share/locale/en_US.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
...
open("/usr/share/locale-langpack/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
write(2, "Cannot allocate memory\n", 23Cannot allocate memory
) = 23
open("/etc/fstab", O_RDONLY|O_CLOEXEC)  = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=838, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd263a54000
read(3, "# /etc/fstab: static file system"..., 4096) = 838
readlink("/2GB.swap", 0x7ffcfbb3c2b0, 4096) = -1 EINVAL (Invalid argument)
read(3, "", 4096)                       = 0
close(3)                                = 0
munmap(0x7fd263a54000, 4096)            = 0
exit_group(-1)                          = ?
+++ exited with 255 +++
Patryk
fonte
Se o seu sistema estiver trocando, remover a partição swap não resolverá nenhum problema. Você apenas criará problemas adicionais (e BTW é melhor usar uma partição e, em seguida, um arquivo). Pode ser necessário encontrar um instante em que os programas não estão trocando dados nesse arquivo. Talvez você deva PARAR esses programas. Nota: a memória fragmentada pode ser um motivo. Tente talvez também com pouco tempo syncpara reduzir as páginas sujas.
Giacomo Catenazzi
1
@GiacomoCatenazzi 1) Por que é melhor usar uma partição do que um arquivo? 2) syncnão muda a utilização de memória de um bit
Patryk
1
syncgravará páginas sujas no disco (não todas, mas quando essas páginas devem estar no disco). Isso torna essas páginas limpas, para que possam ser descartadas facilmente (sem troca ou gravação no disco), para que o kernel possa transformar rapidamente parte da memória do cache em livre. É um truque de curto prazo, para encurtar as fases críticas (troca / quantia).
Giacomo Catenazzi
2
A partição está no controle direto do kernel (único bloco contíguo, alinhado). Arquivos: existe o risco de não haver espaço contíguo ou interferência suficiente de outros utilitários do sistema). [e o sistema de arquivos raiz ideal deve ser somente leitura]. [E muitas vezes é útil ter uma partição temporária, recuperar o sistema ou, portanto, algum manuseio "invasivo" do sistema, especialmente em máquinas remotas ou em máquinas sem dispositivo inicializável fácil]. Não um requisitos rígidos, mas eu achei muito frequentemente menos problemático para ter uma partição especial para que [e para máquinas RAID você pode unRAID swap, para velocidade]
Giacomo Catenazzi
1
O problema ainda é ... Há bastante RAM livre, mais do que o tamanho TOTAL do arquivo de troca. Por que a troca não pode ser desativada?
Paul Stelian

Respostas:

1

Do estudo de caso: Swapoff não pode alocar memória .

Se os processos reservarem mais memória que a soma da área de troca e (parte da) RAM e o sistema estiver configurado para não confirmar demais a memória, a alocação falhará. Isso pode acontecer mesmo que você tenha bastante RAM livre e não esteja usando nenhuma página na área de troca.

Eduardo Trápani
fonte
@ Patryk, qual é a sua supercomissão definida?
Daniel Farrell
0

Se o seu arquivo de troca estiver definido /etc/fstab(e não no systemd-swap), basta remover ou comentar a linha /etc/fstabe reiniciar.

Se você estiver usando systemd-swap para configurar a troca, defina swapfc_enabled=0na Swap File Chunkedseção /etc/systemd/swap.confe reinicie.

artesanato clayton
fonte
Eu não acho que o fato de você poder abrir o sistema sem um arquivo de swap realmente responda à pergunta de por que o arquivo de swap, se usado, não pode ser desativado.
ilkkachu 13/09/19
Reinicialização é uma solução fácil se ele pode ser tolerado
Daniel Farrell