Wydajność na dużą skalę: opowieść o optymalizacji kosztów AWS
Opublikowany: 2022-07-22Niedawno 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.
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ć).
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:
- Po zalogowaniu się do konsoli AWS, z menu Usługi w lewym górnym rogu znajdź i otwórz usługę CloudWatch.
- W lewej części strony, w rozwijanym menu Metryki , kliknij Wszystkie metryki .
- 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.)
- 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).
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.