Pourquoi ne puis-je pas «échanger» quand il y a beaucoup de mémoire?

10

J'ai récemment remarqué que même s'il y avait beaucoup de mémoire sur mon système:

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

Je ne peux pas swapoff -aavec mon fichier d'échange 2G

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

J'ai changé les paramètres de noyau suivants via sysctlmais cela devrait être la cause:

vm.swappiness = 5
vm.vfs_cache_pressure = 200

N'importe quelle raison pour:

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

? dmesgn'enregistre rien en cas d' swapofféchec. J'utilise le noyau Linux 4.19.20-041920-generic.


Un autre exemple comprenant /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

et 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

ÉDITER

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
la source
Si votre système échange, la suppression de la partition d'échange ne résoudra aucun problème. Vous allez simplement créer des problèmes supplémentaires (et BTW, il est préférable d'utiliser une partition, puis un fichier). Vous devrez peut-être trouver un instant où les programmes n'échangent pas de données dans ce fichier. Vous devriez peut-être ARRÊTER de tels programmes. Remarque: la mémoire fragmentée pourrait être une raison. Essayez peut-être aussi peu de temps avec syncpour réduire les pages sales.
Giacomo Catenazzi
1
@GiacomoCatenazzi 1) Pourquoi vaut-il mieux utiliser une partition qu'un fichier? 2) syncne modifie pas l'utilisation de la mémoire d'un bit
Patryk
1
syncva écrire des pages sales sur le disque (pas toutes, mais quand ces pages devraient être sur le disque). Cela rend ces pages propres, afin qu'elles puissent être supprimées facilement (sans échange, ni écriture sur le disque), afin que le noyau puisse rapidement transformer une partie de la mémoire de la mémoire cache en mémoire libre. C'est une astuce à très court terme, pour raccourcir les phases critiques (swapoff / umount).
Giacomo Catenazzi
2
La partition est en contrôle direct du noyau (bloc contigu unique, aligné). Fichiers: il y a risque de ne pas avoir suffisamment d'espace contigu ou d'interférence avec d'autres utilitaires système). [et le système de fichiers racine idéal devrait être en lecture seule]. [Et souvent, il est utile d'avoir une partition temporaire, de récupérer le système, ou de gérer certains systèmes "invasifs", en particulier sur les machines distantes, ou les machines sans périphérique de démarrage facile]. Pas une exigence difficile, mais j'ai trouvé très souvent moins problématique d'avoir une partition spéciale pour cela [et pour les machines RAID, vous pouvez annuler l'échange, pour la vitesse]
Giacomo Catenazzi
1
Le problème est toujours ... Il y a beaucoup de RAM libre, plus que la taille TOTALE du fichier d'échange. Pourquoi le swap ne peut-il pas être désactivé?
Paul Stelian

Réponses:

1

De l' étude de cas: Swapoff ne peut pas allouer de mémoire .

Si les processus réservent plus de mémoire que la somme de la zone de swap et (une partie de) la RAM, et que votre système est configuré pour ne pas surcharger la mémoire, l'allocation échoue. Cela peut se produire même si vous disposez de suffisamment de RAM et que vous n'utilisez aucune page de la zone de swap.

Eduardo Trápani
la source
@Patryk, à quoi votre sur-engagement est-il réglé?
Daniel Farrell
0

Si votre fichier d'échange est défini dans /etc/fstab(et non dans systemd-swap), supprimez ou commentez simplement la ligne /etc/fstabet redémarrez.

Si vous utilisez systemd-swap pour configurer l'échange, définissez-le swapfc_enabled=0dans la Swap File Chunkedsection /etc/systemd/swap.confet redémarrez.

artisanat de Clayton
la source
Je ne pense pas que le fait que vous puissiez mettre le système en place sans fichier d'échange répond vraiment à la question de savoir pourquoi le fichier d'échange, s'il est utilisé, ne peut pas être désactivé.
ilkkachu
Le redémarrage est une solution facile si elle peut être tolérée
Daniel Farrell