Rywalizacja o blokadę podczas przydzielania pamięci obszaru roboczego
Tutaj zaczyna się dobrze bawić. Opisałem już, że praca sortowania i mieszania w pamięci obszaru roboczego zużywa procesor, ale nie znajduje odzwierciedlenia w liczbach wyszukiwania bpool.
Spór o blokadę to kolejna warstwa tej szczególnej zabawy. Gdy pamięć zostanie skradziona z puli buforów i przydzielona do użycia z przyznaniem pamięci zapytania, dostęp do pamięci jest szeregowany za pomocą blokady. Domyślnie dzieje się tak z zasobem podzielonym na partycje na poziomie węzła NUMA. Tak więc każde zapytanie w tym samym węźle NUMA korzystającym z pamięci obszaru roboczego może potencjalnie doświadczyć rywalizacji o blokadę podczas kradzieży pamięci przeciwko grantom. Bardzo ważne, aby pamiętać: nie jest to ryzyko rywalizacji „jeden raz na zapytanie”, tak jak byłoby, gdyby punkt rywalizacji był w momencie faktycznego przyznania. Raczej jest, gdy pamięć zostaje skradziona w stosunku do grantu - więc zapytanie z bardzo dużym przydziałem pamięci będzie miało wiele możliwości rywalizacji o spinlock, jeśli wykorzysta większość grantu.
Flaga śledzenia 8048 ma świetną robotę w łagodzeniu tego sporu poprzez dalsze dzielenie zasobu na poziomie podstawowym.
Microsoft mówi „rozważ flagę śledzenia 8048, jeśli 8 lub więcej rdzeni na gniazdo”. Ale ... tak naprawdę nie chodzi o liczbę rdzeni na gniazdo (o ile jest ich wiele), ale raczej o liczbę okazji do rywalizacji w pracy wykonywanej na jednym węźle NUMA.
Na przyklejonych procesorach AMD (12 rdzeni na gniazdo, 2 węzły NUMA na gniazdo) było 6 rdzeni na węzeł NUMA. Widziałem system z 4 tymi procesorami (czyli osiem węzłów NUMA, każdy po 6 rdzeni), który został zablokowany w konwoju spinlocka do momentu włączenia flagi śledzenia 8048.
Widziałem tę rywalizację o spinlock zmniejszającą wydajność na maszynach wirtualnych tak małych jak 4 vCPU. Flaga śledzenia 8048 działała tak, jak powinna, gdy była włączona w tych systemach.
Biorąc pod uwagę, że istnieją jeszcze jakieś 4 procesory o zoptymalizowanej częstotliwości rdzeniowej, przy odpowiednim obciążeniu, skorzystaliby również z flagi śledzenia 8048.
CMEMTHREAD czeka wraz z typem sporu o blokadę, który łagodzi flagę śledzenia 8048. Ale słowo ostrzeżenia: CMEMTHREAD czeka, co potwierdza, a nie jest podstawową przyczyną tego konkretnego problemu. Widziałem systemy z dużymi „początkami oczekiwania” CMEMTHREAD, w których flaga śledzenia 8048 i / lub 9024 były opóźnione we wdrożeniu, ponieważ skumulowany czas oczekiwania CMEMTHREAD był dość krótki. W przypadku spinlocków skumulowany czas oczekiwania jest zwykle niewłaściwy. Zamiast tego chcesz spojrzeć na zmarnowany czas procesora - reprezentowany głównie przez same spiny, a następnie przez powiązane oczekiwania, które reprezentują potencjalnie niepotrzebne przełączniki kontekstu.