slub_min_objects: 왜 0이 유효/기본/합리적인가요?

slub_min_objects: 왜 0이 유효/기본/합리적인가요?

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는 아마도 단일 프로세서 시스템에서 나온 것일 수 있습니다.

확장에 대한 근거를 찾을 수 있다면 이 문제는 끝났다고 할 수 있습니다.

관련 정보