STORAGE · shared, ~2.4 PBWĘZŁÓW CZYTAJĄCYCH · 480WĄSKIE GARDŁO · I/O
Rozdział 20 / Skalowanie

Storage i cache: dlaczego dysk potrafi być wolniejszy niż render

Petabajty danych i tysiąc maszyn czytających jednocześnie — architektura, w której najdroższym zasobem bywa nie moc obliczeniowa, tylko przepustowość do dysku.

TL;DR

Rozdział 19 podzielił render na setki niezależnych zadań, licząc się równolegle na osobnych maszynach. Każda z tych maszyn potrzebuje tych samych danych źródłowych — opublikowanej geometrii z Rozdziału 6, tekstur, cache'y Alembic z Rozdziału 10. Skoro wszystkie czytają je z jednego, wspólnego miejsca w tym samym momencie, samo miejsce przechowywania danych staje się częścią infrastruktury, o którą trzeba zadbać równie starannie, co o samą moc obliczeniową farmy.

Etap: Współdzielony storage jako wąskie gardło

I/O bound, nie compute bound

Depot Perforce z Rozdziału 6 i opublikowane assety nie mieszkają na dysku żadnej pojedynczej maszyny — leżą na dedykowanym, współdzielonym storage'u o wysokiej przepustowości, dostępnym jednocześnie dla każdej stacji roboczej i każdego węzła farmy. Problem pojawia się przy skali: setki maszyn odczytujących naraz te same duże pliki potrafią nasycić nawet bardzo szybkie łącze sieciowe. W praktyce oznacza to, że render bywa I/O bound, nie compute bound — maszyna kończy liczenie klatki szybciej, niż zdążyła wczytać wszystkie potrzebne jej dane, i spędza więcej czasu na czekaniu niż na samym liczeniu.

Storage.loadWiele maszyn, jedno źródło
setki węzłów farmy jednoczesne odczyty Współdzielony storage jedno źródło prawdy
Etap: Cache i proxy zamiast pełnych danych za każdym razem

Nie czytaj dwa razy tego, co już masz

Dwie niezależne strategie zmniejszają to obciążenie, zamiast próbować je wytrzymać siłą. Pierwsza to cache lokalny: węzeł farmy, który raz przeczytał daną teksturę czy geometrię, trzyma jej kopię na własnym, szybkim dysku lokalnym, więc kolejne zadanie na tej samej maszynie nie odpytuje sieci ponownie. Druga to proxy — lekka, uboższa wersja danych (tekstura w niskiej rozdzielczości, uproszczona geometria) używana do pracy interaktywnej, podczas gdy pełne dane wczytywane są dopiero na etapie finalnego renderu. To dokładnie ta sama zasada leniwego wczytywania (payload), którą Rozdział 11 pokazał przy USD — odłóż koszt odczytu ciężkich danych na moment, w którym są naprawdę potrzebne, nie wcześniej.

Etap: Nie każdy plik zasługuje na ten sam dysk

Warstwy storage'u: gorące i zimne dane

Dane aktywnego showu, używane codziennie przez setki maszyn, leżą na najszybszym i najdroższym storage'u, jaki studio posiada. Show, który zakończył produkcję miesiąc temu, nie potrzebuje już tej samej przepustowości — jego dane migrują na tańszy, wolniejszy storage archiwalny, czasem nawet na taśmy. Ta hierarchia (tiering) nie jest szczegółem technicznym bez znaczenia dla artysty — to powód, dla którego otwarcie starego shotu z zakończonej produkcji bywa zauważalnie wolniejsze niż praca nad czymś, co jest w toku teraz.

Słowniczek
I/O bound
Sytuacja, w której czas wykonania ogranicza szybkość odczytu/zapisu danych, nie moc obliczeniowa.
Shared storage (storage współdzielony)
Dedykowana infrastruktura przechowywania danych dostępna jednocześnie dla wielu maszyn.
Cache lokalny
Kopia danych trzymana na dysku konkretnej maszyny, unikająca ponownego odczytu z sieci.
Proxy
Uboższa, lżejsza wersja danych używana do szybkiej, interaktywnej pracy.
Tiering
Podział danych na warstwy o różnym koszcie i szybkości, zależnie od tego, jak aktywnie są używane.