Mengapa saya tidak bisa "menukar" ketika ada banyak memori?


10

Saya baru-baru ini memperhatikan bahwa meskipun ada banyak memori pada sistem saya:

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

Saya tidak bisa swapoff -amenggunakan swapfile 2G saya

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

Saya telah mengubah parameter kernel berikut melalui sysctltetapi yang seharusnya menjadi penyebabnya:

vm.swappiness = 5
vm.vfs_cache_pressure = 200

Alasan apa pun untuk:

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

? dmesgtidak mencatat apa pun saat swapoffgagal. Saya menggunakan kernel linux 4.19.20-041920-generic.


Contoh lain termasuk /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

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

Jika sistem Anda bertukar, menghapus partisi swap tidak akan menyelesaikan masalah apa pun. Anda hanya akan membuat masalah tambahan (dan BTW lebih baik menggunakan partisi, lalu file). Anda mungkin perlu menemukan instan di mana program tidak bertukar data ke file itu. Mungkin Anda harus BERHENTI dengan program semacam itu. Catatan: memori yang terfragmentasi bisa menjadi alasan. Coba mungkin juga beberapa waktu dengan syncmengurangi halaman kotor.
Giacomo Catenazzi

1
@GiacomoCatenazzi 1) Mengapa lebih baik menggunakan partisi daripada file? 2) synctidak mengubah pemanfaatan memori sedikit pun
Patryk

1
syncakan menulis halaman kotor ke disk (tidak semua, tetapi ketika halaman ini harus di disk). Ini membuat halaman seperti itu bersih, sehingga mereka dapat dibuang dengan mudah (tanpa bertukar, atau menulis ke disk), sehingga kernel dapat dengan cepat mengubah bagian dari memori dari cache menjadi bebas. Ini adalah trik jangka pendek, untuk mempersingkat fase kritis (swapoff / umount).
Giacomo Catenazzi

2
Partisi berada dalam kendali langsung kernel (blok bersebelahan tunggal, sejajar). File: ada risiko tidak memiliki cukup ruang yang berdekatan atau gangguan dari utilitas sistem lain). [dan sistem file root yang ideal harus hanya baca]. [Dan seringkali berguna untuk memiliki partisi sementara, untuk memulihkan sistem, atau untuk beberapa penanganan sistem "invasif", terutama pada mesin jarak jauh, atau mesin tanpa perangkat bootable yang mudah]. Bukan persyaratan yang sulit, tetapi saya sering kali kurang bermasalah untuk memiliki partisi khusus untuk itu [dan untuk mesin RAID Anda dapat membatalkan pertukaran, untuk kecepatan]
Giacomo Catenazzi

1
Masalahnya masih ... Ada banyak RAM gratis, lebih dari ukuran TOTAL dari file swap. Mengapa swap tidak dapat dinonaktifkan?
Paul Stelian

Jawaban:



0

Jika file swap Anda didefinisikan dalam /etc/fstab(dan bukan dalam systemd-swap), maka hapus saja atau beri komentar pada baris /etc/fstabdan reboot.

Jika Anda menggunakan systemd-swap untuk mengkonfigurasi swap, maka atur swapfc_enabled=0di Swap File Chunkedbagian /etc/systemd/swap.confdan reboot.


Saya tidak berpikir fakta bahwa Anda dapat mengaktifkan sistem tanpa file swap benar-benar menjawab pertanyaan mengapa file swap, jika digunakan, tidak dapat dimatikan.
ilkkachu

Mem-boot ulang adalah solusi mudah jika bisa ditoleransi
Daniel Farrell
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.