像Docker这样的集装箱化软件是如何翻译CPU指令的? [英] How does containerization software like Docker translate CPU instructions?
问题描述
我最近遇到一个bug,其中python库使用某个CPU指令,该指令存在于一个x86处理器上而不存在于另一个x86处理器上,从而导致一个系统上的程序意外崩溃(非法指令),而另一个系统上没有。这让我想到了容器化为我的软件创建定义良好的运行时环境的好处。但当我意识到这是多么低的水平时,我的大脑陷入了停顿,我无法通过推理和互联网上的阅读来计算出,像docker这样的软件的隔离程度达到了什么程度。
问题
所以我的问题是:容器软件(如Docker或LXC)是否能够模拟物理硬件上不存在的指令?如果容器不能,完整的VM是否能够处理它?
轶事信息
我想我会填空,只是因为人们很好奇。
我遇到的特定场景是在尝试将Reed-Solomon擦除编码应用于数据对象时。我使用的是PyECLib库,它通过liberasurecode
库实现Vandermonde Reed-Solomon(我相信它又使用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')
环境
我在多个Linux平台上使用Python3.6。值得注意的是,在下面指定的处理器上运行Fedora25的LXC容器中发生了严重破坏,但我敢打赌LXC和Fedora与此没有什么关系。
我同时尝试了pyeclib 1.4和1.1,也发生了同样的情况。
这些处理器使我的程序崩溃:
- 英特尔至强X5660
- 英特尔至强X3363
- 英特尔至强E5405
- 英特尔至强X3430
- 英特尔至强E3110
以下是一些工作正常的处理器:
- 英特尔至强E31220
- 英特尔酷睿i7-7500U
推荐答案
容器不翻译指令。运行在容器中的程序与运行在同一台机器上的任何其他程序完全相同,不同之处在于它具有特定内容的单独("命名空间")实例,如文件系统、网络堆栈和系统主机名。CPU未进行仿真或虚拟化(无论如何,不会比平时多)。
虚拟机可以支持主机不支持的指令,但它们不一定这样做。如果它们这样做,通常会在性能上付出很大代价。
这篇关于像Docker这样的集装箱化软件是如何翻译CPU指令的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!