Wydajność na dużą skalę: opowieść o optymalizacji kosztów AWS

Opublikowany: 2022-07-22

Niedawno uruchomiłem platformę do analizy kryptowalut, spodziewając się niewielkiej liczby codziennych użytkowników. Jednak gdy niektórzy popularni YouTuberzy uznali tę stronę za pomocną i opublikowali recenzję, ruch wzrósł tak szybko, że przeciążył serwer, a platforma (Scalper.AI) stała się niedostępna. Moje oryginalne środowisko AWS EC2 wymagało dodatkowego wsparcia. Po rozważeniu wielu rozwiązań zdecydowałem się użyć AWS Elastic Beanstalk do skalowania mojej aplikacji. Wszystko wyglądało dobrze i działało płynnie, ale byłem zaskoczony kosztami na pulpicie rozliczeniowym.

To nie jest rzadki problem. Ankieta z 2021 r. wykazała, że ​​82% decydentów IT i chmurowych napotkało niepotrzebne koszty chmury, a 86% nie uważa, że ​​może uzyskać pełny wgląd w wszystkie wydatki na chmurę. Chociaż Amazon oferuje w swojej dokumentacji szczegółowy przegląd dodatkowych wydatków, model cenowy jest złożony dla rozwijającego się projektu. Aby ułatwić zrozumienie, przedstawię kilka odpowiednich optymalizacji w celu zmniejszenia kosztów chmury.

Dlaczego wybrałem AWS

Celem Scalper.AI jest zbieranie informacji o parach kryptowalut (aktywa wymieniane podczas handlu na giełdzie), przeprowadzanie analiz statystycznych i dostarczanie traderom kryptowalutowym wglądu w stan rynku. Konstrukcja techniczna platformy składa się z trzech części:

  • Skrypty pozyskiwania danych
  • Serwer WWW
  • Baza danych

Skrypty pozyskiwania zbierają dane z różnych źródeł i ładują je do bazy danych. Miałem doświadczenie w pracy z usługami AWS, więc zdecydowałem się wdrożyć te skrypty poprzez konfigurację instancji EC2. EC2 oferuje wiele typów instancji i pozwala wybrać procesor, pamięć masową, sieć i system operacyjny instancji.

Wybrałem Elastic Beanstalk dla pozostałej funkcjonalności, ponieważ obiecywał płynne zarządzanie aplikacjami. Load balancer właściwie rozłożył obciążenie na instancje mojego serwera, podczas gdy funkcja autoskalowania obsługiwała dodawanie nowych instancji w celu zwiększenia obciążenia. Wdrażanie aktualizacji stało się bardzo proste i zajęło zaledwie kilka minut.

Scalper.AI działał stabilnie, a moi użytkownicy nie mieli już do czynienia z przestojami. Oczywiście spodziewałem się wzrostu wydatków, ponieważ dodałem dodatkowe usługi, ale liczby były znacznie większe niż przewidywałem.

Jak mogłem obniżyć koszty chmury

Patrząc wstecz, było wiele obszarów złożoności w korzystaniu z usług AWS w moim projekcie. Przeanalizujemy optymalizacje budżetu, które odkryłem podczas pracy z typowymi funkcjami AWS EC2: instancje wydajnościowe z możliwością pękania, transfery danych wychodzących, elastyczne adresy IP oraz stany zakończenia i zatrzymania.

Instancje wydajności z możliwością skasowania

Moim pierwszym wyzwaniem było wsparcie zużycia energii przez procesor w moim rozwijającym się projekcie. Skrypty pozyskiwania danych Scalper.AI zapewniają użytkownikom analizę informacji w czasie rzeczywistym; skrypty uruchamiają się co kilka sekund i zasilają platformę najnowszymi aktualizacjami z giełd kryptograficznych. Każda iteracja tego procesu generuje setki asynchronicznych zadań, więc zwiększony ruch w witrynie wymagał większej mocy procesora w celu skrócenia czasu przetwarzania.

Najtańsza instancja oferowana przez AWS z czterema vCPU, a1.xlarge, kosztowałaby mnie w tamtym czasie ~75 USD miesięcznie. Zamiast tego zdecydowałem się rozłożyć obciążenie między dwie instancje t3.micro z dwoma procesorami wirtualnymi i 1 GB pamięci RAM każda. Instancje t3.micro oferowały wystarczającą szybkość i pamięć do pracy, której potrzebowałem, za jedną piątą kosztów a1.xlarge. Niemniej jednak mój rachunek był nadal wyższy niż się spodziewałem pod koniec miesiąca.

