make -j `nproc` を使用すると、ページフォルト数が急増します。

make -j `nproc` を使用すると、ページフォルト数が急増します。

私は最高のコンパイル時間を得るためにGNU Makeが使用できるようにする必要がある作業の数を理解するためにベンチマークを実行しています。そのために、make -j<N>Nが1から17の整数であるGlibcをコンパイルしました。これまで、各N選択に対してこれを35回行いました(合計35 * 17 = 595回)。私も走っています。GNU時間Makeが費やす時間と使用するリソースを決定します。

結果データを分析してみたところ、何か奇妙なことがわかりました。私がそこに着いたとき、主要なページエラーの数が著しく急増しました-j8

メインページエラーの平均数

また、8はマイコンピュータのCPUコア数(またはより具体的にはハイパースレッド数)であることに注意する必要があります。

自発的なコンテキスト切り替え回数でも同じ現象を見ることができるが、目立たない。

自発的なコンテキスト遷移の平均数

私のデータが歪んでいないことを確認するためにもう一度テストを実行しましたが、それでも同じ結果が得られました。

私はLinuxカーネル5.15.12を使ってartix Linuxを実行しています。

このようなスパイクの理由は何ですか?

編集:4コアPCで同じ実験を再実行しました。今回は4つの職業で同じ現象が観察されました。

4コアCPUの主要ページエラー平均数

また、2つのタスクマークで主なページエラーが急増していることを確認してください。

4コアCPUの平均自発的なコンテキストスイッチ数

編集2:

@FrédéricLoyerは、ページエラーを効率(所要時間の逆数)と比較することを提案しました。以下はボックス図です。

1/秒単位の逆経過リアルタイム(壁時計)ボックス図

1つの職業から4つの職業に行くと、効率がますます良くなることがわかります。しかし、より多くの職業では、本質的に同じままです。

また、私のシステムには十分なメモリがあるため、最大操作数にもかかわらずメモリが不足しません。私はまた、PRSS(ピーク常駐セットサイズ)を記録しました。

最大常駐セットサイズ(KB)のボックス図

ジョブ数がメモリ使用量にまったく影響しないことがわかります。

編集3:MC68020が提案したように、4コアおよび8コアシステムのTLBS(トランザクション参照バッファノックダウン)値のプロットは次のとおりです。

トランザクション予測バッファの中断 - 4コア

トランザクション予測バッファのシャットダウン - 8コア

ベストアンサー1

グローバル効率を示すグラフがあなたの仕事に正しい答えを提供するので、集中的に説明するよう努めます。

A/効率性\作業配置

理論的には(makeが起動したときにすべてのCPUがアイドル状態で、他のジョブが実行されておらず、n> iが開始されたときにiジョブが完了していないと仮定します)、CFSは1,2,3、Jobs 4,5を展開すると予想されますできます。 、6、7、8はCPU 0、2、4、6(キャッシュ共有の利点がないため)に割り当てられ、その後は1、3、5、7(キャッシュ共有の利点はまだありませんが、ピア間でキャッシュが共有されます。したがって、ロックは競合を増加させ、グローバル効率に悪影響を及ぼします。)これは、タスク5からグローバル効率が向上しないことを説明するのに十分ですか?

B/ページエラー

Frédéric Loyerが説明したように、作業の開始時に主なページエラーが予想されます(必要な読み取りシステム呼び出しによる)。チャートによると、5つから8つの雇用の成長はほぼ一定です。私の意見では、4 + 4コアの-j4の大幅な増加(2 + 2コアの-j2の大幅な増加として確認されています)がより興味深いです。これは、一部の<= 4 CPUで突然の活動が原因で(他のタスクによって)> 4 CPUでジョブスレッドが再スケジュールされたという証拠かもしれませんか? -j(n> 8)には、すべてのオプションのCPUにすでに適切なマッピングがあるため、ページエラーの数は一定です。


注:ギターへの私の要求を正当化するためです。 OPのコメントから情報を軽減し、まずすべてのコアが完全に機能していることを確認したいと思います。そんなようです。

おすすめ記事