Недавно я столкнулся с ошибкой, когда библиотека 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