Поскольку 2023 год считается «годом эффективности» для компаний-разработчиков программного обеспечения, я хотел бы поделиться некоторыми экстремальными показателями экономической эффективности, достигнутыми благодаря чему-то, казалось бы, столь безобидному, как выбор языка. Моя команда, фактически перенеся службу и измерив потребление ею ресурсов, обнаружила, что переход с Ruby на Rust может сэкономить от 75% до 90% затрат на вычисления, и что эта экономия обычно применяется при переходе с интерпретируемого языка на компилируемый.

Как это началось

Наши выводы были немного случайными, поскольку нашей первоначальной целью не было сэкономить деньги. На самом деле, наша первоначальная цель состояла в том, чтобы сделать сервис более производительным и реже оповещать. Эта служба была службой «шлюза» моей команды, которая координирует вызовы к нескольким другим внутренним службам, чтобы предоставить упрощенный API для внешних клиентов. Мы переносили его с Ruby on Rails на Rust.

Мы хотели выполнить миграцию на Rust из соображений производительности и безопасности. Во-первых, мы хотели надежно обрабатывать больше запросов одновременно и без проблем, используя быструю и безопасную модель параллелизма Rust. Поскольку наш шлюз в основном связан с вводом-выводом, ожидая ответов от своих вспомогательных служб, мы решили, что это изменение позволит нам быстрее обрабатывать больше запросов, возможно, с меньшим количеством серверов. Кроме того, работа в Rust дала нам массу возможностей, так как Rust может похвастаться 5 из 10 самых быстрых веб-фреймворков по версии techempower.com. Мы уже использовали фреймворк actix-web в других проектах, поэтому знали, что сможем быстро портировать этот сервис. При этом мы заменили Rails, который занимает 131 место в списке, на actix-web, который занимает 5-е место.

Помимо безопасного параллелизма, мы хотели использовать статическую типизацию для всех данных, входящих и исходящих из этого шлюза. Это упростило чтение кода — нам больше не нужно было смотреть исходный код вспомогательных сервисов, чтобы выяснить, какие поля поступают на наш шлюз! — и это значительно упростило валидацию, поскольку тип каждого поля объявлялся явно.

Неожиданная экономия

Хотя мы знали, что Rust уменьшит нагрузку на ЦП и память, мы были поражены тем, насколько они уменьшились. Основываясь на фактических показателях (зарегистрированных AWS и представленных в Datadog), мы увидели снижение загрузки ЦП на 94 % и снижение использования памяти на 97 %. Мы сравнивали данные месяц за месяцем и убедились, что оборудование и нагрузка на сервис были одинаковыми в рассматриваемые периоды времени. Это было очень ясно: Rust делал ту же работу, что и наш сервис Ruby on Rails, но с небольшой долей процессора и памяти.

Это невероятный вывод для оптимизации затрат, поскольку большинство облачных провайдеров взимают плату в зависимости от того, сколько ЦП и памяти вы выделяете. Давайте использовать AWS в качестве примера. Для их предложения ECS (Elastic Container Service) виртуальные ЦП стоят 0,04048 долларов США в час, а память — 0,004445 долларов США за ГБ в час. (Это для региона Восток США 1 по состоянию на июль 2023 г.). Кроме того, ECS заставляет вас определенным образом настраивать ЦП и память; т. е. у вас всегда должно быть как минимум в два раза больше ГБ, чем у вас выделено ЦП, поэтому, если вы хотите 2 виртуальных ЦП, вам также придется выделить как минимум 4 ГБ.

Применяя оба этих знания, мы могли бы гипотетически взять нашу задачу ECS с 2 виртуальными ЦП и 4 ГБ и уменьшить ее до задачи с 0,25 виртуальных ЦП и 0,5 ГБ (это максимально мало) и по-прежнему обслуживать тот же объем трафика (в среднем ). Это снижает стоимость этой задачи с 71,09 долларов в месяц до 8,89 долларов в месяц на выполнение. Это снижение затрат на ECS на 87 %.

Несколько предостережений

Прежде чем я обещаю что-то слишком волшебное, я хочу указать на несколько предостережений.

Во-первых, загрузка ЦП в сервисе, который мы мигрировали, уже была довольно низкой, поэтому трудно с уверенностью сказать, что использование Rust последовательно снизит загрузку ЦП на 94%. Я не тестировал его с сервисом, привязанным к ЦП, поэтому не уверен, будет ли в этом случае прирост лучше или хуже.

Во-вторых, вы, вероятно, не хотите сбрасывать свой процессор и память настолько низко, насколько это возможно. Хотя в большинстве современных сервисов есть автомасштабирование, может пройти несколько минут, прежде чем политика заработает и новый узел заработает. Чтобы предотвратить любые отброшенные запросы, вы все равно захотите немного перераспределить ЦП и память, чтобы учесть пики трафика. Это означает, что вы можете не получить полного снижения стоимости на 87%.

Заключение

С учетом предостережений ясно, что выбор языка может иметь большое денежное влияние. Даже с консервативным взглядом на цифры, которыми я поделился, переход с Ruby on Rails (или Python, или другие энергоемкие языки) на Rust (или Go, или C++ и т. д.) может привести к значительной экономии средств. Подумайте, что ваша компания могла бы сделать со всеми этими дополнительными деньгами, если бы сократила затраты на вычисления на 75–90 %!

Want more?
Check out this content and more like it at my website, World Without Eng.