Podobnie jak ty, miałem dużo wydajności problemy z blokami strony - nawet jeśli nie były tak poważne. Wygląda na to, że wykonałeś pracę domową i widzę, że robisz wszystko według książki.
Kilka rzeczy do sprawdzenia:
- Upewnij się, że maszyna wirtualna nie jest zamiana (można sprawdzić w zdalnym pulpicie). Na przykład wyjątkowo małe maszyny wirtualne z pamięcią kształtu 768 MB są naprawdę zbyt małe, aby można je było wykorzystać w praktyce, gdybyś mnie o to poprosił.
- Ustaw własne limity połączeń, zwłaszcza jeśli używasz małych maszyn wirtualnych.
ServicePointManager.DefaultConnectionLimit
.
- Większe strony zapewniają większą wydajność.
- Napisz wiele wątków (np. Użyj
Task
s/async
/await
, zwłaszcza jeśli masz dużo pracy).
Aha i jeszcze jedno:
- Nie używaj emulatora do tego rodzaju rzeczy. Emulator nie jest dobrą reprezentacją rzeczywistego Azure, z całą pewnością wrt. testy porównawcze.
Głównym powodem, dla którego masz czasy dostępu, jest powolne, ponieważ robisz wszystko synchronicznie. Testy porównawcze w systemie Microsoft dostęp do obiektów typu blob w wielu wątków, które dają większą przepustowość.
Azure wie również, że wydajność jest problemem, dlatego podjęli oni próbę złagodzenia problemu, wspierając pamięć masową przy użyciu lokalnego buforowania. Zasadniczo dzieje się tak, że zapisują one dane lokalne (np. W pliku), a następnie dzielą zadania na części, a następnie wykorzystują wiele wątków do zapisania wszystkiego w pamięci BLOB. Biblioteka przenoszenia danych jest jedną z takich bibliotek. Jednak podczas korzystania z nich należy zawsze pamiętać, że mają one różne ograniczenia dotyczące trwałości (to tak, jakby umożliwić "zapisywanie w pamięci podręcznej" na lokalnym komputerze) i mogą złamać sposób, w jaki zamierzałeś skonfigurować system rozproszony (jeśli czytasz & napisz to samo przechowywanie z wielu maszyn wirtualnych).
Dlaczego ...
pan poprosił o 'dlaczego'. Aby zrozumieć, dlaczego pamięć typu blob jest wolna, musisz zrozumieć, jak to działa. Najpierw chciałbym zaznaczyć, że istnieje this presentation z Microsoft Azure, który wyjaśnia, jak naprawdę działa pamięć masowa Azure.
Pierwszą rzeczą, którą należy sobie uświadomić, jest to, że pamięć masowa Azure jest wspierana przez rozproszony zestaw dysków (spinningowych). Ze względu na ograniczenia dotyczące trwałości i spójności zapewniają także "głosowanie większości", że dane są zapisywane w stabilnym magazynie. W celu uzyskania wydajności kilka poziomów systemu będzie miało pamięci podręczne, które będą głównie czytane w pamięci podręcznej (ponownie ze względu na ograniczenia dotyczące trwałości).
Teraz zespół Azure nie publikuje wszystkiego. Na szczęście dla mnie 5 lat temu moja poprzednia firma stworzyła podobny system na mniejszą skalę. Wystąpiły podobne problemy z wydajnością, jak na przykład Azure, a system był podobny do prezentacji, którą mam powyżej. W związku z tym, myślę, że mogę wyjaśnić i spekulować trochę, gdzie występują wąskie gardła. Dla jasności zaznaczę sekcje jako spekulacje, co moim zdaniem jest właściwe.
Jeśli piszesz stronę do magazynu blob, w rzeczywistości konfigurujesz serię połączeń TCP/IP, przechowujesz stronę w wielu lokalizacjach, a po otrzymaniu większości głosów dajesz "ok" z powrotem do klienta. Teraz, nie są w rzeczywistości kilka wąskich gardeł w tym systemie:
- Będziesz musiał skonfigurować szereg połączeń TCP/IP w całej infrastruktury. Ich ustawienie będzie kosztować czas.
- Punkty końcowe pamięci będą musiały wykonać dysk, aby znaleźć poprawne miejsce i wykonać operację.
- Geo-replikacja zajmie oczywiście więcej czasu niż replikacja lokalna.
- [spekulować] Stwierdziliśmy również, że dużo czasu spędziliśmy w fazie "buforowania".
Liczba (1), (2) i (3) tutaj jest dość dobrze znana. Numer (4) tutaj jest faktycznie wynikiem (1) i (2). Zauważ, że nie możesz po prostu rzucić nieskończonej liczby żądań do obracania dysków; cóż ... właściwie możesz, ale wtedy system się zatrzyma. Tak więc, aby rozwiązać ten problem, dysk szuka od różnych klientów jest zwykle zaplanowany w taki sposób, że szukasz tylko wtedy, gdy wiesz, że możesz również napisać wszystko (aby zminimalizować kosztowne poszukiwania). Istnieje jednak pewien problem: jeśli chcesz zwiększyć przepustowość, musisz zacząć szukać, zanim uzyskasz wszystkie dane - a jeśli nie otrzymujesz wystarczająco szybko danych, inne żądania muszą czekać dłużej. Tutaj także dylemat: możesz to zoptymalizować (czasami może to zranić przepustowość poszczególnych klientów i zatrzymać wszystkich innych, szczególnie przy różnych obciążeniach) lub buforować wszystko, a następnie szukać wszystkiego na raz (to jest łatwiejsze, ale dodaje trochę opóźnienie dla wszystkich). Ze względu na ogromną liczbę klientów obsługiwanych przez Azure podejrzewam, że wybrali ostatnie podejście, które dodaje więcej opóźnień do pełnego cyklu zapisu.
Niezależnie od tego, większość czasu prawdopodobnie zostanie wydana przez (1) i (2). Rzeczywiste impulsy danych i zapisy danych są dość szybkie. Aby podać przybliżoną ocenę: here are some commonly used timings.
Pozostaje nam jedno pytanie: , dlaczego pisanie artykułów w wielu wątkach jest o wiele szybsze?
Powód jest bardzo prosty: jeśli piszemy materiał w wielu wątkach, istnieje duża szansa, że będziemy przechowywać rzeczywiste dane na różnych serwerach. Oznacza to, że możemy zmienić nasze wąskie gardło z "seek + network setup latency" na "throughput". Tak długo, jak może to zrobić nasza wirtualna maszyna wirtualna klienta, jest bardzo prawdopodobne, że infrastruktura również sobie z tym poradzi.
Jeśli jeszcze nie zaznaczyłeś, możesz sprawdzić [jak skutecznie przesłać i pobrać bloby strony] (https://blogs.msdn.microsoft.com/windowsazurestorage/2010/04/10/using-windows-azure- page-blobs-and-how-to-efficient-upload-and-download-page-blobs /) –
Dzięki, ale już sprawdziłeś – Anatoly
Nie dostarczyłeś kompletnej implementacji (gdzie jest na przykład metoda Read, której używasz w swoim Write?). Poza tym, dlaczego mierzysz wydajność pojedynczej instrukcji (_pageBlob.WritePages), ale pytasz o słabość całego rozwiązania? – Evk