Чому я не можу "обмінятися", коли достатньо пам'яті?


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

EDIT

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

Якщо ваша система здійснює обмін, видалення розділу swap не вирішить жодної проблеми. Ви просто створите додаткові проблеми (а BTW краще використовувати розділ, а потім файл). Можливо, вам доведеться знайти мить, коли програми не замінюють дані у цей файл. Можливо, вам варто зупинити такі програми. Примітка: фрагментарна пам'ять може бути причиною. Спробуйте, можливо, також небагато часу, syncщоб зменшити брудні сторінки.
Джакомо Катенацці

1
@GiacomoCatenazzi 1) Чому краще використовувати розділ, ніж файл? 2) syncне змінює використання пам'яті один біт
Patryk

1
syncзапише брудні сторінки на диск (не всі, але коли ці сторінки мають бути на диску). Це робить такі сторінки чистими, тому їх можна легко відкинути (без заміни або запису на диск), тому ядро ​​може швидко перетворити частину пам'яті з кешованої у вільну. Це дуже короткотривалий трюк, щоб скоротити критичні фази (swapoff / umount).
Джакомо Катенацці

2
Розділ знаходиться в прямому управлінні ядром (єдиний суміжний блок, вирівняний). Файли: є ризик не мати достатньо суміжного простору або перешкод з боку інших утиліт). [і ідеальна коренева файлова система повинна бути лише для читання]. [І часто буває корисно мати тимчасовий розділ, відновити систему чи інше "інвазивне" управління системою, особливо на віддалених машинах або машинах без легкого завантажувального пристрою]. Не жорсткі вимоги, але мені дуже часто виявляється менш проблематичним мати спеціальний розділ для цього [а для RAID-машин можна скасувати обмін, для швидкості]
Giacomo Catenazzi

1
Проблема все ще залишається… Безкоштовно оперативної пам’яті достатньо, ніж ОБ’ЄМНИЙ розмір файлу swap. Чому обмін не можна відключити?
Пол

Відповіді:


1

З прикладу дослідження: Swapoff не може виділити пам'ять .

Якщо процеси резервують більше пам’яті, ніж сума області підкачки та (частина) оперативної пам’яті, і ваша система налаштована не перезавантажувати пам’ять, розподіл не вдається. Це може статися навіть тоді, коли у вас є достатня кількість оперативної пам’яті та ви не використовуєте жодної сторінки в області підкачки.


@Patryk, на що налаштований ваш надмісний комітет?
Даніель Фаррелл

0

Якщо ваш файл swap визначений у /etc/fstab(а не в systemd-swap), просто видаліть або прокоментуйте рядок у /etc/fstabта перезавантажте.

Якщо ви використовуєте systemd-swap для налаштування swap, то встановіть його swapfc_enabled=0в Swap File Chunkedрозділі /etc/systemd/swap.confта перезавантажте.


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

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