В этой статье собраны все, что публикуют идентифицируемые сторонние источники о холодном запуске WebAssembly по сравнению с контейнерами: документ, представленный на USENIX NSDI, официальная документация от Fastly, WasmEdge и Wasmer, а также академический исследовательский проект по бессерверной изоляции. Фигурки Aurabase не включены. Наши пограничные функции хорошо работают на Wasmtime, что проверено в репозитории, но на сегодняшний день не опубликовано ни одного теста холодного запуска, специфичного для нашей инфраструктуры, о чем подробно рассказывается ниже. Общий метод сравнительного анализа, применяемый в других разделах этого блога, можно найти в нашей основной статье о методологии сравнительного анализа.
Самое необходимое
- В документе AWS Firecracker (Agache et al., USENIX NSDI 2020) документируется время запуска microVM менее 125 мс и затраты памяти менее 5 МБ: наиболее точная количественная ссылка в этой статье.
- Быстро задокументированное время создания экземпляра WASM ниже миллисекунды для среды выполнения AOT Lucet (оптимизации которой затем были объединены с Wasmtime) в 2019 году. Это цифра, опубликованная поставщиком, которая никогда не воспроизводилась независимо в источниках, к которым обращаются здесь.
- WasmEdge, проект под управлением CNCF, в своей официальной документации утверждает, что его запуск и потребление памяти значительно меньше, чем у эквивалентного контейнера Docker, без независимых контрмер, упомянутых в этой статье.
- Wasmtime, Wasmer и WasmEdge компилируются по-разному (Cranelift, Singlepass/Cranelift/LLVM на ваш выбор, собственный компилятор AOT): этот выбор бэкэнда объясняет значительную часть разрыва между их опубликованными показателями, а не только время выполнения как таковое.
- Aurabase использует Wasmtime в производстве для своих пограничных функций, проверенных в
aura-functions/Cargo.toml, но на сегодняшний день не публикует никаких показателей холодного запуска, измеренных в ее собственной инфраструктуре.
Сторонние источники, указанные ниже, можно идентифицировать по их названию, автору или издателю и дате публикации. Это исследование основано на признанных и широко документированных публикациях в WebAssembly и бессерверной экосистеме, а не на живом запросе их страниц на момент написания. Если точную цифру невозможно подтвердить с достаточной уверенностью, в этой статье используется порядок величины, а не точное значение, и это прямо указывается.
Почему холодный запуск WASM занимает так много места в дебатах о бессерверных системах
Холодный старт означает дополнительную задержку, оплачиваемую запросом, когда среда выполнения должна инициализироваться перед запуском кода приложения. Для классической периферийной или бессерверной функции это далеко не маргинальный случай: платформа, которая снижает количество экземпляров до нуля между двумя пиками трафика или распределяет выполнение по десяткам географически разбросанных периферийных узлов, платит эти затраты постоянно, а не только при первом развертывании.
Эта тема приобрела почти символическое значение в экосистеме WASM после того, как Соломон Хайкс, соучредитель Docker, опубликовал в Твиттере в марте 2019 года предложение: "Если бы WASM+WASI существовало в 2008 году, нам не нужно было бы создавать Docker. Вот насколько это важно. WebAssembly на сервере — это будущее вычислений". Это мнение признанного практика, а не измерение. Оно объясняет, почему эта тема завораживает, но не заменяет исходную фигурку.
Aurabase предлагает два пути для своих пограничных функций: редактор Studio, который запускает код в среде выполнения Deno, как описано в нашем руководстве по миграции Supabase, и CLI aura functions deploy, который предназначен для отдельного пути для функций, написанных на Rust и скомпилированных в WASM на Wasmtime. Именно на этот второй путь и проливает свет данная статья, не приводя при этом цифру холодного старта, которой пока не существует.
Почему модуль WASM структурно запускается быстрее, чем контейнер
Разница заключается не в более быстром времени выполнения в абсолютном выражении, а в более коротком стеке шагов между запросом и кодом приложения.
Запуск контейнера мобилизует ядро хоста: создание нового процесса, настройка контрольных групп и пространств имен, которые изолируют его, монтирование слоев образа, а затем запуск среды выполнения приложения внутри (например, Node.js и его движок V8 сами требуют затрат на инициализацию). На каждом этапе добавляются системные вызовы и, для изображения, которое никогда не просматривалось локально, загрузка по сети еще до ее начала.
Модуль WebAssembly изолирован на уровне языка виртуальной машины, а не на уровне операционной системы. Создание экземпляра модуля означает выделение его линейной памяти, привязку его импорта, а затем переход к его точке входа, и все это в рамках уже запущенного процесса среды выполнения хоста. Никаких новых процессов, слоев образа и монтирования файловой системы по умолчанию.
Выбор режима компиляции добавляет дополнительную переменную. Wasmtime компилирует в JIT через свой бэкэнд Cranelift при загрузке модуля или может предварительно скомпилировать его с помощью wasmtime compile, который создает файл .cwasm, уже преобразованный в собственный машинный код. Ранняя компиляция (AOT) удаляет этап компиляции из критического пути запроса: это именно тот рычаг, который должна активировать пограничная архитектура, чувствительная к холодному старту.
Это производственная зависимость, а не разработка: она подтверждает, что Wasmtime действительно работает по пути CLI пограничных функций Aurabase. Однако он не подтверждает никаких показателей задержки, что остается верным до тех пор, пока не публикуется датированный тест.
Контейнеры и microVM: наиболее точная количественная оценка
В этой области самым сильным источником является отраслевое исследование, а не сообщение в маркетинговом блоге. Firecracker, облегченная технология microVM, разработанная AWS и используемая, в частности, для Lambda и Fargate, была представлена на конференции USENIX NSDI 2020 Agache et al. в статье «Firecracker: облегченная виртуализация для бессерверных приложений».
В этом документе документировано время загрузки менее 125 мс и затраты памяти менее 5 МБ на микроВМ с возможностью запуска тысяч микроВМ на одной физической машине. Это датированная цифра (2020 г.), полученная из рецензируемой академической публикации и с тех пор широко цитируемая в литературе по бессерверной изоляции.
У стандартного Docker-контейнера оно обычно выше: от нескольких сотен миллисекунд до нескольких секунд в зависимости от размера образа, необходимости его загрузки и времени загрузки среды выполнения встроенного приложения. В отличие от Firecracker здесь не упоминается ни одна цифра, которая была бы универсально указана: результат слишком сильно зависит от изображения, проверенного на одно значение, чтобы достичь консенсуса.
WebAssembly: что такое Fastly, WasmEdge и документ научных исследований
Три источника, три разных статуса: исторический поставщик, проект под управлением фонда и исследовательская работа.
В 2019 году быстро запустил Compute@Edge на Lucet, собственном компиляторе и среде выполнения WASM для предварительной компиляции. При этом запуске компания зафиксировала время создания экземпляра WASM менее миллисекунды, что оказало длительное влияние на дискуссию о холодном запуске WASM в отрасли. В 2021 году Fastly прекратила автономную разработку Lucet и перенаправила свои усилия на Wasmtime, чей бэкэнд компиляции Cranelift унаследовал часть этих оптимизаций: это одна из причин, почему Wasmtime сегодня остается эталоном для этого типа нагрузки.
WasmEdge, среда выполнения WASM под управлением CNCF (первоначально SSVM, поддерживаемая Second State), заявляет в своей официальной документации о значительно меньшем объеме запуска и занимаемой памяти, чем эквивалентный контейнер Docker, с явным позиционированием на периферии и нагрузками IoT. Это цифра, опубликованная самим издателем проекта, и ее следует читать как таковую: претензию к продукту, а не независимый аудит.
Что касается академических исследований, Faasm (Shillaker & Pietzuch, USENIX ATC 2020, также доступен в предварительной публикации) создает бессерверную платформу с отслеживанием состояния, опирающуюся на изоляцию WebAssembly (через WAVM, а не Wasmtime) именно потому, что она позволяет создавать экземпляры функций с гораздо меньшими затратами, чем изоляция с помощью контейнера или виртуальной машины. В статье не говорится конкретно о Wasmtime, но она обеспечивает независимое академическое подтверждение структурных аргументов, изложенных в предыдущем разделе.
Wasmtime vs Wasmer vs WasmEdge: почему опубликованные цифры не совпадают
Сравнение этих трех сред выполнения только по названию скрывает реальную переменную: выбранный бэкэнд компиляции, который радикально меняет баланс между скоростью запуска и производительностью выполнения.
| Васмтайм | Cranelift (по умолчанию JIT) + AOT через компиляцию wasmtime | Bytecode Alliance · открытое управление, используется Fastly, Shopify, Aurabase |
|---|---|---|
| Васмер | Singlepass, Cranelift или LLVM по вашему выбору | Singlepass минимизирует время компиляции; LLVM максимизирует производительность выполнения |
| ВасмЭдж | Компилятор AOT для конкретного проекта | CNCF · позиционирование на периферии/Интернете вещей и в облаке |
Singlepass, самый быстрый бэкэнд компиляции Wasmer, существует именно потому, что его команда определила холодный запуск как отдельную ось производительности стабильного выполнения: модуль, скомпилированный в Singlepass, запускается быстрее, но работает медленнее во время пиковой нагрузки, чем тот же модуль, скомпилированный в LLVM. Это принятый компромисс, а не скрытый недостаток.
Компания Wasmer опубликовала собственное сравнение производительности с Wasmtime — практикой, которая вызвала в сообществе WASM дебаты по поводу используемой методологии и сопоставимости протестированных сценариев. Это не обвинение в недобросовестности: это структурное напоминание. Редактор среды выполнения лично заинтересован в публикации сценария, в котором он выигрывает, что делает независимую проверку еще более полезной перед принятием решения о выборе архитектуры на основе одного числа.
Сравнительная таблица: что документирует каждый источник, а что не документирует
| Фейерверк (AWS) | Запуск < 125 мс, служебные данные < 5 МБ Рецензируемая исследовательская статья | Агаче и др., USENIX NSDI 2020. |
|---|---|---|
| Lucet → Wasmtime (Быстро) | Реализация менее миллисекунды (2019 г.) Данные поставщика, здесь не воспроизводятся. | Анонсируем Compute@Edge, быстро |
| ВасмЭдж | Меньший объем памяти при запуске и меньшее потребление памяти по сравнению с заявленным продуктом DockerPublisher | Официальная документация WasmEdge (CNCF) |
| Фаасм (поиск) | Изоляцию WASM значительно дешевле создать, чем контейнер. Использует WAVM, а не Wasmtime. | Шиллакер и Пицуч, USENIX ATC 2020 |
| Стандартный Docker-контейнер | От сотен мс до нескольких секунд Нет единого консенсусного числа | Широко документированное поведение |
Эти пять строк не читаются как единая классификация: они взяты из разных методологий, дат и поколений времени выполнения. Для более глубокой методологической критики надежности этого типа тестов WASM наша статья об ограничениях тестов WebAssembly идет дальше настоящего сравнения, которое по-прежнему сосредоточено на том, что конкретно утверждает каждый источник.
Что на самом деле меняет этот разрыв при выборе периферийной архитектуры
Преимущество холодного запуска WASM больше всего зависит от нагрузок, наиболее чувствительных к задержке первого запроса, а не на всех нагрузках в равной степени.
Это особенно влияет на очень нерегулярный пограничный трафик (всплески, сопровождаемые молчанием), изоляцию для каждого запроса, а не для каждого контейнера, совместно используемого несколькими запросами, а также для инфраструктуры, которая фактически сводит количество экземпляров к нулю между двумя пиками вместо того, чтобы постоянно поддерживать горячий пул. При стабильной и предсказуемой нагрузке, когда экземпляры все равно остаются горячими, структурный разрыв при холодном запуске имеет меньшее значение.
WebAssembly также поддерживает ограничения, отличные от холодного запуска: доступ к файловой системе или сети осуществляется через WASI, интерфейс все еще развивается в зависимости от сред выполнения и их версий, а модуль, скомпилированный для быстрого запуска (например, Singlepass на стороне Wasmer), не обязательно является самым быстрым после установки под большой нагрузкой. Холодный старт и пиковая производительность остаются двумя разными осями, которые редко оптимальны одновременно в одном профиле компиляции.
Чтобы оценить выбор периферийной архитектуры по этому критерию, Aurabase включила три конкретных вопроса, которые следует задать любому поставщику: какая именно среда выполнения используется, какой бэкэнд компиляции (JIT или AOT) и измеряется ли показатель расширенного холодного запуска независимой третьей стороной или только самим издателем среды выполнения.
Часто задаваемые вопросы
Информацию об этой же проблеме на уровне базы данных см. в нашей статье о холодном запуске бессерверного Postgres.