Cgroup とプロセスのメモリ統計が一致しません。

Cgroup とプロセスのメモリ統計が一致しません。

サービスが多すぎるメモリを使用していることを確認するために監視を設定しようとしています。メモリ使用量は、次の2つの場所から読み取ることができます。

  • pid/proc/<pid>/statusまたは
  • /sys/fs/cgroup/<group-id>/memory.statコントロールグループの場合は実行されました。

サービスはsystemdによって開始されるため、独自の制御グループがあり、時には統計に含める必要がある子プロセスを開始し、ルートが再起動後も持続するため、制御グループ統計がより適切です。

残念ながら、数字が一致しないようです。サブプロセスなしで実行した場合の値の例は次のとおりです(コマンドは、サービス名を除いて実行したものとまったく同じであり、非メモリー関連項目を削除したことを除いて結果は得られたものとまったく同じです)。

# cat /sys/fs/cgroup/system.slice/some.service/memory.stat /proc/$(cat /sys/fs/cgroup/system.slice/some.service/cgroup.procs)/status
anon 5873664
file 2408448
kernel_stack 491520
slab 962560
sock 0
shmem 61440
file_mapped 405504
file_dirty 0
file_writeback 0
inactive_anon 0
active_anon 5853184
inactive_file 1916928
active_file 360448
unevictable 0
slab_reclaimable 270336
slab_unreclaimable 692224
pgfault 60258
pgmajfault 99
pgrefill 0
pgscan 0
pgsteal 0
pgactivate 0
pgdeactivate 0
pglazyfree 0
pglazyfreed 0
workingset_refault 0
workingset_activate 0
workingset_nodereclaim 0
VmPeak:   494812 kB
VmSize:   494164 kB
VmLck:         0 kB
VmPin:         0 kB
VmHWM:     25836 kB
VmRSS:     25484 kB
RssAnon:            5468 kB
RssFile:           20016 kB
RssShmem:              0 kB
VmData:   464776 kB
VmStk:       132 kB
VmExe:       180 kB
VmLib:     23940 kB
VmPTE:       156 kB
VmSwap:        0 kB
voluntary_ctxt_switches:        9
nonvoluntary_ctxt_switches:     620

適切な値は、プロセス統計VmRSS(= RssAnon++ RssFile)から得られたと思います。ところがチームはプロセスに属しなければならず、チームはプロセスに属すべきだRssShmemと思うが、二つが一致しません。 5736KBですが、ファイルの場合、違いは5468KBに過ぎず、2352KBに過ぎませんが、20016KBとほぼ10倍の差があります。anonRssAnonfileRssFileanonRssAnonfileRssFile

+++とほぼ一致するmemory.current値を持つファイルもありますが、プロセスの状態に一致する値は表示されません。anonfilekernel_stackslabsockshmem

それでは、なぜこれらの数字はそんなに違うのでしょうか?そして、アプリケーションがシステムに加えるメモリ圧力がどれくらいになるかをよりよく示す数字は何ですか?

注:カーネル4.19.72では、cgroup2(少し古い組み込みBSP)を使用してください。

ベストアンサー1

~からコントロールグループv2ガイド:

メモリ領域は、それをインスタンス化したcgroupに割り当てられます。地域が解放されるまで、cgroupの責任は維持されます。プロセスを別のcgroupに移行しても、以前のcgroupからインスタンス化されても、メモリ使用量は新しいcgroupに移動されません。

メモリ領域は、他のcgroupに属するプロセスで使用できます。この領域がどのcgroupに含まれるかは定義されていません。ただし、時間が経つにつれて、メモリ領域は、高い回収圧力を回避するのに十分なメモリ空間を持つcgroupに含まれる可能性が高くなります。

fileしたがって、RssFilecgroupとinの違いから始めましょう/proc/<pid>/status

プロセスが20016KBファイルを開いた可能性がありますが、そのファイルページは以前にメモリキャッシュにあった可能性があります。他のプロセスでは、そのプロセスを開き、そのcgroupから料金を請求します。。したがって、20016KBのうち2352KBのみがcgroupによって課金され、残りは他のcgroup(および以前にこれらのファイルをロードしたプロセス)に属します。

anonRssAnonin cgroupsと/proc/<pid>/statusin 。

私が知っている限り、memory.currentすべてのカーネルの内部(たとえば、およびkernel_stack)はcgroupでのみ表示され、ユーザー空間のメモリ情報のみが表示されるslabため、これらの数値に関するプロセス固有の統計は表示されません。/proc/<pid>/status

おすすめ記事