Докер и -марч родной - PullRequest
1 голос
/ 19 июня 2019

Мое приложение значительно выигрывает от расширенных функций ЦП, к которым gcc может обращаться при работе с -march native. Docker может сгладить различия в ОС, но как он обрабатывает разные процессоры? Чтобы создать приложение, которое может работать на любом процессоре, я должен был бы создать его для amd64, теряя при этом большую производительность. Есть ли хороший способ распространения образов Docker, когда приложение должно быть скомпилировано отдельно для каждой архитектуры ЦП?

1 Ответ

6 голосов
/ 19 июня 2019

Docker вообще не обрабатывает процессор. Это просто комбинация пространства имен ядра , системного уровня FS (например, UnionFS ) и цитирование процесса .
Когда вы запускаете что-то в Docker-контейнере, это просто исполняемый файл, работающий на вашей ОС , без виртуализации , он имеет доступ только к выбранному набору объектов ядра (например, устройств) и может привязан к иерархии FS в результате наложения различных FS (в том числе в контейнере Docker).

Следовательно, Docker вообще не обрабатывает процессор, он полностью ортогональн к вашей проблеме.

Как прокомментировал Питер 1017 *, существует два основных способа загрузки ЦП:

  1. Вы загружаете правильную динамическую библиотеку (но каждый вызов функции в библиотеке использует указатель).
  2. Вы создаете несколько версий одного и того же статически связанного двоичного файла и запускаете правильную.

Основная проблема заключается в том, что иногда расширения ISA являются ортогональными, и это приводит к экспоненциальному росту комбинаций (т.е. количества библиотек / двоичных файлов). Итак, учитывая, что вы имеете дело с базой данных Докера, вы можете немного упростить подход (если комбинации являются проблемой):

  1. Либо сделайте несколько расширений ISA необходимыми (если их отсутствие слишком сильно ухудшит производительность). Для дополнительных расширений вы можете использовать один из подходов выше.
  2. Создайте только несколько базовых контейнеров. Например. Один для общего amd64, один для amd64-avx, один для amd64-avx2-aesni-tsx и аналогичный. Идея состоит в том, чтобы создать только несколько контейнеров, которые охватывают всех , большинства и нескольких ваших пользователей.

EDIT
Как указывает BeeOnRope в комментариях , докеры имеют версию, работающую на Windows. Он использует Hyper-V для запуска виртуальной машины Linux с версией Linux Docker .
Поскольку Hyper-V является собственным VMM, кроме дополнительного уровня, применяются те же соображения.
Аналогично, есть версия для MacOS. На этот раз он использует каркас гипервизора, основанный на xhyve .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...