Dlaczego nie mogę „zamienić”, gdy jest dużo pamięci?

10

Ostatnio zauważyłem, że chociaż w moim systemie jest dużo pamięci:

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

Nie mogę swapoff -az moim plikiem wymiany 2G

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

Zmieniłem następujące parametry jądra, sysctlale to powinno być przyczyną:

vm.swappiness = 5
vm.vfs_cache_pressure = 200

Dowolny powód:

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

? dmesgnie rejestruje niczego, gdy swapoffzawiedzie. Używam jądra Linuksa 4.19.20-041920-generic.


Kolejny przykład, w tym /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

i 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

EDYTOWAĆ

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
źródło
Jeśli system zamienia, usunięcie partycji wymiany nie rozwiąże żadnego problemu. Po prostu stworzysz dodatkowe problemy (a BTW lepiej jest użyć partycji, a potem pliku). Może być konieczne znalezienie chwili, w której programy nie zamieniają danych do tego pliku. Może powinieneś zatrzymać takie programy. Uwaga: przyczyną może być pofragmentowana pamięć. Spróbuj także może kilka razy, syncaby zmniejszyć liczbę brudnych stron.
Giacomo Catenazzi
1
@GiacomoCatenazzi 1) Dlaczego lepiej jest używać partycji niż pliku? 2) syncnie zmienia ani trochę wykorzystania pamięci
Patryk
1
synczapisze brudne strony na dysku (nie wszystkie, ale kiedy te strony powinny znajdować się na dysku). To sprawia, że ​​takie strony są czyste, dzięki czemu można je łatwo usunąć (bez zamiany lub zapisu na dysk), dzięki czemu jądro może szybko przekształcić część pamięci z pamięci podręcznej na wolną. Jest to bardzo krótkotrwała sztuczka polegająca na skróceniu krytycznych faz (zamiana / umount).
Giacomo Catenazzi
2
Partycja ma bezpośrednią kontrolę nad jądrem (pojedynczy ciągły blok, wyrównany). Pliki: istnieje ryzyko braku wystarczającej ilości ciągłego miejsca lub zakłóceń ze strony innych narzędzi systemowych). [i idealny główny system plików powinien być tylko do odczytu]. [I często przydatne jest posiadanie partycji tymczasowej, aby odzyskać system lub w ten sposób „inwazyjna” obsługa systemu, szczególnie na komputerach zdalnych lub komputerach bez łatwego urządzenia rozruchowego]. Nie jest to trudne wymaganie, ale bardzo często mniej problematyczne było posiadanie do tego specjalnej partycji [a dla maszyn RAID można wymontować zamianę, dla prędkości]
Giacomo Catenazzi
1
Problem nadal występuje ... Jest dużo wolnej pamięci RAM, więcej niż TOTALNY rozmiar pliku wymiany. Dlaczego nie można wyłączyć wymiany?
Paul Stelian

Odpowiedzi:

1

Z analizy przypadku: Swapoff nie może przydzielić pamięci .

Jeśli procesy rezerwują więcej pamięci niż suma obszaru wymiany i (części) pamięci RAM, a system jest skonfigurowany tak, aby nie przepełniał pamięci, alokacja nie powiedzie się. Może się to zdarzyć, nawet jeśli masz dużo wolnej pamięci RAM i nie używasz żadnych stron w obszarze wymiany.

Eduardo Trápani
źródło
@Patryk, na czym polega twoja nadkomisja?
Daniel Farrell,
0

Jeśli twój plik wymiany jest zdefiniowany w /etc/fstab(a nie w systemd-swap), po prostu usuń lub skomentuj linię /etc/fstabi uruchom ponownie.

Jeśli używasz systemd-swap, aby skonfigurować swap, ustaw go swapfc_enabled=0w Swap File Chunkedsekcji /etc/systemd/swap.confi uruchom ponownie.

statek Clayton
źródło
Nie sądzę, że fakt, że można uruchomić system bez pliku wymiany, naprawdę odpowiada na pytanie, dlaczego pliku wymiany, jeśli jest używany, nie można wyłączyć.
ilkkachu
Ponowne uruchomienie jest łatwym rozwiązaniem, jeśli można je tolerować
Daniel Farrell,