頻繁にメモリが不足するデスクトップシステムを実行していますが、これにより調査が必要になりました。何最初にこの問題を引き起こしました。
問題は、どのプロセスもメモリを消費しませんが、システムはそれを利用可能としてマークしないことです。さらに、システムはスワップを実行するため、メモリの圧力が実際のように見えます。奇妙なことは、ログアウトしてから戻ってくると、使用量が正常に戻って(〜1 GBを使用)メモリリークではなく、ユーザースペースとカーネル間の奇妙な対話のように見えることです。
簡単に言うと:
- キャッシュ/バッファを除く報告されたメモリ使用量
free
:3173960kB - すべてのアプリケーションの合計USS:2413952kB
- SLABサイズ:158968kB
- zram(圧縮): 75992kB
これは3173960-2413952-158968-75992 = 525048 kB
計算されていないメモリ使用量を提供します。
私は何を見逃したり計算していませんか?
総アプリケーションメモリ使用量:
# smem -t | sed -n '1p;$p'
PID User Command Swap USS PSS RSS
108 6 244524 2413952 2461340 2648488
報告されたメモリ使用量free
:
# free -k
total used free shared buffers cached
Mem: 4051956 3449748 602208 0 26548 249240
-/+ buffers/cache: 3173960 877996
Swap: 4051952 242592 3809360
一般的なメモリ統計:
# cat /proc/meminfo
MemTotal: 4051956 kB
MemFree: 612260 kB
Buffers: 26636 kB
Cached: 249304 kB
SwapCached: 107892 kB
Active: 1774004 kB
Inactive: 885268 kB
Active(anon): 1712484 kB
Inactive(anon): 710788 kB
Active(file): 61520 kB
Inactive(file): 174480 kB
Unevictable: 9332 kB
Mlocked: 9332 kB
SwapTotal: 4051952 kB
SwapFree: 3809368 kB
Dirty: 40 kB
Writeback: 0 kB
AnonPages: 2343292 kB
Mapped: 95288 kB
Shmem: 36396 kB
Slab: 158968 kB
SReclaimable: 53900 kB
SUnreclaim: 105068 kB
KernelStack: 3528 kB
PageTables: 43600 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 6077928 kB
Committed_AS: 4013288 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 139852 kB
VmallocChunk: 34359570976 kB
HardwareCorrupted: 0 kB
AnonHugePages: 641024 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 2310848 kB
DirectMap2M: 1882112 kB
スワップが開いていますzram
:
# cat /proc/swaps
Filename Type Size Used Priority
/dev/zram0 partition 2025976 121252 100
/dev/zram1 partition 2025976 121324 100
# awk ' { print $0 / 1024; sum+=$0 } END { print "sum:" sum/1024 } ' /sys/block/zram*/compr_data_size
37962.4
38030.1
sum:75992.5
答え1
質問
4GBのRAM(物理メモリ)と最大2,025,976kB(それぞれ約2GB)の2つのzramデバイスがあります。 zramは利用可能なメモリを使用しており、内部的に何が起こっているのか正確にはわかりませんが、メカニズムが何であれシナリオを明確に想像できます。 Linux ページングアウト (= RAM の一部のメモリを zram に追加) により、より多くの空き領域を確保し、その後 zram 使用メモリのメモリが増え続けるため、より多くページングされ zram 使用量がさらに増加し、zram がすべての物理メモリを使い果たされるまで続きます。
上記のように、ページングがカーネルにストレスを与えないすべてのシステムにしきい値があるため、zramはパフォーマンスを向上させることができると思います。
コメント
システムが100MBを交換しようとすると、100MBがzramに保存されます。 50%、つまり50MBに圧縮されたとしましょう。これは、システムが100 MBを確保しようとしましたが、50 MBのみが確保されたことを意味します。 Linuxは、メモリスニペットをページアウトするとき(したがってスワップに入れる)、メモリが再び必要になったときにそのメモリを再ページングすることができますが、スワップに保持することができる「最適化」を実行できるという点でスマートです。メモリのその部分をすぐにページアウトする必要がある場合は、スワップファイルへの高価な書き込みを回避できます。したがって、あなたの場合、Linuxはzramに100MBを維持し、再び通常のRAMに入れることができるので、システムは一時的に150MBを消費します。圧縮可能なデータが少ない大規模プログラムに対してこれを繰り返すと、これは急速に悪夢になる可能性があります。ページアウトされる300MBのRAMブロックと各zramスワップに120MBが使用されていることを想像してください。これは、Linuxが他の目的のために300 MBのRAMを確保しようとしましたが、60 MBのみを確保した場合(300-120-120 = 60)、より多くのページをページアウトしようとする可能性があることを意味します。問題は次のとおりです。 2つのzram、各zramは最大2 GBのRAMを使用できるため、メモリを使い果たします。
結論と解決策
だからzramはゴミですか?いいえ、まったくありません。問題は、zramを物理RAMとまったく同じフルサイズに設定したことです。それが問題です。 IMHO物理RAMの25%以上を使用するようにzramを設定しないでください。つまり、zramスワップがいっぱいになると、ハードドライブスワップソリューションに依存し続けなければならないということです。
簡単な解決策はzramを減らし、それぞれ最大500 MBを処理し、約2〜3 GBのスワップファイルを追加して、カーネルが実際に使用されていないページをzramからこのスワップファイルにリリースできるようにすることです。スワップファイルはRAMを使用しないため、RAMへの負担が軽減されます。
いくつかの情報zramディスクサイズを設定する方法。
答え2
smem
実際に使用されているメモリを見ることができますが、「システム」モードでのみ可能であることがわかりました。
# smem -tw
Area Used Cache Noncache
firmware/hardware 0 0 0
kernel image 0 0 0
kernel dynamic memory 1200240 379444 820796
userspace memory 2101184 136800 1964384
free memory 750532 750532 0
----------------------------------------------------------
4051956 1266776 2785180
# free -k
total used free shared buffers cached
Mem: 4051956 3298200 753756 0 31664 425552
-/+ buffers/cache: 2840984 1210972
Swap: 4051952 237368 3814584
free
これにより、キャッシュされていないメモリと使用されているメモリの間に約55MiBの差が生じますsmem
。
答え3
このfree -tm
コマンドは、tmpfs がサポートするファイルのスワップ使用量も表示します。フォルダを空にできる場合は、/tmp
メモリ使用量はsmem -t -k
似ていますfree -tm
。