Comments 8
Когда то ковырялся в системе плагинов envoy, так же thread local storage хоста кладете экземпляры wasm-движка и из-за этого имеете повышенное потребление памяти?
Данные необходимо копировать
Тоже приведет к увеличению потребления CPU и MEM. Не появились пропозалы, позволяющие не копировать память?
Когда то ковырялся в системе плагинов envoy, так же thread local storage хоста кладете экземпляры wasm-движка и из-за этого имеете повышенное потребление памяти?
У нас рабочие процессы однопоточные, так что thread local storage в принципе не используется. Движок один, а виртуальные машины могут быть на каждый запрос или по одной на все запросы внутри каждого рабочего процесса - как настроите.
Не появились пропозалы, позволяющие не копировать память?
Не встречались.
Такой вопрос: как организовали синхронизацию потоков при работе с WASM и с файловой системой в частности?
В том же примере с SQLite - SQLite не поддерживает многопоточный доступ (на запись, для многопоточного чтения WAL-режим нужен). Получается конкурирующие запросы будут конкурировать за файлы? Или как-то синхронизируется доступ к файлам между потоками?
P.S. В недостатках WASIp1 сказано "нет сокетов", но в WASIp1 есть файловые сокеты.
Такой вопрос: как организовали синхронизацию потоков при работе с WASM и с файловой системой в частности?
В примере с SQLite всё просто и без изысков: взяли лок на базу, поработали, отпустили. Разные рабочие процессы будут ждать на локе. Это всё-таки демонстрационный пример WASM-модуля, а не настоящая база данных.
P.S. В недостатках WASIp1 сказано "нет сокетов", но в WASIp1 есть файловые сокеты.
Оно не сильно помогает с точки зрения установления соединений с кем-то в сети.
Вопрос: а как организована передача сложных значений в Component Model и в WASIp2?
В WASIp1 было понятно - запросил размер у хоста, подготовил буфер, в буфер хост записал данные.
Но в WASIp2 схема не такая - многие аргументы просто передаются по ссылке.
При этом wit-bindgen упорно генерирует cabi_realloc
, который позволяет хосту выделять память и изменять ее размер. Но в спеках Component Model нет описания этой функции (максимум realloc упоминается, да и то в двух разных сигнатурах - с 2 и 4 аргументами).
При этом cabi_realloc
генерируется с разным поведением и разными проверками (на разных языках) - всех нюансов я не смог понять.
Хотелось бы понять, как именно передаются сложные данные между хостом и WASM в рамках WASIp2.
И непонятно, кто и когда должен очищать буферы после cabi_realloc
. Думал "очистка" - это realloc с newSize в 0, но некоторые реализации это явно запрещают (а другие наоборот, разрешают).
P.S. я понимаю, что cabi_realloc
- это сокращение Canonical ABI и realloc, но именно концов, откуда пошло такое имя, найти не удалось. Ну и полную спецификацию найти бы.
P.P.S. и как будут разные модули взаимодействовать, если на разных языках написаны? Или все должны строго cabi_realloc
использовать для работы с памятью? А там какую реализацию подсунули - с той и работаем?
Подробности про передачу аргументов, выделение памяти и все нюансы тут: https://github.com/WebAssembly/component-model/blob/main/design/mvp/CanonicalABI.md
Привет, это команда GitVerse! У тебя крутая статья, будем рады видеть тебя в сезоне open source. Для этого просто поставь тег "сезон open source" – и ты участвуешь :)
Расширение возможностей веб-сервера при помощи WASM на примере Angie