私のサーバーには24個のCPUコア、96Gメモリ、CentOS 7.2 x86_64がインストールされています。
プログラムをlargeデータセットで開始すると、プログラムは約50Gのメモリを使用し、Linuxシステムはシステム割り込みの発生率が高くなりますが、コンテキストの切り替え率は低くなります。 dstat
は、500k int/sから1000k int/sの間のどこかに表示されます。 CPU使用率は100%に近く、約40%は米国、60%はsyです。
データセットが小さい場合、プログラムは約5Gのメモリを使用し、CPU使用率が100%、約99%us、1%syのすべてが問題なく動作します。予想通りです。
プログラムは自分で作成したもので、マルチスレッドプログラムです。ネットワークIO、ディスクIOはほとんどなく、メモリ操作と演算はほとんど行われません。スレッドモデルとアルゴリズムは、データセットのサイズに関係なく同じです。
私の質問は、どの割り込みがプログラムで最も頻繁に使用されているかを正確に知るにはどうすればよいですか(可能な場合はパフォーマンスを向上させるためにそれらを削除します)?
24C CPUのシングルソケットシステムがないと思います。したがって、おそらく2x12CのNUMAシステムです。その場合、プログラムがnumaノード(通常はソケット)を1つだけ使用し、それがローカルのRAMの半分であることを確認することをお勧めします。
50Gを使用している場合は、メモリの半分以上であるため、沼の場所は保証されません。
実態確認にはnumastatをご利用ください。 RHELを使用している場合は、numadを使用してメモリの局所性を自動的に処理できます。または、numactl --hardwareを使用して、ハードウェアNUMAノードの概要を表示できます。例のある素敵なハウツーがあります:
http://fibrevillage.com/sysadmin/534-numactl-installation-and-examples
これにより、目的のCPUでプログラムをロックできます。
また、irqbalanceデーモンが実行されているかどうかを確認することをお勧めします。そうでない場合、1つのコアが割り込みで過負荷になっている可能性があります。
Linuxの場合:watch cat /proc/interrupts
は、割り込みおよびCPUごとの割り込み呼び出しの量を示します。あなたの場合、LOC(ローカルタイマー)とRES(再スケジュール)が表示されると思います。