十分なメモリがあるのになぜ「スワップオフ」できないのですか?


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

システムがスワップしている場合、スワップパーティションを削除しても問題は解決しません。追加の問題が発生するだけです(ところで、パーティションを使用してからファイルを使用することをお勧めします)。プログラムがデータをそのファイルにスワップしない瞬間を見つける必要があるかもしれません。たぶん、そのようなプログラムを停止する必要があります。注:メモリの断片化が原因である可能性があります。syncダーティページを減らすために、たぶん数時間も試してください。
Giacomo Catenazzi

1
@GiacomoCatenazzi 1)ファイルよりもパーティションを使用した方がよいのはなぜですか?2)syncメモリ使用率を1ビットも変更しない
Patryk

1
syncダーティページをディスクに書き込みます(すべてではありませんが、これらのページがディスク上にある必要がある場合)。これにより、そのようなページがクリーンになり、ページを簡単に(スワッピングしたりディスクに書き込んだりせずに)破棄できるため、カーネルはメモリの一部をキャッシュされたものから空きにすばやく変換できます。重要なフェーズ(スワップオフ/マウント)を短縮することは、非常に短期間のトリックです。
Giacomo Catenazzi

2
パーティションはカーネルの直接制御下にあります(単一の連続ブロック、整列)。ファイル:十分な連続スペースまたは他のシステムユーティリティからの干渉がないリスクがあります)。[理想的なルートファイルシステムは読み取り専用である必要があります]。[そして、特にリモートマシンや、簡単に起動できるデバイスがないマシンでは、一時的なパーティションを用意したり、システムを復旧したり、「侵入的」システムを処理したりするのに便利です。難しい要件ではありませんが、そのための特別なパーティションを用意することで問題が少なくなることがわかりました[RAIDマシンの場合は、RAIDスワップを解除して速度を上げることができます]
Giacomo Catenazzi

1
問題はまだです...スワップファイルの合計サイズよりも多くの空きRAMがあります。スワップを無効にできないのはなぜですか?
Paul Stelian

回答:


1

ケーススタディから:スワップオフはメモリを割り当てることができません

プロセスがスワップ領域とRAM(の一部)の合計よりも多くのメモリを予約し、システムがメモリをオーバーコミットしないように構成されている場合、割り当ては失敗します。これは、RAMが十分にあり、スワップ領域のページを使用していない場合でも発生する可能性があります。


@Patryk、あなたのオーバーコミットは何に設定されていますか?
Daniel Farrell

0

スワップファイルが/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.