mm/slub.c
私のlinux_5.4カーネルのソースコード()コメントから次を読むことができます。
In order to reach satisfactory performance we must ensure that a minimum
number of objects is in one slab. Otherwise we may generate too much
activity on the partial lists which requires taking the list_lock. This is
less a concern for large slabs though which are rarely used.
私の理解「最小オブジェクト数」何があっても>0
linux-4で実装された一部のベンチマークでは、最適な値は2 * CPU数であるという事実もわかりました。
ドキュメント (Documentation/vm/slub.rst) から次を読むことができます。
.. slub_min_objects=x (既定値 4)
コアが 2 つの場合、このデフォルト値に満足します。しかし、私のブートログには次のようなものがあります。
SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=2, Nodes=1
もちろん、これをslub_min_objects=4
起動コマンドラインの一部に設定すると、MinObjects = 4を正常に取得できます。しかし、デフォルトがゼロになる理由を知りたいです。
0が実際に最適な値であることを証明するLinuxカーネルの他の部分で変更されたことはありますか?それとも実際には、より良いパフォーマンスのための条件として、これに対する注意をやめるべきですか?
アップデート1:@Paul_Pedantの最初のコメントに続き
ブートログの追跡は、次のガイドラインの結果であるようです。
pr_info("SLUB: HWalign=%d, Order=%u-%u, MinObjects=%u, CPUs=%u, Nodes=%u\n",cache_line_size(),slub_min_order, slub_max_order, slub_min_objects,nr_cpu_ids, nr_node_ids);
slub_min_orderは次のように設定されます。
get_option(&str, (int *)&slub_min_objects);
これは明らかにPaul_Pedantの推測を確認します。「ブートログがユーザー提供の値を報告しています。」
次のコードは、最小オブジェクト数を示すために使用される実際の値を示しています。
min_objects = slub_min_objects;
if (!min_objects)
min_objects = 4 * (fls(nr_cpu_ids) + 1);
つまり、起動コマンドラインパラメータまたはCPUの数によるデフォルト値です。私の例では(2 CPU、最も重要なセットビットの位置= 2):
最小オブジェクト数=4*(2+1)=12
4<=CPU<8のデフォルト値は16で、
8<=CPU<16のデフォルト値は20です.
ただし、文書化されたデフォルト値4は、おそらくシングルプロセッサシステムからのものです。
拡張の根拠を見つけることができれば、この問題は終わったと言えます。