메모리가 충분할 때 왜 "스왑 오프"할 수 없습니까?


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 -a2G 스왑 파일을 사용할 수 없습니다

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

시스템이 스와핑중인 경우 스왑 파티션을 제거해도 문제가 해결되지 않습니다. 추가 문제가 생길 것입니다 (BTW는 파티션을 사용한 다음 파일을 사용하는 것이 좋습니다). 프로그램이 데이터를 해당 파일로 바꾸지 않는 순간을 찾아야 할 수도 있습니다. 그런 프로그램을 중지해야 할 수도 있습니다. 참고 : 조각난 메모리가 원인 일 수 있습니다. sync더러워진 페이지를 줄이려면 몇 번 시도해보십시오 .
Giacomo Catenazzi 2019

1
@GiacomoCatenazzi 1) 파일보다 파티션을 사용하는 것이 더 좋은 이유는 무엇입니까? 2) sync메모리 사용률을 1 비트로 변경하지 않음
Patryk

1
sync더티 페이지를 디스크에 씁니다 (모두가 아니라 디스크에 있어야하는 경우). 이렇게하면 이러한 페이지가 깨끗해져 쉽게 스왑하거나 디스크에 쓰지 않고도 쉽게 버릴 수 있으므로 커널은 메모리의 일부를 캐시에서 무료로 빠르게 변환 할 수 있습니다. 임계 단계를 단축 (스왑 오프 / 마운트)하는 것은 매우 단기적인 요령입니다.
Giacomo Catenazzi 2019

2
파티션은 커널을 직접 제어합니다 (단일 연속 블록, 정렬 됨). 파일 : 공간이 충분하지 않거나 다른 시스템 유틸리티의 간섭이 없을 위험이 있습니다). [그리고 이상적인 루트 파일 시스템은 읽기 전용이어야합니다]. [그리고 종종 임시 파티션을 가지고 있거나, 시스템을 복구하거나, 특히 원격 시스템이나 부팅하기 쉬운 장치가없는 시스템에서 "침습적 인"시스템 처리에 유용합니다. 아닌 하드 요구 사항은,하지만 난 그것에 대해 특별한 파티션이 매우 자주 적은 문제가 발견 [및 RAID 기계 할 수 있습니다 unRAID 스왑, 속도]
자코모 Catenazzi

1
문제는 여전히 ... 스왑 파일의 총 크기보다 많은 여유 RAM이 많이 있습니다. 스왑을 비활성화 할 수없는 이유는 무엇입니까?
Paul Stelian

답변:


1

에서 사례 연구 : 후 swapoff는 메모리를 할당 할 수 없습니다 .

프로세스가 스왑 영역과 (일부) RAM의 합보다 많은 메모리를 예약하고 시스템이 메모리를 초과 커밋하지 않도록 구성된 경우 할당이 실패합니다. RAM 여유 공간이 많고 스왑 영역에서 페이지를 사용하지 않는 경우에도 발생할 수 있습니다.


@Patryk, 초과 커밋은 무엇으로 설정되어 있습니까?
Daniel Farrell

0

스왑 파일이 /etc/fstabsystemd-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.