私はかなり定期的にメモリ不足に悩まされているデスクトップシステムを実行しているので、調査するように促されましたwhatそもそも問題の原因です。
問題は、メモリを消費する単一のプロセスがないにもかかわらず、システムがそれを使用可能として表示しないことです。さらに、システムはスワップを実行するため、メモリの負荷が実際に発生しているように見えます。困惑しているのは、ログアウトして再度ログアウトした後、使用量が通常(〜1GB使用)に戻るため、メモリリークではなく、ユーザーランドとカーネル間の奇妙な相互作用のように見えることです。
要するに:
free
によって使用されたと報告されたメモリ、キャッシュ/バッファを除く:3173960 kBそれは、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
4GBのRAM(物理メモリ)で、最大2,025,976 kB(それぞれ約2 GB)の2つのzramデバイスがあります。zramは使用可能なメモリを使用しています。内部は正確にはわかりませんが、 Linuxがページアウト(= RAMからzramにメモリを入れる)して空き領域を増やすが、メモリ内のzramの使用量が増えている)というシナリオを明確に想像できるメカニズムが何であれ、それはさらにページアウトし、zramの使用量がさらに増加し、zramがすべての物理メモリを消費するまで続きます。
どのシステムでも、ページングアウトによってカーネルに上記のポイントまでストレスがかからないため、zramのパフォーマンスが向上するというしきい値があると思います。
システムが100MBをスワップしたい場合、何が起こるかというと、この100MBがzramに入れられます。 50%少なく、つまり50MBに圧縮されるとしましょう。これは、システムが100 MBを解放したかったのに、50MBしか解放されなかったことを意味します。 Linuxは、メモリのチャンクをページアウトした(つまり、スワップに入れる)が、再度必要になったときに、「最適化」を実行でき、このメモリを再度ページインできますが、スワップにも保持できるという点で賢いです。したがって、メモリのこれらの部分をページアウトする必要が生じた直後に、スワップファイルへの高額な書き込みを回避できます。したがって、あなたの場合、Linuxが100 MBをzramに保持し、通常のRAMに戻す可能性があるため、システムはしばらくの間150MBを消費します。圧縮性の低いデータを含む大きなプログラムでこれを繰り返すと、すぐに悪夢になる可能性があります。ページアウトされるRAMの300 MBチャンクを想像し、各zramスワップで120MBを使用します。これは、Linuxが他の目的で300 MBのRAMを解放したかったが、(300-120-120 = 60)60 MBしか解放しなかったため、さらにページをページアウトしようとする可能性があることを意味しますなど、それぞれ最大2GBのRAM)を使用できる2つのzramがあるため、すべてのメモリが消費されるという問題があります。
それで、zramがらくたですか?いいえ、まったくありません。問題は、物理的なRAM)の合計サイズになるようにzramを構成したことです。これが問題です。25%を超えるIMHOを使用するようにzramを構成しないでください。物理RAM。つまり、zramスワップがいっぱいになった後も、ハードディスクスワップソリューションに依存する必要があります。
簡単な解決策は、両方のzramを減らして最大500 MBごとに処理し、約2〜3 GBのスワップファイルを追加して、カーネルが実際に使用されていないページをzramからこのスワップファイルに解放できるようにすることです。スワップファイルはRAMを使用せず、その圧力を弱めます。
zramディスクサイズの設定方法 に関する情報。
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
とsmem
の間で、キャッシュを使用していないメモリ間で約55MiBの(ほとんど)違いが生じます。
free -tm
コマンドは、tmpfsを介してバックアップされたファイルによるスワップの使用状況も表示します。 /tmp
フォルダーを空にできる場合、smem -t -k
のメモリ使用量はfree -tm
と同じである必要があります。