¿Por qué no puedo "intercambiar" cuando hay mucha memoria?

10

Recientemente me di cuenta de que aunque hay mucha memoria en mi sistema:

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

No puedo swapoff -acon mi archivo de intercambio 2G

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

He cambiado los siguientes parámetros del kernel, sysctlpero esa debería ser la causa:

vm.swappiness = 5
vm.vfs_cache_pressure = 200

Cualquier razón para:

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

? dmesgno registra nada cuando swapofffalla. Estoy usando el kernel de Linux 4.19.20-041920-generic.


Otro ejemplo que incluye /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

y 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
fuente
Si su sistema está intercambiando, eliminar la partición de intercambio no resolverá ningún problema. Simplemente creará problemas adicionales (y, por cierto, es mejor usar una partición, luego un archivo). Es posible que necesite encontrar un instante en el que los programas no intercambien datos en ese archivo. Tal vez deberías DETENER tales programas. Nota: la memoria fragmentada podría ser una razón. Pruebe quizás también con poco tiempo syncpara reducir páginas sucias.
Giacomo Catenazzi
1
@GiacomoCatenazzi 1) ¿Por qué es mejor usar una partición que un archivo? 2) syncno cambia la utilización de la memoria un bit
Patryk
1
syncescribirá páginas sucias en el disco (no todas, pero cuando estas páginas deberían estar en el disco). Esto hace que tales páginas estén limpias, por lo que se pueden descartar fácilmente (sin intercambiar o escribir en el disco), de modo que el núcleo pueda transformar rápidamente parte de la memoria de la memoria caché a la libre. Es un truco a muy corto plazo, para acortar las fases críticas (swapoff / umount).
Giacomo Catenazzi
2
La partición está en control directo del núcleo (bloque contiguo único, alineado). Archivos: existe el riesgo de no tener suficiente espacio contiguo o interferencia de otras utilidades del sistema). [y el sistema de archivos raíz ideal debe ser de solo lectura]. [Y a menudo es útil tener una partición temporal, para recuperar el sistema, o para algún manejo del sistema "invasivo", especialmente en máquinas remotas, o máquinas sin dispositivo de arranque fácil]. No es un requisito difícil, pero a menudo me resulta menos problemático tener una partición especial para eso [y para las máquinas RAID puede cambiar RAID, por velocidad]
Giacomo Catenazzi
1
El problema sigue siendo ... Hay mucha RAM libre, más que el tamaño TOTAL del archivo de intercambio. ¿Por qué no se puede desactivar el intercambio?
Paul Stelian

Respuestas:

1

Del estudio de caso: el intercambio no puede asignar memoria .

Si los procesos reservan más memoria que la suma del área de intercambio y (parte de) la RAM, y su sistema está configurado para no comprometer demasiado la memoria, la asignación falla. Esto puede suceder incluso si tiene mucha RAM libre y no está utilizando ninguna página en el área de intercambio.

Eduardo Trápani
fuente
@Patryk, ¿cómo está configurado tu sobrecompromiso?
Daniel Farrell
0

Si su archivo de intercambio está definido en /etc/fstab(y no en systemd-swap), simplemente elimine o comente la línea /etc/fstaby reinicie.

Si está utilizando systemd-swap para configurar el intercambio, configúrelo swapfc_enabled=0en la Swap File Chunkedsección de /etc/systemd/swap.confy reinicie.

embarcaciones Clayton
fuente
No creo que el hecho de que pueda activar el sistema sin un archivo de intercambio realmente responda a la pregunta de por qué el archivo de intercambio, si se usa, no se puede apagar.
ilkkachu
Reiniciar es una solución fácil si se puede tolerar
Daniel Farrell