何がメモリを消費するかを調べる方法は?

何がメモリを消費するかを調べる方法は?

私は複数のカスタムハードウェアが接続されているLinux(Ubuntu 14.04.3)を実行するシステム(x86_64ベース)を開発しました。私はカスタムハードウェア用のドライバと制御ソフトウェアを作成しました。

このシステムで長時間(数日)テストを実行した後、使用可能なメモリ量(コマンドで示されている)が着実にcat /proc/meminfo減少freeすることを確認しました。私のユーザースペースプロセスで使用されるメモリ量は適しています。ページキャッシュを消去しましたが、使用可能なメモリ量にほとんど影響はありませんでした。

システムを再起動し、簡単なテストを500回繰り返し、ページキャッシュを消去してから出力を/proc/meminfoファイルに書き込むスクリプトを作成しました。その後、このスクリプトを数日間実行していくつかのデータポイントを収集します。結果データを分析した後、空きメモリー(MemFree、MemAvailableも含む)の量は線形的に着実に減少し、他のカテゴリーはほぼ均一に保たれることが確認されました。ここに投稿するにはあまりにも多くのデータを収集しましたが、ここに最初と最後のデータポイントがあります。

                       _Run 1_     _Run 650_
MemTotal:              65738276    65738276
MemFree:               65182220    30881420
MemAvailable:          65124632    30824008
Buffers:                   2292        2064
Cached:                  101204      100816
SwapCached:                   0           0
Active:                  174772      195008
Inactive:                 82924       82444
Active(anon):            154304      174712
Inactive(anon):           66624       66628
Active(file):             20468       20296
Inactive(file):           16300       15816
Unevictable:                  0           0
Mlocked:                      0           0
SwapTotal:             66978812    66978812
SwapFree:              66978812    66978812
Dirty:                      188         184
Writeback:                    0           0
AnonPages:               154296      180848
Mapped:                   99760       99360
Shmem:                    66672       66676
Slab:                     46836       48352
SReclaimable:             17000       18008
SUnreclaim:               29836       30344
KernelStack:               4176        4128
PageTables:                7244        6680
NFS_Unstable:                 0           0
Bounce:                       0           0
WritebackTmp:                 0           0
CommitLimit:           99847948    99847948
Committed_AS:            433008      417576
VmallocTotal:       34359738367 34359738367
VmallocUsed:            1886988     1886956
VmallocChunk:       34357817344 34357817344
HardwareCorrupted:            0           0
AnonHugePages:           106496      126976
CmaTotal:                     0           0
CmaFree:                      0           0
HugePages_Total:              0           0
HugePages_Free:               0           0
HugePages_Rsvd:               0           0
HugePages_Surp:               0           0
Hugepagesize:              2048        2048
DirectMap4k:              93872       93872
DirectMap2M:            1894400     1894400
DirectMap1G:           67108864    67108864

システムの64GBのメモリの半分以上が何らかの方法で消費され、他のカテゴリでは大幅に増加していないようです。

問題を解決するために私がしたことは次のとおりです。

  • 私はカーネルメモリリークが私のドライバの1つによって引き起こされた可能性があるとすぐに疑い、すべてのドライバコードに感謝しました。私は明らかな問題を見ませんでした。
  • また、カーネルのkmemleakチェッカーを有効にし、前述のテストスクリプトを再実行しました。漏れが見つかりませんでした。
  • 最近有効にしましたページ所有者定期的な出力を収集しながらカーネル機能をデバッグし、スクリプトを再実行します。出力をソートして比較すると、わずかなデルタが表示されますが(私の計算によると、総デルタは10,872ページまたは約42 MBです)、消費された量はほぼ30 GBに近いです。

私は完全にパニックになり、すぐにアイデアが枯渇しました。

現在の状況に関するアイデアや、この問題を解決する方法に関する提案がある人はいますか?

ベストアンサー1

おすすめ記事