The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Запуск WebAssembly runtime как модуля ядра Linux

27.09.2018 17:21

Проект Wasmjit развивает не привязанный к браузеру небольшой встраиваемый WebAssembly runtime для запуска WebAssembly-модулей, сгенерированных компилятором Emscripten. Помимо средств для выполнения в пространстве пользователя на базе Wasmjit также развивается модуль ядра Linux, позволяющий выполнять промежуточный код WebAssembly на уровне ядра (ring 0). При выполнении на уровне ядра модуль позволяет обращаться к системным вызовам в форме вызова обычных функций. Код написан на языке C (C90), что позволяет легко портировать Wasmjit на различные платформы. Наработки проекта распространяются под лицензией MIT.

Запуск WebAssembly-приложений на уровне ядра даёт возможность избавиться от накладных расходов, связанных с вытеснением таблиц страниц памяти и трансляцией вызовов между ядром и пространством пользователя. Использование модуля ядра позволяет существенно увеличить производительность приложений, в которых производится активное обращение к системным вызовам, например, web-серверов и реализаций файловых систем на базе FUSE.

Из планов на будущее отмечается: создание модуля для ядра macOS; доведение проекта до возможности выполнения nginx, скомпилированного в WebAssembly; подготовка runtime для псевдокода WebAssembly, сгенерированного из кода на языках Rust и Go; создание интерпретатора; подготовка JIT для архитектуры ARM64; оптимизация x86_64 JIT.

  1. Главная ссылка к новости (https://github.com/rianhunter/...)
  2. OpenNews: Проекты по созданию компиляторов из Java в JavaScript и исполняемые файлы
  3. OpenNews: В рамках проекта Nebulet развивается микроядро для запуска WebAssembly
  4. OpenNews: Сравнение производительности различных реализаций WebAssembly
  5. OpenNews: В компилятор LDC языка D добавлена поддержка WebAssembly
Автор новости: Аноним
Тип: К сведению
Ключевые слова: webassembly, runtime
При перепечатке указание ссылки на opennet.ru обязательно
Обсуждение (48) Ajax | 1 уровень | Линейный | Раскрыть всё | RSS
  • 1.1, zfs (??), 18:40, 27/09/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +11 +/
    > Запуск WebAssembly-приложений на уровне ядра позволяет избавиться от накладных расходов

    А так же от безопасности, изоляции процессов и т.п.
    Пярмо DOS+DPMI64 какой-то.

     
     
  • 2.7, Ordu (ok), 18:53, 27/09/2018 [^] [^^] [^^^] [ответить]  
  • –2 +/
    > А так же от безопасности, изоляции процессов и т.п.

    wasm-код изолирован от внешнего мира. Он выполняется в песочнице, из которой крайне сложно вылезти. Вероятно, всё же возможно -- баги они везде есть, -- но ты же не будешь пихать в ядро недоверенный код? А если код доверенный, то сломать что-то он может лишь нечаянно, а значит использовать дыру для выхода из песочницы у него нет шансов.

     
     
  • 3.12, Аноним (-), 19:02, 27/09/2018 [^] [^^] [^^^] [ответить]  
  • +7 +/
    А вот тут или-или. Вы или таки имеете накладные расходы на песочницу и оверхед на хренову кучу проверок того что то что оно делает здесь и сейчас - типа безопасно, или таки на это забивается, и вот тогда - быстро :).

    В общем не с того конца они яйца чистить начали. Да и вообще, если их в модули ядра понесло - ну, сделали бы нормальную сборку gcc'ом для начала, чтоли. А то все эти перверсии с emscripten'ом - занятие для очень небольшого числа ценителей странного.

     
     
  • 4.19, Ordu (ok), 19:40, 27/09/2018 [^] [^^] [^^^] [ответить]  
  • +/
    > А вот тут или-или. Вы или таки имеете накладные расходы на песочницу
    > и оверхед на хренову кучу проверок того что то что оно
    > делает здесь и сейчас - типа безопасно, или таки на это
    > забивается, и вот тогда - быстро :).

    Это oversimplification. Переупрощение, наверное, если переводить на русский. Всё сложнее. Если мы посмотрим на то, как nginx тратит процессорные такты, то часть он тратит на выполнение кода в ring3, часть он тратит на выполнение кода в ring0, часть на ожидание i/o, и часть на переключение контекстов из ring3 в ring0 и обратно. Ожидание i/o, так же как и выполнение ring0 кода никак не изменится от того, что nginx будет перенесён в ядро. А вот выполнение собственно nginx кода и переключение контекстов изменится. Код nginx, надо полагать, будет выполняться медленнее, а переключение контекстов быстрее, потому что для выхода из jit понадобятся не тысячи тактов процессора, а десятки. Что-то станет медленнее, что-то быстрее, каким же будет суммарное изменение времени выполнения -- я могу лишь гадать.

    > В общем не с того конца они яйца чистить начали.

    Мы это узнаем совершенно точно, когда они запустят nginx в ядре, и прогонят его через тесты.

    > сделали бы нормальную сборку gcc'ом для начала

    Я не знаю, как там насчёт gcc, но rustc сегодня имеет встроенный target webassembly. Emscripten не нужен. И вообще, кто ты такой, чтобы указывать им чем им заниматься? Разработка компиляторов -- это одно, разработка модулей ядра -- это другое и не твоё собачье дело решать за других, чем им заниматься в своё свободное время.

     
     
  • 5.25, Аноним (25), 21:37, 27/09/2018 [^] [^^] [^^^] [ответить]  
  • +/
    Дудки Дополнительные проверки для безопасности или есть, и на это тратятся ресу... текст свёрнут, показать
     
     
  • 6.28, Ordu (ok), 22:10, 27/09/2018 [^] [^^] [^^^] [ответить]  
  • +/
    gt оверквотинг удален А вот сейчас ты пытаешься переусложнить Зачем Чтобы вы... текст свёрнут, показать
     
  • 5.41, Совершенно другой аноним (?), 11:08, 28/09/2018 [^] [^^] [^^^] [ответить]  
  • +1 +/
    >> В общем не с того конца они яйца чистить начали.
    > Мы это узнаем совершенно точно, когда они запустят nginx в ядре, и прогонят его через тесты.

    А ещё можно графику в ядро засунуть и тогда... Wait! OH, SHI--

     
     
  • 6.42, Ordu (ok), 12:15, 28/09/2018 [^] [^^] [^^^] [ответить]  
  • +/
    >>> В общем не с того конца они яйца чистить начали.
    >> Мы это узнаем совершенно точно, когда они запустят nginx в ядре, и прогонят его через тесты.
    > А ещё можно графику в ядро засунуть и тогда... Wait! OH, SHI--

    Это зачем? Думаешь это уменьшит количество сисколлов? Ну, может быть, я честно говоря не знаю, как там на уровне сисколлов выглядят все эти ваши 3d ускорители.

     
  • 3.16, Кирилл (??), 19:29, 27/09/2018 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Так главная идея этого модуля в том, чтобы выкинуть эту самую песочницу с высокими стенками и дать коду привилегии ядра и полный доступ к памяти и прочим ресурсам.
     
     
  • 4.18, Ordu (ok), 19:39, 27/09/2018 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Так главная идея этого модуля в том, чтобы выкинуть эту самую песочницу
    > с высокими стенками и дать коду привилегии ядра и полный доступ
    > к памяти и прочим ресурсам.

    Можно цитату со ссылкой, где эта "главная идея изложена"?

    Если пройти по ссылке на github, то там написано следующее:

    > primary target is a Linux kernel module that can host Emscripten-generated WebAssembly
    > modules. In this configuration it runs WebAssembly modules in kernel-space (ring 0)
    > and provides access to system calls as normal function calls. This configuration avoids
    > user-kernel transition overhead, as well as scheduling overheads from swapping page tables.

    Тут нет ни слова о "привилегиях ядра" и о "полном доступе к памяти и прочим ресурсам".

     
     
  • 5.20, Аноним (20), 19:51, 27/09/2018 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > Here are the current developments goals in order of priority:
    > * Implement enough Emscripten host-bindings to run nginx.wasm
    > ...

    Это означает, как минимум, доступ к сети, а также, скорее всего, еще и к диску.

    Ну и "In this configuration it runs WebAssembly modules in kernel-space (ring 0) and provides access to system calls as normal function calls." как бы намекает.

     
     
  • 6.22, Ordu (ok), 20:58, 27/09/2018 [^] [^^] [^^^] [ответить]  
  • +/
    >> Here are the current developments goals in order of priority:
    >> * Implement enough Emscripten host-bindings to run nginx.wasm
    >> ...
    > Это означает, как минимум, доступ к сети, а также, скорее всего, еще
    > и к диску.

    То есть необходимый набор сисколлов, чтобы было как у юзерспейс процесса, так ведь?

    > Ну и "In this configuration it runs WebAssembly modules in kernel-space (ring
    > 0) and provides access to system calls as normal function calls."
    > как бы намекает.

    Что это намекает? У nginx в user-space есть доступ ко всем сисколлам, значит ли это, что у него есть полный доступ к памяти ядра?

     
     
  • 7.26, Аноним (25), 21:44, 27/09/2018 [^] [^^] [^^^] [ответить]  
  • +/
    > Что это намекает? У nginx в user-space есть доступ ко всем сисколлам,
    > значит ли это, что у него есть полный доступ к памяти ядра?

    Там как бы есть один жирный плюс: изоляция кернел-юзер аппаратно энфорсится железками. И это по скорости вообще ничего не стоит - проверки делаются прямо железками в момент выполнения команд. А переключение контекста - оно как бы да, но его как бы совершенно не обязательно делать на каждый пшик, как при наивной реализации. И ядерщики Linux об этом как-то догадались и заимплементили.

     
     
  • 8.29, Ordu (ok), 22:24, 27/09/2018 [^] [^^] [^^^] [ответить]  
  • +/
    И в чём, собственно, плюс Как я понимаю этот плюс он хорош для выполнения нед... текст свёрнут, показать
     
  • 5.47, eganru (?), 13:43, 30/09/2018 [^] [^^] [^^^] [ответить]  
  • +/
    насколько я помню ядро linux выполняется в одном адресном пространстве.
    если не ошибаюсь, то в общем случае из ring 0 есть возможность управлять mmu, что означает полный доступ к памяти.

    сама по себе конечно вещь безусловно интересная и полезная на данном этапе развития сетевых технологий:
    по сути верно написанный модуль можно подгружать в систему жертвы для более удобных манипуляций с ее железом.

     
     
  • 6.49, Ordu (ok), 15:00, 30/09/2018 [^] [^^] [^^^] [ответить]  
  • +/
    > насколько я помню ядро linux выполняется в одном адресном пространстве.
    > если не ошибаюсь, то в общем случае из ring 0 есть возможность
    > управлять mmu, что означает полный доступ к памяти.

    Угу. А ещё выполнение в ring3 означает доступ к сисколлам, так? Попробуй из wasm в браузере вызвать сисколл.

     
     
  • 7.50, eganru (?), 16:32, 30/09/2018 [^] [^^] [^^^] [ответить]  
  • +/
    [i]А ещё выполнение в ring3 означает доступ к сисколлам, так?[/i] - конечно нет. выполнение в ring3 позволяет выполнять вызовы ядра, если ядро предоставило возможность себя вызывать. вызовом ядра Вы же фактически просто исключение вызываете. и не более.

    web-assembly еще только в начале пути. наверняка abi и прочее будут какое-то время меняться.
    и, естественно, без syscall сфера применения web-assemly существенно уже, чем с ними.

     
     
  • 8.51, Ordu (ok), 18:18, 30/09/2018 [^] [^^] [^^^] [ответить]  
  • +/
    Абсолютная аналогия с вызовами из виртуальной машины наружу Что vm позволит, то... текст свёрнут, показать
     
  • 3.44, Аноним (44), 16:15, 28/09/2018 [^] [^^] [^^^] [ответить]  
  • +/
    не изолирован. Он выполняется с правами ring 0, в каком месте он изолирован?
     
     
  • 4.45, Ordu (ok), 16:34, 28/09/2018 [^] [^^] [^^^] [ответить]  
  • +/
    > не изолирован. Он выполняется с правами ring 0, в каком месте он
    > изолирован?

    Он выполняется в песочнице jit.

     

  • 1.2, yet another anonymous (?), 18:41, 27/09/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    А если работать в физичеких адресах, то накладных расходов ещё меньше.
     
     
  • 2.9, Ordu (ok), 18:54, 27/09/2018 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Да, но тогда мы лишаемся изоляции, и любая ошибка может привести к подвисанию компьютера. Прям как в досе.
     
     
  • 3.27, Аноним (-), 21:51, 27/09/2018 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > Да, но тогда мы лишаемся изоляции, и любая ошибка может привести к
    > подвисанию компьютера. Прям как в досе.

    К тому же трансляция здорово подперта железом. В самом хучшем случае требуется внимание 1 раз на 4 кило страницу, что не так уж и часто. А реально и того реже, потому что таблицы трансляции не перегружаются на каждый пшик. Что-то отыграть конечно можно, но это такие копейки...

     

  • 1.3, Нанобот (ok), 18:43, 27/09/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    > увеличить производительность приложений, в которых производится активное обращение к системным вызовам, например, web-серверов

    Кстати, а почему никто до сих пор не запилил nginx, работающий в режиме ядра?

     
     
  • 2.8, Аноним (8), 18:54, 27/09/2018 [^] [^^] [^^^] [ответить]  
  • +2 +/
    >> увеличить производительность приложений, в которых производится активное обращение к системным вызовам, например, web-серверов
    >
    > Кстати, а почему никто до сих пор не запилил nginx, работающий в режиме ядра?

    https://en.wikipedia.org/wiki/TUX_web_server

     
     
  • 3.17, Нанобот (ok), 19:31, 27/09/2018 [^] [^^] [^^^] [ответить]  
  • +/
    Это не то, оно умеет только статику раздавать, это 5% от nginx
     
  • 2.36, Crazy Alex (ok), 09:42, 28/09/2018 [^] [^^] [^^^] [ответить]  
  • +/
    Потому что для типового случая профита нет, всё равно все расходы будут в бизнес-логике на каком-нибудь php. А кто там что для нетиповых делал - вопрос отдельный, мы об этом можем и не узнать никогда.
     

  • 1.4, Аноним (4), 18:44, 27/09/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    VS Code и Хром больше кушать память и тормозить не будет.
     
  • 1.5, Аноним (8), 18:49, 27/09/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +7 +/
    > доведение проекта до возможности выполнения nginx, скомпилированного в WebAssembly

    Может ещё nginx в браузере запустить?

     
  • 1.6, Аноним (6), 18:50, 27/09/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Безумие какое-то. Зачем запускать nginx под wasm?
     
     
  • 2.10, Аноним (4), 18:55, 27/09/2018 [^] [^^] [^^^] [ответить]  
  • +/
    Чтоб вебсервер был ближе к кольцу 0.
     

  • 1.11, th3m3 (ok), 19:01, 27/09/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Что-то я не совсем понял. Это будет очередной Electron в вакууме?
     
     
  • 2.13, Аноним (8), 19:09, 27/09/2018 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Нет, теперь nginx будет запускаться в Electron
     
     
  • 3.33, th3m3 (ok), 23:25, 27/09/2018 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Нет, теперь nginx будет запускаться в Electron

    Т.е. теперь мы к ним?

     
  • 3.34, Аноним (34), 23:51, 27/09/2018 [^] [^^] [^^^] [ответить]  
  • +2 +/
    осталось запустить электрон в электроне
     

  • 1.14, Аноним (14), 19:10, 27/09/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    Для тех, кто не понял. Это альтернатива юзерспейсным сетевым стекам. И то, и другое нужно, чтобы избежать лишних переключений контекста. Тем, у кого менее миллиона пакетов в секунду на сервер, можно не заморачиваться.
     
  • 1.15, Аноним (15), 19:14, 27/09/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +4 +/
    Подождите, не кмаменьтьте. Я воздушную кукурузу и свч печи достану.
     
     
  • 2.21, Аноним (8), 20:15, 27/09/2018 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Подождите, не кмаменьтьте. Я воздушную кукурузу и свч печи достану.

    Уже можно?

     

  • 1.23, Аноним (23), 20:59, 27/09/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Маразм крепчал...
     
  • 1.30, Аноним (30), 22:46, 27/09/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Жабаскриптерам стало обидно, что код сишников в ядре может крутица, а ихний - нет.
     
  • 1.35, AntonAlekseevich (ok), 00:23, 28/09/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Дальше ждать когда WebAssembly будет крутиться в внутри uefi-flash? (Добро пожаловать в мир где устройство обязано иметь доступ к полноценному интернету.)
     
     
  • 2.52, Александр (??), 23:25, 02/10/2018 [^] [^^] [^^^] [ответить]  
  • +/
    Не, у них там своя атмосфера. EFI Byte Code зовётся. Но суть в принципе та же.
     

  • 1.37, evkogan (?), 10:03, 28/09/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Не понимаю. Изначально wasm - это запуск C/C++ в браузере. Эта штука позволяет запускать wasm без браузера и даже как модуль ядра.
    Но зачем? Почему не запускать C/C++ просто скомпиленным и если надо, то как модуль ядра?
    И да запилить из NGINX модуль ядра наверняка можно и более простыми методами, без wasm.
     
     
  • 2.40, Аноним (40), 10:31, 28/09/2018 [^] [^^] [^^^] [ответить]  
  • +/
    В ядре уже есть eBPF. webaassembly ещё одна виртуальная машина для ядра, не первая и не последнияя.
    Нужно т.к. над эффективностью и безопасностью JIT wasm работает много квалифицированных людей.

    Зачем вообще виртуальные машины в ядре: долгосрочно - штуки типа microsoft singularity, реализация изоляции приложений (и драйверов друг от друга) без бажных хардверных реализаций (интел спектры и мелтдауны), возможность получать плюшки DPDK продолжая использовать ядерный сетевой стек, но не роняя ядро своим кривым кодом, тестовые версии драйверов, которые не будут повреждать чужую память (не будет вероятности повреждения файловой системы из-за драйвера usb гаджета).

     

  • 1.38, Аноним (38), 10:09, 28/09/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Стоило только Линусу на месяцок отлучится, как _эти_ со своими бредовыми идеями налетели.
     
     
  • 2.43, Аноним (43), 15:04, 28/09/2018 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Чует моё сердце, что Линус больше не вернётся.
     
     
  • 3.46, anonymous (??), 23:14, 28/09/2018 [^] [^^] [^^^] [ответить]  
  • +/
    Есть такое.
     

  • 1.39, Аноним (38), 10:23, 28/09/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    И почему бы, кому это реально хочется, просто не оформить существующий код nginx в виде модуля ядра?
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Спонсоры:
    Слёрм
    Inferno Solutions
    Hosting by Ihor
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2019 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру