![当内存充足时,为什么我不能“交换”?](https://linux22.com/image/147905/%E5%BD%93%E5%86%85%E5%AD%98%E5%85%85%E8%B6%B3%E6%97%B6%EF%BC%8C%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E4%B8%8D%E8%83%BD%E2%80%9C%E4%BA%A4%E6%8D%A2%E2%80%9D%EF%BC%9F.png)
我最近注意到,即使我的系统上有很多内存:
# 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 交换文件
-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 +++
答案1
如果进程保留的内存多于交换区和(部分)RAM 的总和,并且您的系统配置为不过度使用内存,则分配会失败。即使您有足够的可用 RAM 并且没有使用交换区域上的任何页面,也可能会发生这种情况。
答案2
如果您的交换文件是在/etc/fstab
(而不是在 systemd-swap 中)定义的,则只需删除或注释掉该行/etc/fstab
并重新启动即可。
如果您使用 systemd-swap 来配置交换,请swapfc_enabled=0
在Swap File Chunked
部分中进行设置/etc/systemd/swap.conf
并重新启动。