Perché non posso "scambiare" quando c'è molta memoria?


10

Di recente ho notato che anche se sul mio sistema c'è molta memoria:

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

Non riesco swapoff -acon il mio file di scambio 2G

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

Ho modificato i seguenti parametri del kernel tramite sysctlma quella dovrebbe essere la causa:

vm.swappiness = 5
vm.vfs_cache_pressure = 200

Qualsiasi motivo per:

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

? dmesgnon registra nulla quando swapofffallisce. Sto usando il kernel Linux 4.19.20-041920-generic.


Un altro esempio incluso /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

MODIFICARE

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 +++

Se il sistema sta eseguendo lo swapping, la rimozione della partizione di swap non risolverà alcun problema. Creerai solo altri problemi (e BTW è meglio usare una partizione, quindi un file). Potrebbe essere necessario trovare un istante in cui i programmi non scambiano dati in quel file. Forse dovresti interrompere tali programmi. Nota: la memoria frammentata potrebbe essere un motivo. Prova forse anche un po 'di tempo synca ridurre le pagine sporche.
Giacomo Catenazzi,

1
@GiacomoCatenazzi 1) Perché è meglio usare una partizione piuttosto che un file? 2) syncnon modifica l'utilizzo della memoria di un bit
Patryk,

1
syncscriverà pagine sporche sul disco (non tutte, ma quando queste pagine dovrebbero essere sul disco). Questo rende pulite tali pagine, in modo che possano essere scartate facilmente (senza scambiare o scrivere su disco), così il kernel può trasformare rapidamente parte della memoria da cache a libera. È un trucco a brevissimo termine per abbreviare le fasi critiche (swapoff / umount).
Giacomo Catenazzi,

2
La partizione controlla direttamente il kernel (blocco singolo contiguo, allineato). File: c'è il rischio di non avere abbastanza spazio contiguo o interferenze da altre utilità di sistema). [e il filesystem di root ideale dovrebbe essere di sola lettura]. [E spesso è utile disporre di una partizione temporanea, per ripristinare il sistema o per una gestione "invasiva" del sistema, in particolare su macchine remote o macchine senza dispositivo di avvio facile]. Non è un requisito difficile, ma ho trovato molto spesso meno problematico avere una partizione speciale per quello [e per le macchine RAID è possibile annullare lo scambio, per la velocità]
Giacomo Catenazzi,

1
Il problema è ancora ... C'è molta RAM libera, più della dimensione TOTALE del file di scambio. Perché lo scambio non può essere disabilitato?
Paul Stelian,

Risposte:


1

Dal case study: Swapoff non può allocare memoria .

Se i processi riservano più memoria della somma dell'area di scambio e (parte della) RAM e il sistema è configurato per non eseguire il commit eccessivo della memoria, l'allocazione non riesce. Questo può accadere anche quando hai molta RAM libera e non stai usando alcuna pagina nell'area di scambio.


@Patryk, a cosa è impostato il tuo overcommit?
Daniel Farrell,

0

Se il tuo file di scambio è definito in /etc/fstab(e non in systemd-swap), rimuovi o commenta la linea /etc/fstabe riavvia.

Se si utilizza systemd-swap per configurare swap, impostare swapfc_enabled=0nella Swap File Chunkedsezione /etc/systemd/swap.confe riavviare.


Non credo che il fatto di poter aprire il sistema senza un file di scambio risponda davvero alla domanda sul perché il file di scambio, se utilizzato, non può essere disattivato.
ilkkachu,

Il riavvio è una soluzione semplice se può essere tollerato
Daniel Farrell,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.