Pull to refresh

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 есть файловые сокеты.

Оно не сильно помогает с точки зрения установления соединений с кем-то в сети.

В примере с SQLite всё просто и без изысков: взяли лок на базу, поработали, отпустили.

Т.е. это лок от SQLite, а не WASM-движка. ОК, значит обычная конкурентная среда.

Вопрос: а как организована передача сложных значений в 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 использовать для работы с памятью? А там какую реализацию подсунули - с той и работаем?

Привет, это команда GitVerse! У тебя крутая статья, будем рады видеть тебя в сезоне open source. Для этого просто поставь тег "сезон open source" – и ты участвуешь :)

Sign up to leave a comment.

Articles