Aby zrozumieć dlaczego, przeszukałem dokumentację Amazon i znalazłem odpowiedź: Kiedy użycie procesora przez instancję spada poniżej zdefiniowanej linii bazowej, instancja zbiera kredyty, ale gdy instancja przekracza poziom bazowy, zużywa ona wcześniej zarobione kredyty. Jeśli nie ma dostępnych kredytów, instancja wydaje dostarczone przez Amazon „nadwyżkowe kredyty”. Ta możliwość zdobywania i wydawania kredytów powoduje, że Amazon EC2 uśrednia użycie procesora przez instancję w ciągu 24 godzin. Jeśli średnie użycie przekroczy poziom bazowy, za instancję naliczana jest dodatkowa opłata według stałej stawki za godzinę pracy procesora wirtualnego.

Monitorowałem instancje pozyskiwania danych przez wiele dni i odkryłem, że konfiguracja mojego procesora, która miała obniżyć koszty, działała odwrotnie. Przez większość czasu moje średnie użycie procesora było wyższe niż w linii bazowej.

Wykres ma trzy listy rozwijane wybrane u góry ekranu. Pierwsze dwa po lewej to „10 lutego 2022 – 19 lutego 2022” i „Codziennie”, po których następuje małe „i” w kółku. Trzecia znajduje się po prawej stronie ekranu i mówi „Linia” z symbolem wykresu liniowego. Poniżej list rozwijanych wykres zawiera dwa wykresy liniowe z filtrami. U góry wiersz filtra brzmi „Grupuj według: Typ użycia” (wybrany filtr, który ma niebieskie tło), a następnie wyświetla niewybrane filtry: „Usługa, Połączone konto, Region, Typ wystąpienia, Zasób, Kategoria kosztu, Etykieta , Więcej”, z wyszarzonym tekstem „Zasób”, a obok pozostałych trzech znajdują się strzałki w dół. Górny wykres zawiera „Koszty ($)” na osi y w zakresie od 0,0 do 2,5. Dolny wykres liniowy ma na osi y „Wykorzystanie (godziny procesora wirtualnego)” w zakresie od 0 do 40. Oba wykresy liniowe mają wspólne daty oznaczone na osi x, od 10 lutego do 19 lutego, oraz klucz oznaczając swoje fioletowe linie: „USE2-CPUCredits:t3”. Górny wykres liniowy ma około ośmiu punktów połączonych liniowo i wykazuje tendencję wzrostową w czasie: jeden punkt wokół (10 lutego, 0,3 USD), drugi wokół (11 lutego, 0,6 USD), trzeci wokół (12 lutego, 0,5 USD), a czwarta około (14 lutego, 2,1 $), piąta około (15 lutego, 2,4 $), szósta około (16 lutego, 2,3 $), siódma około (18 lutego, 2,3 $) i ósma około (luty- 19, 2,6 USD). Dolny wykres zawiera również około ośmiu punktów połączonych liniowo i wykazuje tendencję wzrostową w czasie: jeden punkt wokół (10 lutego, 5 godzin vCPU), drugi wokół (11 lutego, 15 godzin vCPU), trzeci wokół (luty -12, 10 godzin vCPU), czwarta około (14 lutego, 40 godzin vCPU), piąta około (15 lutego, 50 godzin vCPU), szósta około (16 lutego, 45 godzin vCPU) , siódmy około (18 lutego, 45 godzin vCPU) i ósmy około (19 lutego, 55 godzin vCPU).
Powyższy wykres przedstawia wzrosty kosztów (górny wykres) i rosnące wykorzystanie procesora (dolny wykres) w okresie, w którym użycie procesora było powyżej linii bazowej. Koszt w dolarach jest proporcjonalny do wydanych nadwyżek kredytów, ponieważ instancja jest rozliczana za godzinę procesora wirtualnego.

Początkowo przeanalizowałem użycie procesora pod kątem kilku par kryptowalut; obciążenie było małe, więc pomyślałem, że mam dużo miejsca na wzrost. (Użyłem tylko jednej mikroinstancji do pozyskiwania danych, ponieważ mniej par kryptowalut nie wymagało tak dużej mocy procesora). dla setek par kryptowalut — analiza usług w chmurze nic nie znaczy, o ile nie zostanie przeprowadzona we właściwej skali.

Wychodzące transfery danych

