![运行一个产生 N 个线程的进程或运行 N 个进程哪个更快?](https://linux22.com/image/1345848/%E8%BF%90%E8%A1%8C%E4%B8%80%E4%B8%AA%E4%BA%A7%E7%94%9F%20N%20%E4%B8%AA%E7%BA%BF%E7%A8%8B%E7%9A%84%E8%BF%9B%E7%A8%8B%E6%88%96%E8%BF%90%E8%A1%8C%20N%20%E4%B8%AA%E8%BF%9B%E7%A8%8B%E5%93%AA%E4%B8%AA%E6%9B%B4%E5%BF%AB%EF%BC%9F.png)
我需要在实验室服务器上运行大约 1500 个作业。我使用的程序(blastpgp
如果有人关心的话)能够以并行模式运行,“-a”选项设置它将启动多少个线程。所讨论的服务器有 40 个 64 位 Opteron CPU 可用。
我有以下选择:
按顺序逐一运行作业,
blastpgp
通过启动 40 个线程来占用所有 40 个核心(-a 40
)。并行运行 40 个作业,每个作业只启动一个线程。
这两个选项中哪一个更快?它们等价吗?我想这可能取决于特定的硬件/软件/作业细节,但在集群上运行本机并行程序时是否存在一般规则?
答案1
我在 stackoverflow 上问了一个类似(不完全相同)的问题,普遍的共识似乎是多线程会更快,因为:
- 线程比进程更轻量,对系统的压力更小
- 线程意味着只启动一次程序,因此任何初始化任务只需执行一次。
- 操作系统在管理内存和调度方面通常比用户空间更好,因此最好启动多个线程并让操作系统对它们进行排序。
我将其标记为社区 wiki,因为它只是我在 stackoverflow 收到的答案的摘要。