web-dev-qa-db-ja.com

報告された使用済みメモリとアプリケーションメモリ使用量の合計の間の不一致

私はかなり定期的にメモリ不足に悩まされているデスクトップシステムを実行しているので、調査するように促されましたwhatそもそも問題の原因です。

問題は、メモリを消費する単一のプロセスがないにもかかわらず、システムがそれを使用可能として表示しないことです。さらに、システムはスワップを実行するため、メモリの負荷が実際に発生しているように見えます。困惑しているのは、ログアウトして再度ログアウトした後、使用量が通常(〜1GB使用)に戻るため、メモリリークではなく、ユーザーランドとカーネル間の奇妙な相互作用のように見えることです。

要するに:

  • freeによって使用されたと報告されたメモリ、キャッシュ/バッファを除く:3173960 kB
  • すべてのアプリケーションのUSSの合計:2413952 kB
  • スラブサイズ:158968 kB
  • zram(圧縮後):75992 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
4
Hubert Kario

問題

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ディスクサイズの設定方法 に関する情報。

1
Huygens

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

これにより、freesmemの間で、キャッシュを使用していないメモリ間で約55MiBの(ほとんど)違いが生じます。

0
Hubert Kario

free -tmコマンドは、tmpfsを介してバックアップされたファイルによるスワップの使用状況も表示します。 /tmpフォルダーを空にできる場合、smem -t -kのメモリ使用量はfree -tmと同じである必要があります。

0
vdboor