multithreading - 并发进程比单个进程慢很多
问题描述
我在 CentOS 7 中使用带有 AMPL 的单线程 CPLEX 建模和求解非线性程序 (NLP)(我正在限制 CPLEX 明确使用一个线程)。我正在使用具有 6 个独立内核的处理器(intel i7 8700)来解决6 个独立的测试实例。
当我按顺序运行这些测试时,考虑到经过的时间,它比我同时运行这 6 个实例(大约 63%)时快得多。它们在独立的进程中执行,读取不同的数据文件,并将结果写入不同的输出文件。我还尝试使用多线程按顺序解决这些测试,并且我得到的时间与仅按顺序只有一个线程的情况相似。
我已经使用 top/htop 检查了这些进程的行为。他们得到不同的处理器来执行。所以我的问题是,如果这些测试在不同的内核中只用一个线程解决并且它们是单独的进程,那么并发执行这些测试如何会对经过的时间产生如此大的影响?
任何想法将不胜感激。
解决方案
使多个线程的性能比单个线程差是很容易的。成功的多线程和加速的关键是不仅要了解程序是多线程的这一事实,还要确切地了解您的线程如何交互。以下是您在查看代码时应该问自己的几个问题:
1)各个线程是否共享资源?如果是这样,这些资源是什么?当您访问它们时,它们会阻塞其他线程吗?
2) 你的多线程代码依赖的最慢的资源是什么?一个常见的瓶颈(并且经常被忽略)是磁盘 IO。多个线程可以更快地处理数据,但它们不会使磁盘读取速度更快,并且在许多情况下,多线程会使它变得更糟(例如抖动)。
3) 对公共资源的访问是否正确同步?
为此,在不了解您的问题的情况下,我建议:
a)不从不同的线程读取不同的文件。您希望尽可能保持磁盘 IO 的顺序,这在单个线程中更容易。也许从单个线程批量读取文件,然后将它们分流出来进行处理。
b) 尽可能保持线程自治——任何来回通信都会导致线程争用并减慢速度。
推荐阅读
- reactjs - React 脚本启动给出了 Unexpected token 错误
- android - 2019年用GoogleMaps V1编译安卓应用
- c++ - 内联显示链表
- laravel - 搜索查询只返回一个用户
- python - 我在 pycharm 中导入 nmap 时遇到问题
- c# - 在 Windows 应用程序中导出数据时向 Excel 文件添加多个标题文本
- python - 如何在 SQL Server 管理工作室中运行 exe 文件
- python - 如何从 IMDB 网站上抓取电影信息?
- java - 如何解决“原因:类型代码无效:8F”
- ios - 是否可以在 iOS UI 测试中模拟两指滑动?