ทำไมฉันถึงไม่สามารถ“ swapoff” เมื่อมีหน่วยความจำมากมาย


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ใช้ swapfile 2G ของฉันได้

-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ล้มเหลว 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 +++

หากระบบของคุณทำการสลับการถอด swap partition จะไม่ช่วยแก้ปัญหาใด ๆ คุณเพิ่งจะสร้างปัญหาเพิ่มเติม (และ BTW มันจะดีกว่าที่จะใช้พาร์ทิชันแล้วไฟล์) คุณอาจต้องค้นหาข้อมูลทันทีที่โปรแกรมไม่ได้ทำการแลกเปลี่ยนข้อมูลลงในไฟล์นั้น บางทีคุณควรหยุดโปรแกรมดังกล่าว หมายเหตุ: หน่วยความจำที่กระจัดกระจายอาจเป็นเหตุผล ลองใช้เวลาสักครู่syncเพื่อลดหน้าสกปรก
Giacomo Catenazzi

1
@GiacomoCatenazzi 1) ทำไมจึงควรใช้พาร์ติชันมากกว่าไฟล์ 2) syncไม่เปลี่ยนการใช้งานหน่วยความจำหนึ่งบิต
Patryk

1
syncจะเขียนหน้าสกปรกไปยังดิสก์ (ไม่ใช่ทั้งหมด แต่เมื่อหน้าเหล่านี้ควรอยู่บนดิสก์) ทำให้หน้าเว็บดังกล่าวสะอาดดังนั้นจึงสามารถทิ้งได้อย่างง่ายดาย (โดยไม่ต้องสลับหรือเขียนไปยังดิสก์) ดังนั้นเคอร์เนลจึงสามารถเปลี่ยนส่วนของหน่วยความจำได้อย่างรวดเร็วจากแคชเป็นอิสระ มันเป็นกลอุบายระยะสั้นมากเพื่อลดขั้นตอนที่สำคัญลง (swapoff / umount)
Giacomo Catenazzi

2
พาร์ทิชันอยู่ในการควบคุมโดยตรงของเคอร์เนล (บล็อกที่อยู่ติดกันเดียวจัดชิด) ไฟล์: มีความเสี่ยงที่จะไม่มีพื้นที่ต่อเนื่องเพียงพอหรือมีสัญญาณรบกวนจากระบบสาธารณูปโภคอื่น ๆ ) [และระบบไฟล์รูทในอุดมคติควรเป็นแบบอ่านอย่างเดียว] [และบ่อยครั้งที่มันมีประโยชน์ที่จะมีพาร์ติชันชั่วคราวเพื่อกู้คืนระบบหรือเพื่อการจัดการระบบ "รุกราน" บางอย่างโดยเฉพาะในเครื่องระยะไกลหรือเครื่องที่ไม่มีอุปกรณ์ที่สามารถบู๊ตได้ง่าย] ไม่ใช่ข้อกำหนดที่ยาก แต่ฉันพบว่ามีปัญหาน้อยกว่ามากที่จะมีพาร์ติชันพิเศษสำหรับ [และสำหรับเครื่อง RAID ที่คุณสามารถถอดสลับได้เพื่อความเร็ว]
Giacomo Catenazzi

1
ปัญหายังคงมีอยู่ ... มี RAM ฟรีมากมายมากกว่าขนาดทั้งหมดของไฟล์ swap เหตุใดจึงไม่สามารถปิดใช้งานการสลับได้
Paul Stelian

คำตอบ:


1

จากกรณีศึกษา: Swapoff ไม่สามารถจัดสรรหน่วยความจำได้

หากกระบวนการสำรองหน่วยความจำมากกว่าผลรวมของพื้นที่สลับและ (ส่วนหนึ่งของ) RAM และระบบของคุณถูกกำหนดค่าไม่ให้ใช้หน่วยความจำเกินขนาดการจัดสรรจะล้มเหลว สิ่งนี้สามารถเกิดขึ้นได้แม้ในขณะที่คุณมี RAM จำนวนมากและไม่ได้ใช้หน้าใด ๆ บนพื้นที่สลับ


@ Patryk overcommit ของคุณตั้งเป็นอะไร
Daniel Farrell

0

หากไฟล์ swap ของคุณถูกกำหนดใน/etc/fstab(และไม่ใช่ใน systemd-swap) ให้ลบหรือใส่เครื่องหมายบรรทัดใน/etc/fstabและรีบูต

หากคุณใช้ systemd-swap เพื่อกำหนดค่าการสลับจากนั้นตั้งค่าswapfc_enabled=0ในSwap File Chunkedส่วนของ/etc/systemd/swap.confและรีบูต


ฉันไม่คิดว่าความจริงที่ว่าคุณสามารถนำระบบขึ้นมาได้โดยไม่ต้องใช้ไฟล์สวอปตอบคำถามจริง ๆว่าทำไมไฟล์สวอปหากใช้ไม่สามารถปิดได้
ilkkachu

การรีบูตเครื่องเป็นวิธีที่ง่ายถ้าสามารถทนได้
Daniel Farrell
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.