
システムでジョブを実行するためのメモリ割り当て数を計算するLinuxカーネルが提供するカウンタを探しています。私は、マシンのいくつかのタスクがループにメモリを割り当てるなど、愚かなタスクを実行するタイミングを検出するために、Prometheusを使用してこのカウンタの変更を高速に観察したいと思います。
機械の現在の状態を表す数値であるゲージのように見えるさまざまなインジケーターが見つかりました。例えば とnr_free_pages
がありますkbhugused
。これは、現在利用可能または使用されているアイテムの量を測定しますが、ページを割り当てて再度解放する操作によって測定器が変更されないため、私にはほとんど役に立ちません。
IRCで私が見つけたアイデアの1つは、呼び出し回数を記録するカウンタがあることでしたbrk(2)
。すぐに見つかりました。メモリの割り当てに使用される唯一のシステムコールではありません。
今を見ていますが、pgalloc_normal
正確に/proc/vmstat
何を測定しているのかをまだ把握していません。
なぜ私たちは巨大なメモリ割り当て率を探していますか?メモリ割り当てにはコストがかかるためです。カーネル空間を切り替える必要があるだけでなく、カーネルにはシステムが2つのCPU、80のデータ実行スレッドを並列に処理することからメモリを割り当てる1つのスレッドに切り替えることができる多くのロックがあります。これは私たちが接して集中したい実際のシナリオです。
答え1
私が知っている限り、まだ既知のカウンタはありませんが、システムコールを追跡する方法はいくつかあります。最も簡単な方法は以下を使用することですperf
。
sudo perf stat -e syscalls:sys_enter_mmap -e syscalls:sys_enter_brk -I 1000 -a
これには、通話数mmap
と1秒あたりの通話数が表示されます。brk
このバリエーションを使用すると、すべてのシステムコールを追跡できます。
sudo perf stat -e 'syscalls:sys_enter_*' -I 1000 -a
-p
特定のプロセスを監視する代わりに、関連するpidを使用することもできます-a
。