像Docker这样的集装箱化软件如何转换CPU指令?

lin*_*dhe 5 emulation virtual-machine instructions docker

我最近遇到了一个错误,其中python库使用某个CPU指令,该指令存在于一个x86处理器上而不存在于另一个x86处理器上,导致程序(非法指令)在一个系统上意外崩溃,但在另一个系统上没有.这让我想到了容器化的好处,为我的软件创建了一个明确定义的运行时环境.但是当我意识到这种情况有多低时,我的大脑停滞不前,而且我无法从推理或互联网阅读中找出解决方案,比如像docker这样的软件隔离程度.

所以我的问题是:请问一个集装箱软件,如码头工人或LXC,能够模拟不上的物理硬件中存在的指令?如果一个容器不能,那么一个完整的虚拟机是否能够处理它?

轶事信息

我以为我会填补空白,因为人们很好奇.

我遇到的具体情况是在尝试将Reed-Solomon擦除编码应用于数据对象时.我正在使用PyECLib库,它通过库实现Vandermonde Reed-Solomon liberasurecode(我相信它反过来使用了jerasure).

最小工作示例

这段代码在兼容处理器上运行时没有错误,但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')
Run Code Online (Sandbox Code Playgroud)

环境

我在多个Linux平台上使用Python 3.6.事情肆虐的一个值得注意的案例是在下面指定的处理器上运行Fedora 25的LXC容器中,但我敢打赌LXC和Fedora几乎没有关系.

我已经尝试了pyeclib 1.4和1.1,并且发生了同样的事情.

这些处理器使我的程序崩溃:

  • 英特尔至强X5660
  • 英特尔至强X3363
  • 英特尔至强E5405
  • 英特尔至强X3430
  • 英特尔至强E3110

以下是一些工作正常的处理器:

  • 英特尔至强E31220
  • 英特尔酷睿i7-7500U

hob*_*bbs 6

容器不翻译指令。在容器中运行的程序与在同一台机器上运行的任何其他程序完全相同,只是它具有某些事物的单独(“命名空间”)实例,例如文件系统、网络堆栈和系统主机名。CPU 没有被模拟或虚拟化(无论如何,比平常更多。)

虚拟机可以支持主机不支持的指令,但它们不一定这样做。如果这样做,通常会付出巨大的性能代价。