Warum kann ich nicht „tauschen“, wenn genügend Speicher vorhanden ist?

10

Ich habe kürzlich festgestellt, dass auf meinem System viel Speicher vorhanden ist:

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

Ich kann nicht swapoff -amit meiner 2G-Swap-Datei

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

Ich habe die folgenden Kernel-Parameter über geändert, sysctlaber das sollte die Ursache sein:

vm.swappiness = 5
vm.vfs_cache_pressure = 200

Jeder Grund für:

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

? dmesgprotokolliert nichts, wenn dies swapofffehlschlägt. Ich benutze Linux-Kernel 4.19.20-041920-generic.


Ein weiteres Beispiel einschließlich /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

und 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

BEARBEITEN

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
quelle
Wenn Ihr System austauscht, löst das Entfernen der Auslagerungspartition kein Problem. Sie werden nur zusätzliche Probleme erstellen (und übrigens ist es besser, eine Partition als eine Datei zu verwenden). Möglicherweise müssen Sie einen Moment finden, in dem Programme keine Daten in diese Datei austauschen. Vielleicht sollten Sie solche Programme stoppen. Hinweis: Fragmentierter Speicher kann ein Grund sein. Versuchen Sie vielleicht auch ein paar Mal mit sync, um schmutzige Seiten zu reduzieren.
Giacomo Catenazzi
1
@GiacomoCatenazzi 1) Warum ist es besser, eine Partition als eine Datei zu verwenden? 2) syncändert die Speicherauslastung nicht um ein Bit
Patryk
1
syncschreibt schmutzige Seiten auf die Festplatte (nicht alle, aber wenn diese Seiten auf der Festplatte sein sollten). Dadurch werden solche Seiten sauber, sodass sie leicht verworfen werden können (ohne sie auszutauschen oder auf die Festplatte zu schreiben), sodass der Kernel einen Teil des Speichers schnell von zwischengespeichert in frei umwandeln kann. Es ist ein sehr kurzfristiger Trick, kritische Phasen (Swapoff / Umount) zu verkürzen.
Giacomo Catenazzi
2
Die Partition hat die direkte Kontrolle über den Kernel (einzelner zusammenhängender Block, ausgerichtet). Dateien: Es besteht die Gefahr, dass nicht genügend zusammenhängender Speicherplatz vorhanden ist oder dass andere Systemdienstprogramme stören. [und das ideale Root-Dateisystem sollte schreibgeschützt sein]. [Und oft ist es nützlich, eine temporäre Partition zu haben, das System wiederherzustellen oder so etwas "invasives" Systemhandling, insbesondere auf Remote-Computern oder Computern ohne einfach bootfähiges Gerät]. Keine harten Anforderungen, aber ich fand es sehr oft weniger problematisch, eine spezielle Partition dafür zu haben [und für RAID-Maschinen können Sie den Swap-Austausch aus Geschwindigkeitsgründen aufheben]
Giacomo Catenazzi
1
Das Problem ist immer noch ... Es gibt viel freien Arbeitsspeicher, mehr als die Gesamtgröße der Auslagerungsdatei. Warum kann der Tausch nicht deaktiviert werden?
Paul Stelian

Antworten:

1

Aus der Fallstudie: Swapoff kann keinen Speicher zuordnen .

Wenn Prozesse mehr Speicher als die Summe aus Auslagerungsbereich und (Teil des) RAM reservieren und Ihr System so konfiguriert ist, dass der Speicher nicht überlastet wird, schlägt die Zuordnung fehl. Dies kann auch dann passieren, wenn Sie über ausreichend RAM verfügen und keine Seiten im Swap-Bereich verwenden.

Eduardo Trápani
quelle
@Patryk, auf was ist dein Overcommit eingestellt?
Daniel Farrell
0

Wenn Ihre Auslagerungsdatei in /etc/fstab(und nicht in systemd-swap) definiert ist, entfernen Sie einfach die Zeile in oder kommentieren Sie sie aus /etc/fstabund starten Sie sie neu.

Wenn Sie systemd-swap zum Konfigurieren von swap verwenden, legen Sie dies swapfc_enabled=0im Swap File ChunkedAbschnitt von fest /etc/systemd/swap.confund starten Sie es neu.

Clayton Handwerk
quelle
Ich glaube nicht, dass die Tatsache, dass Sie das System ohne eine Auslagerungsdatei starten könnten, wirklich die Frage beantwortet, warum die Auslagerungsdatei, wenn sie verwendet wird, nicht ausgeschaltet werden kann.
Ilkkachu
Ein Neustart ist eine einfache Lösung, wenn er toleriert werden kann
Daniel Farrell