나는 최근에 내 시스템에 많은 메모리가 있음에도 불구하고 다음과 같은 사실을 발견했습니다.
# 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
. 저는 리눅스 커널을 사용하고 있습니다 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