Python 为什么我的优化解算器在docker中运行较慢?

Python 为什么我的优化解算器在docker中运行较慢?,python,performance,docker,optimization,mathematical-optimization,Python,Performance,Docker,Optimization,Mathematical Optimization,我是docker的新手,最近写了一个dockerfile来将一个名为SuitePort的数学优化解算器容器化。然而,当在一些测试问题上测试优化解算器时,我发现docker中的性能比docker之外的性能要慢。例如,在我的机器上,一个线性程序的演示问题(demoLP.py)需要约12秒才能解决,但在docker中需要约35秒。我花了大约一周的时间浏览博客和stackoverflow帖子,寻找解决方案,但无论我做了什么更改,docker中的计时总是~35秒。有人知道会发生什么事吗?有人能给我指出正确

我是docker的新手,最近写了一个dockerfile来将一个名为SuitePort的数学优化解算器容器化。然而,当在一些测试问题上测试优化解算器时,我发现docker中的性能比docker之外的性能要慢。例如,在我的机器上,一个线性程序的演示问题(demoLP.py)需要约12秒才能解决,但在docker中需要约35秒。我花了大约一周的时间浏览博客和stackoverflow帖子,寻找解决方案,但无论我做了什么更改,docker中的计时总是~35秒。有人知道会发生什么事吗?有人能给我指出正确的方向吗

以下是指向优化解算器的docker hub和PYPI页面的链接:

编辑1:由于@user3666197的评论,添加了一个额外的想法。虽然我并不期望SuitePort在docker容器中也能表现得很好,但我对这个演示问题的~3倍减速感到惊讶。也许这个问题可以重述如下:如何确定这种减速是否纯粹是因为我在docker容器内执行CPU-RAM-I/O密集型代码,而不是因为docker文件配置的其他问题造成的?

注意:这种容器化的目的是为用户提供一种简单的方法,让他们开始使用Python中的优化软件。虽然PYPI上提供了优化软件,但有许多非python依赖项可能会给希望使用该软件而不会遇到安装问题的人带来问题

Q:如何确定这种减速是否纯粹是由于我在docker容器内执行CPU-RAM-I/O密集型代码,而不是由于docker文件配置的其他问题造成的

战场:

步骤0:收集有关主机端运行处理的数据:



此外,还可以通过以下方式从机箱外部查看Docker容器的工作负载视图:

cat /proc/<_PID_>/status | grep nonvolu ### in one terminal session
nonvoluntary_ctxt_switches: 6 <------------------------------------[*] increasing?
cat/proc//status | grep nonvolu#####在一个终端会话中

非自愿的ctxt交换机:6除了使用容器以近乎COTS的方式对人群合理重复或大规模部署预先配置好的即用生态系统这一毫无疑问的积极好处外,是什么让你产生了这样的假设,即任何此类docker容器化技术都将导致执行{CPU-| RAM-I/O}-抽象容器中的密集代码没有任何负面外部性-无论是运行抽象/容器化的附加成本-引擎-(读取速度较慢)加上严重浪费的一级/二级/三级缓存高效重用效果,这不会发生在容器内部?您可能需要通过使用
perf
之类的工具分析您的具体案例来挖掘更多信息。本文中的示例:由于日志记录使用了一个库,所以性能很差。要直观地查看性能记录…
捕获的内容,请检查并始终欢迎@chrundle。正如Anastasios在上面所说的那样,非常不利的低效率来自于C组共享的巨大交叉依赖性这一事实——这是性能搜索中的最大罪恶——让我提出一个A/B/C测试——在裸机上运行相同的测试[A]+然后在虚拟机内部运行(可能使用VmWare工具进行“打包”)将裸机原样放入VM+VmWare Player供私人使用),仍在同一台裸机设备上[B]+与容器相同[C]---如果性能有问题,VM隔离v/s Docker共享C组方法数据将告诉您。我在这里做了一些笔记:。我不确定,但他们可能会有所帮助:-)@user3666197您的A/B/C测试听起来是个好主意。我将尽快着手设置和运行B测试。
 python demoLP.py  # <TheWorkloadUnderTest> expected ~ 12 [s] on bare metal system 
cat /sys/fs/cgroup/cpu,cpuacct/cpu.stat
nr_periods 0
nr_throttled 0
throttled_time 0 <-------------------------------------------------[*] increasing?
cat /proc/<_PID_>/status | grep nonvolu ### in one terminal session
nonvoluntary_ctxt_switches: 6 <------------------------------------[*] increasing?
systemd-cgtop                           ### view <Tasks> <%CPU> <Memory> <In/s> <Out/s>