Kolejnym skutkiem rozwoju mojej strony był zwiększony transfer danych z mojej aplikacji z powodu małego błędu. Ponieważ ruch stale rośnie i nie ma już przestojów, musiałem dodać funkcje, aby jak najszybciej przyciągnąć i zatrzymać uwagę użytkowników. Moją najnowszą aktualizacją był alert dźwiękowy uruchamiany, gdy warunki rynkowe pary kryptowalut pasowały do ​​predefiniowanych parametrów użytkownika. Niestety popełniłem błąd w kodzie, a pliki audio ładowały się do przeglądarki użytkownika setki razy co kilka sekund.

Wpływ był ogromny. Mój błąd generował pliki audio z moich serwerów internetowych, powodując dodatkowe transfery danych wychodzących. Drobny błąd w moim kodzie spowodował, że rachunek był prawie pięciokrotnie większy niż poprzednie. (Nie była to jedyna konsekwencja: błąd mógł spowodować wyciek pamięci w komputerze użytkownika, więc wielu użytkowników przestało wracać).

Wykres podobny do poprzedniego, ale z pierwszym odczytem rozwijanym „Od 06 stycznia 2022 do 15 stycznia 2022”, „Koszty ($)” na górnym wykresie „Koszty ($)” w zakresie od 0 do 30, a dolny wykres zawierający „ Użycie (GB)” na osi y, w zakresie od 0 do 300. Oba wykresy liniowe mają wspólne daty oznaczone na osi x, od stycznia-06 do stycznia-15, oraz klucz oznaczający ich fioletowe linie: „USE2- bajtów transferu danych”. Górny wykres liniowy ma około ośmiu punktów połączonych liniowo i wykazuje tendencję wzrostową w czasie: jeden punkt wokół (styczeń-06, 2 USD), drugi wokół (styczeń-08, 4 USD), trzeci wokół (sty-09, 7 USD), a czwarta około (10 stycznia, 6 USD), piąta około (12 stycznia, 15 USD), szósta około (13 stycznia, 25 USD), siódma (14 stycznia, 24 USD) i ósma około (sty- 15, 29 dolarów). Wykres dolnej linii ma również około ośmiu punktów połączonych liniowo i trendów rosnących w czasie: jeden punkt wokół (styczeń-06, 10 GB), drugi wokół (styczeń-08, 50 GB), trzeci wokół (sty-09, 80 GB), czwarta około (10 stycznia, 70 GB), piąta około (12 stycznia, 160 GB), szósta około (13 stycznia, 270 GB), siódma około (14 stycznia, 260 GB) , a około ósmy (15 stycznia, 320 GB).
Powyższy wykres przedstawia wzrosty kosztów (górny wykres) i rosnące transfery danych wychodzących (dolny wykres). Ponieważ wychodzące transfery danych są rozliczane za GB, koszt w dolarach jest proporcjonalny do użycia danych wychodzących.

Koszty transferu danych mogą stanowić nawet 30% skoków cen AWS. Transfer przychodzący EC2 jest bezpłatny, ale opłaty za transfer wychodzący są naliczane za GB (0,09 USD za GB po zbudowaniu Scalper.AI). Jak nauczyłem się na własnej skórze, ważne jest, aby zachować ostrożność w przypadku kodu wpływającego na dane wychodzące; ograniczenie pobierania lub ładowania plików tam, gdzie to możliwe (lub uważne monitorowanie tych obszarów) ochroni Cię przed wyższymi opłatami. Te grosze sumują się szybko, ponieważ opłaty za przesyłanie danych z EC2 do Internetu zależą od obciążenia pracą i stawek specyficznych dla regionu AWS. Ostatnie zastrzeżenie nieznane wielu nowym klientom AWS: transfer danych między różnymi lokalizacjami staje się droższy. Jednak korzystanie z prywatnych adresów IP może zapobiec dodatkowym kosztom transferu danych między różnymi strefami dostępności w tym samym regionie.

Elastyczne adresy IP

Nawet w przypadku korzystania z adresów publicznych, takich jak elastyczne adresy IP (EIP), możliwe jest obniżenie kosztów EC2. EIP to statyczne adresy IPv4 używane do dynamicznego przetwarzania w chmurze. Część „elastyczna” oznacza, że ​​możesz przypisać EIP do dowolnej instancji EC2 i używać jej, dopóki nie zdecydujesz się zatrzymać. Te adresy umożliwiają bezproblemową zamianę wystąpień w złym stanie na te w dobrej kondycji przez ponowne mapowanie adresu na inną instancję na koncie. Za pomocą EIP można również określić rekord DNS dla domeny, tak aby wskazywał na instancję EC2.

