Почему я не могу «поменяться», когда памяти достаточно?


10

Я недавно заметил, что, хотя в моей системе много памяти:

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

Я не могу swapoff -aс моим 2G swapfile

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

Я изменил следующие параметры ядра через, sysctlно это должно быть причиной:

vm.swappiness = 5
vm.vfs_cache_pressure = 200

Любая причина для:

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

? dmesgничего не регистрирует, когда swapoffвыходит из строя. Я использую ядро ​​Linux 4.19.20-041920-generic.


Другой пример, включающий /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

и 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

РЕДАКТИРОВАТЬ

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

Если ваша система подкачки, удаление раздела подкачки не решит никаких проблем. Вы просто создадите дополнительные проблемы (и кстати, лучше использовать раздел, чем файл). Вам может понадобиться найти момент, когда программы не обмениваются данными в этот файл. Может быть, вы должны остановить такие программы. Примечание: фрагментация памяти может быть причиной. Попробуйте также немного времени, syncчтобы уменьшить грязные страницы.
Джакомо

1
@GiacomoCatenazzi 1) Почему лучше использовать раздел, чем файл? 2) syncне меняет использование памяти ни на один бит
Patryk

1
syncзапишет грязные страницы на диск (не все, но когда эти страницы должны быть на диске). Это делает такие страницы чистыми, чтобы их можно было легко удалить (без подкачки или записи на диск), чтобы ядро ​​могло быстро преобразовать часть памяти из кэшированной в свободную. Это очень краткосрочный трюк, чтобы сократить критические фазы (своп / размонтирование).
Джакомо

2
Раздел находится под прямым контролем ядра (один непрерывный блок, выровненный). Файлы: существует риск нехватки свободного места или помех от других системных утилит). [и идеальная корневая файловая система должна быть доступна только для чтения]. [И часто полезно иметь временный раздел, для восстановления системы или для некоторой «инвазивной» обработки системы, особенно на удаленных машинах или машинах без легко загружаемого устройства]. Это не жесткие требования, но я обнаружил, что зачастую для них не так уж и сложно создать специальный раздел [и для RAID-машин вы можете разархивировать своп для скорости]
Giacomo

1
Проблема все еще ... Существует много свободной оперативной памяти, больше, чем ОБЩИЙ размер файла подкачки. Почему нельзя поменять своп?
Пол Стелян

Ответы:


1

Из тематического исследования: Swapoff не может выделить память .

Если процессы резервируют больше памяти, чем сумма области подкачки и (часть) ОЗУ, и ваша система настроена не перегружать память, распределение происходит неудачно. Это может произойти, даже если у вас достаточно свободной оперативной памяти и вы не используете страницы в области подкачки.


@Patryk, на что настроен твой сверхкомитет?
Даниэль Фаррелл

0

Если ваш файл подкачки определен в /etc/fstab(а не в systemd-swap), просто удалите или закомментируйте строку /etc/fstabи перезагрузите компьютер.

Если вы используете systemd-swap для настройки swap, установите его swapfc_enabled=0в Swap File Chunkedразделе /etc/systemd/swap.confи перезагрузите компьютер.


Я не думаю, что тот факт, что вы могли запустить систему без файла подкачки, действительно отвечает на вопрос, почему файл подкачки, если он используется, не может быть отключен.
ilkkachu

Перезагрузка - это простое решение, если его можно терпеть
Даниэль Фаррелл
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.