Как программное обеспечение для контейнеров, такое как Docker, переводит инструкции процессора? - PullRequest
0 голосов
/ 24 мая 2018

Недавно я столкнулся с ошибкой, когда библиотека python использовала определенную инструкцию процессора, которая существовала на одном процессоре x86, но не на другом, что привело к неожиданному сбою программы ( Недопустимая инструкция ) в одной системено не по другому.Это заставило меня задуматься о преимуществах контейнеризации для создания четко определенной среды выполнения для моего программного обеспечения.Но мой мозг остановился, когда я понял, насколько это низкий уровень, и я не мог понять ни из рассуждений, ни из чтения в интернете, в какой степени идет изоляция таких программ, как докер.

Вопрос

Итак, мои вопросы: Может ли программное обеспечение для контейнеризации, такое как Docker или LXC, эмулировать инструкцию, которой нет на физическом оборудовании? И сможет ли полная ВМразобраться с этим, если контейнер не мог?

Анекдотичная информация

Думал, что я заполню пробелы, просто потому, что людям было любопытно.

Конкретный сценарий у меня былбыл пойман при попытке применить кодирование стирания Рида-Соломона к объекту данных.Я использую библиотеку PyECLib , которая реализует Вандермонда Рида-Соломона через библиотеку liberasurecode (которая, в свою очередь, использует jerasure , я считаю).

Minimal WorkingПример

Этот фрагмент кода выполняется без ошибок на совместимом процессоре, но создает исключение Illegal instruction на некоторых старых процессорах:

from pyeclib.ec_iface import ECDriver

ec_driver = ECDriver(k=1, m=5, ec_type='liberasurecode_rs_vand')
ec_driver.encode(b'foo')

Среда

I'mиспользование Python 3.6 на нескольких платформах Linux.Известный случай, когда все разрушается, - это контейнер LXC с Fedora 25 на указанном ниже процессоре, но я бы поспорил, что LXC и Fedora не имеют к этому никакого отношения.

Я пробовал и pyeclib 1.4, и1.1, и происходит то же самое.

Эти процессоры вызывают сбой моей программы:

  • Intel Xeon X5660
  • Intel Xeon X3363
  • IntelXeon E5405
  • Intel Xeon X3430
  • Intel Xeon E3110

Вот некоторые процессоры, которые отлично работают:

  • Intel Xeon E31220
  • Intel Core i7-7500U

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Практический ответ: нет, ни один из существующих продуктов не способен на это.

Это не странно удивляться.На самом деле, не так давно процессоры ARM поддерживали именно эту функциональность даже без виртуальной машины.В ARM плавающая точка раньше была необязательной, но на процессорах без FP исключение «недопустимая операция» могло быть надежно перехвачено.Если вы связали библиотеку эмуляции FP, то она может вступить во владение и восстановить после исключения.

Более современный подход заключается в использовании альтернативных путей кода.Просто скомпилируйте две версии каждой функции, которая получит пользу от необычных инструкций.Во время выполнения проверьте доступный процессор и используйте его, чтобы решить, какой набор функций использовать.Вариант состоит в том, чтобы упаковать эти функции в две библиотеки DLL / .so и загрузить одну из двух в зависимости от процессора.

0 голосов
/ 25 мая 2018

Контейнеры не переводят инструкции.Программа, выполняемая в контейнере, точно такая же, как и любая другая программа, работающая на том же компьютере, за исключением того, что она имеет отдельные («пространство имен») экземпляры определенных вещей, таких как файловая система, сетевой стек и системное имя хоста.Процессор не эмулируется и не виртуализируется (во всяком случае, больше, чем обычно).

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

...