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으로 떨어지는 이유를 알고 싶습니다.
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는 아마도 단일 프로세서 시스템에서 나온 것일 수 있습니다.
확장에 대한 근거를 찾을 수 있다면 이 문제는 끝났다고 할 수 있습니다.