報告された使用済みメモリと総アプリケーションメモリ使用量の違い

報告された使用済みメモリと総アプリケーションメモリ使用量の違い

頻繁にメモリが不足するデスクトップシステムを実行していますが、これにより調査が必要になりました。最初にこの問題を引き起こしました。

問題は、どのプロセスもメモリを消費しませんが、システムはそれを利用可能としてマークしないことです。さらに、システムはスワップを実行するため、メモリの圧力が実際のように見えます。奇妙なことは、ログアウトしてから戻ってくると、使用量が正常に戻って(〜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

関連情報