AWS zapewnia tylko pięć EIP na konto na region, co czyni je ograniczonymi zasobami i kosztownymi przy nieefektywnym wykorzystaniu. AWS pobiera niską stawkę godzinową za każdy dodatkowy EIP i dodatkowe rachunki, jeśli zmieniasz EIP więcej niż 100 razy w miesiącu; pozostawanie poniżej tych limitów obniży koszty.

Stany Zakończenia i Zatrzymania

AWS udostępnia dwie opcje zarządzania stanem uruchomionych instancji EC2: zakończenie lub zatrzymanie. Zakończenie spowoduje zamknięcie instancji, a udostępniona dla niej maszyna wirtualna nie będzie już dostępna. Wszelkie dołączone woluminy Elastic Block Store (EBS) zostaną odłączone i usunięte, a wszystkie dane przechowywane lokalnie w instancji zostaną utracone. Nie będziesz już płacić za instancję.

Zatrzymywanie instancji jest podobne, z jedną niewielką różnicą. Dołączone woluminy EBS nie są usuwane, dzięki czemu ich dane są zachowywane, a instancję można ponownie uruchomić w dowolnym momencie. W obu przypadkach Amazon nie pobiera już opłat za korzystanie z instancji, ale jeśli zdecydujesz się na zatrzymanie zamiast zamykania, wolumeny EBS będą generować koszty, o ile będą istnieć. AWS zaleca zatrzymanie instancji tylko wtedy, gdy zamierzasz ją wkrótce ponownie aktywować.

Istnieje jednak funkcja, która może zwiększyć rachunek za AWS pod koniec miesiąca, nawet jeśli zamkniesz instancję zamiast ją zatrzymać: migawki EBS. Są to przyrostowe kopie zapasowe woluminów EBS przechowywanych w usłudze Simple Storage (S3) firmy Amazon. Każda migawka zawiera informacje potrzebne do utworzenia nowego woluminu EBS z poprzednimi danymi. Jeśli zamkniesz instancję, powiązane z nią woluminy EBS zostaną automatycznie usunięte, ale jej migawki pozostaną. Ponieważ S3 pobiera opłaty według ilości przechowywanych danych, zalecam usunięcie tych migawek, jeśli nie będziesz ich wkrótce używać. AWS oferuje możliwość monitorowania aktywności pamięci masowej na wolumin za pomocą usługi CloudWatch:

  1. Po zalogowaniu się do konsoli AWS, z menu Usługi w lewym górnym rogu znajdź i otwórz usługę CloudWatch.
  2. W lewej części strony, w rozwijanym menu Metryki , kliknij Wszystkie metryki .
  3. Strona pokazuje listę usług z dostępnymi metrykami, w tym EBS, EC2, S3 i inne. Kliknij EBS , a następnie Metryki na wolumin . (Uwaga: opcja EBS będzie widoczna tylko wtedy, gdy masz skonfigurowane woluminy EBS na swoim koncie.)
  4. Kliknij kartę Zapytanie . W widoku Edytor skopiuj i wklej polecenie SELECT AVG(VolumeReadBytes) FROM "AWS/EBS" GROUP BY VolumeId , a następnie kliknij przycisk Run . (Uwaga: CloudWatch używa dialektu SQL o unikalnej składni).

