Głębokość kolejki NVMe może zwiększyć szybkość wczytywania wektorów, udostępniając równoległe operacje pamięci masowej, ale korzyści znikają, gdy nasyci się inny etap lub samo urządzenie.
Osadzanie dużego domowego archiwum tworzy wektory, metadane, krawędzie grafu, wpisy, tymczasowe przebiegi i rekordy zatwierdzeń, a nie jeden sekwencyjny plik. Jeśli indeksator wysyła tylko jeden zapis i czeka, szybkie urządzenie NVMe pozostaje bezczynne między poleceniami. Większa liczba oczekujących żądań może wykorzystać jego wewnętrzną równoległość, chociaż nadmierna głębokość wydłuża kolejki i może pogorszyć interaktywne wyszukiwanie korzystające z tego samego dysku.
Głębokość kolejki mierzy liczbę oczekujących poleceń, a nie plików
NVMe korzysta z par kolejek wysyłania i ukończenia. Głębokość kolejki to liczba poleceń, które mogą pozostać oczekujące, więc odzwierciedla współbieżność pamięci masowej po przetłumaczeniu operacji indeksowania przez system plików i warstwę blokową na żądania urządzenia.
Specyfikacja NVMe definiuje kolejki wysyłania i ukończenia, które pozwalają oprogramowaniu hosta wysyłać wiele poleceń bez oczekiwania na ukończenie każdego z nich. Taka konstrukcja może równolegle zasilać kilka kanałów kontrolera, układów flash i operacji wewnętrznych. Różnica ta pozostaje widoczna podczas późniejszych testów domowych.
Otwarcie wielu plików nie gwarantuje użytecznej głębokości. Synchroniczna logika aplikacji, małe transakcje, blokady lub fsync po każdym rekordzie mogą serializować ścieżkę na długo przed dotarciem żądań do kontrolera. Wynik pośredni musi pozostać możliwy do sprawdzenia, zanim automatyzacja będzie kontynuowana.
Równoległa praca indeksu zamienia głębokość w przepustowość
Potok wczytywania wektorów może grupować rekordy dokumentów, kodować osadzenia równolegle, budować struktury grafowe lub odwrócone oraz wysyłać asynchroniczne zapisy. Wystarczająca liczba niezależnych zadań pozwala nakładać na siebie operacje programowania, kasowania, obsługi metadanych i transferu zamiast ujawniać opóźnienie każdej z nich osobno.
Wskazówki dotyczące wydajności NVMe w SPDK podkreślają konieczność dopasowania równoległych kolejek NVMe oraz rozmieszczenia procesów roboczych do urządzenia i obciążenia. Większa współbieżność pomaga tylko wtedy, gdy aplikacja dostarcza niezależne operacje wejścia-wyjścia, a procesor może wydajnie odpytywać o ukończenia lub je przetwarzać.
Znaczenie ma struktura indeksu: tworzenie segmentów z przewagą dopisywania może skalować się wraz z większymi partiami, podczas gdy częste modyfikacje grafu, zatwierdzenia WAL lub małe aktualizacje metadanych mogą nadal być ograniczone przez procesor lub synchronizację. Głębokość kolejki nie przyspieszy etapu, który zbyt wolno wytwarza operacje pamięci masowej.
Nasycenie zamienia większą głębokość w czas oczekiwania
Przepustowość rośnie do momentu, gdy przepustowość pamięci flash, przetwarzanie przez kontroler, PCIe, procesor lub własna serializacja indeksatora osiągną granicę wydajności. Po przekroczeniu tego punktu dodatkowe polecenia czekają dłużej, nie zwiększając liczby ukończonych bajtów na sekundę, a jednocześnie podnosząc opóźnienie p99 i ilość pamięci używanej przez bufory operacji w toku.
Badanie USENIX dotyczące nowoczesnych pamięci masowych NVMe pokazuje, że narzut po stronie hosta NVMe zależy od architektury urządzenia i narzutu oprogramowania hosta, a nie wyłącznie od deklarowanej przepustowości. Krótkie, współbieżne żądania mogą przenieść wąskie gardła do procesora i ścieżek wysyłania operacji wejścia-wyjścia.
Granica problemu pojawia się przy mieszanym obciążeniu, gdy wczytywanie współdzieli urządzenie z wyszukiwaniem, ładowaniem modeli, bazami danych lub pamięcią wymiany. Głębokość maksymalizująca masowe wczytywanie może sprawić, że interaktywne odczyty staną się bezużyteczne, nawet gdy zagregowana przepustowość wygląda doskonale.
Znajdź punkt załamania przepustowości, nie ukrywając opóźnienia wyszukiwania
Uruchom to samo archiwum przy głębokościach kolejki 1, 2, 4, 8, 16, 32 i 64, utrzymując stałą liczbę procesów roboczych osadzania, rozmiar partii, parametry indeksu, system plików i zasady zatwierdzania. Tę granicę należy mierzyć osobno w realistycznych warunkach pracy.
Porównaj zachowanie małych plików z indeksowaniem małych plików. Rejestruj liczbę wektorów na sekundę, liczbę zapisanych bajtów, wykorzystanie urządzenia, średnie i p99 opóźnienie zapisu, czas procesora, częstotliwość fsync, zużycie pamięci oraz p99 współbieżnego wyszukiwania. Praktyczne konsekwencje stają się widoczne, gdy kilka źródeł konkuruje o ograniczony kontekst.
Wybierz najmniejszą głębokość znajdującą się blisko maksymalnej trwałej przepustowości wczytywania, która nadal spełnia wymagania dotyczące opóźnienia interaktywnego. Jeśli przepustowość pozostaje płaska od głębokości jeden, przeanalizuj profil osadzania, blokad, kompaktowania i częstotliwości zatwierdzeń, zanim obwinisz NVMe. Ta zależność powinna pozostać jasno widoczna w końcowym interfejsie.
Centrum Technologii i Sztucznej Inteligencji
Więcej do przeczytania

Czym jest dryf osadzeń i kiedy prywatny indeks wyszukiwania wymaga przebudowy?
Odkoduj dryf modelu, przetwarzania wstępnego, korpusu i zapytań; odróżnij monitorowanie od niezgodności oraz zdecyduj, kiedy prywatny indeks wymaga przebudowy.

Czym jest zgodność tokenizera i dlaczego może zakłócić przełączanie modeli?
Odkryj tożsamość słownictwa, znaczenie tokenów specjalnych, szablony czatu, buforowane tokeny, adaptery i kontrole zgodności przy lokalnym przełączaniu modeli.

Czym jest rezydencja modelu i kiedy lokalna usługa AI powinna przechowywać wagi w pamięci?
Poznaj rezydencję wag, poziomy pamięci podręcznej, zimne uruchomienia, eksmisję, multipleksowanie, presję pamięci oraz dowiedz się, kiedy domowa usługa AI powinna pozostać aktywna.