Strona internetowa pojawia się z ciemnoniebieskim menu nagłówka u góry strony, które od lewej do prawej zawiera logo aws, menu rozwijane „Usługi”, pasek wyszukiwania, ikonę kodu, ikonę dzwonka, ikonę znaku zapytania, rozwijany tekst „N. Virginia” i rozwijany tekst „Toptal Test Account”. Pod spodem główna część strony w kolorze białym. Po lewej stronie znajduje się przewijane menu z tytułem „CloudWatch” i „X”. Poniżej, od góry do dołu, menu brzmi: „Ulubione i ostatnie”, „Panele nawigacyjne”, „Alarmy” (pogrubione, z trzema listami rozwijanymi: „W alarmie”, „Wszystkie alarmy” i „Płatności”), „Dzienniki” (pogrubione, z dwoma listami rozwijanymi: „Grupy dzienników” i „Statystyki dzienników”), „Dane” (pogrubione, z trzema listami rozwijanymi: „Wszystkie dane”, podświetlone na jasnopomarańczowo, „ Explorer” i „Strumienie”), „Ślady rentgenowskie” (pogrubione), „Zdarzenia” (pogrubione) i „Monitorowanie aplikacji” (pogrubione). Cały pogrubiony tekst w menu ma rozwijany trójkąt menu po lewej stronie tekstu. Środek strony wyświetla wykres w górnej połowie strony, a edytor w dolnej połowie strony. Wykres ma dwie linie nagłówków. Pierwsza linia to „CloudWatch > Metryki” po lewej stronie (z tekstem „CloudWatch” w kolorze niebieskim) i „Przełącz do oryginalnego interfejsu” w kolorze niebieskim po prawej stronie. Druga linia zawiera napis „Wykres bez nazwy” z ikoną edycji po lewej stronie i wyświetla opcje po prawej: „1h, 3h, 12h, 1d, 3d, 1w, Custom” (z „3h” na niebiesko i „Custom” z ikoną kalendarza), „Linia” (z ikoną rozwijania), „Działania” (z ikoną rozwijania) oraz przycisk odświeżania z ikoną rozwijania. Sam wykres ma w środku tekst: „Twój wykres CloudWatch jest pusty. Wybierz niektóre dane, które mają się tu pojawić”. Edytor posiada również dwie linie nagłówków. Pierwsza linia to „Przeglądaj”, „Zapytanie” (zaznaczone na pomarańczowo), „Wykresowane dane”, „Opcje” i „Źródło” po lewej stronie oraz „Dodaj matematykę” (z ikoną rozwijaną) i „Dodaj zapytanie” (z ikoną listy rozwijanej) po prawej stronie. Drugi wiersz zawiera po lewej stronie „Metrics Insights — edytor zapytań” i „Info” (na niebiesko), a po prawej „Builder” i „Editor” (z zaznaczoną opcją „Editor”). Poniżej edytora znajduje się pomarańczowy przycisk „Uruchom” po lewej stronie, a tekst „Użyj Ctrl + Enter, aby uruchomić zapytanie, Ctrl + Spacja, aby autouzupełnić” po prawej. Po prawej stronie znajduje się białe menu, w którym od góry do dołu czytamy „Zapytania” i „Pomoc”.
Przegląd konfiguracji monitorowania CloudWatch opisanej powyżej (pokazanej z pustymi danymi i bez wybranych metryk). Jeśli masz na swoim koncie istniejące instancje EBS, EC2 lub S3, pojawią się one jako opcje metryki i wypełnią Twój wykres CloudWatch.

CloudWatch oferuje różne formaty wizualizacji do analizy aktywności pamięci masowej, takie jak wykresy kołowe, linie, słupki, skumulowane wykresy warstwowe i liczby. Używanie CloudWatch do identyfikacji nieaktywnych woluminów i migawek EBS to łatwy krok w kierunku optymalizacji kosztów chmury.

Dodatkowe pieniądze w Twojej kieszeni

Chociaż narzędzia AWS, takie jak CloudWatch, oferują przyzwoite rozwiązania do monitorowania kosztów w chmurze, różne platformy zewnętrzne integrują się z AWS w celu bardziej kompleksowej analizy. Na przykład platformy zarządzania chmurą, takie jak CloudHealth firmy VMWare, pokazują szczegółowy podział najważniejszych obszarów wydatków, które można wykorzystać do analizy trendów, wykrywania anomalii oraz monitorowania kosztów i wydajności. Zalecam również skonfigurowanie alarmu rozliczeniowego CloudWatch, aby wykryć wszelkie wzrosty opłat, zanim staną się nadmierne.

Amazon zapewnia wiele świetnych usług w chmurze, które mogą pomóc w delegowaniu prac konserwacyjnych serwerów, baz danych i sprzętu do zespołu AWS. Chociaż koszty platformy chmurowej mogą łatwo wzrosnąć z powodu błędów lub błędów użytkowników, narzędzia do monitorowania AWS wyposażają programistów w wiedzę pozwalającą bronić się przed dodatkowymi wydatkami.

Mając na uwadze te optymalizacje kosztów, jesteś gotowy do rozpoczęcia projektu i zaoszczędzenia setek dolarów w tym procesie.

Logo AWS ze słowem „PARTNER” i tekstem „Advanced Tier Services” poniżej.
Jako Advanced Consulting Partner w Amazon Partner Network (APN), Toptal oferuje firmom dostęp do certyfikowanych ekspertów AWS, na żądanie, w dowolnym miejscu na świecie.