在服务器上进行CPU密集型和IO密集型进程时,多进程与多线程哪个更好?

5
我有一台服务器,例如拥有16核心和32G内存。对于像apache这样的进程,每个新连接都会产生一个新线程,那么以下哪种选择更好呢?为什么? 另外,如果是cassandra这样的应用程序,在需要大量写入内存时,在同一台机器上拥有两个“节点”是否有益处?
1. 在同一台机器上运行多个(例如两个)相同应用程序实例,并在两个不同的端口上提供服务。(在此机器前面可能会有一个负载均衡器) 我困惑于操作系统如何处理同一多线程应用的两个实例。这两个进程都将在所有核心上运行吗?在哪些情况下会发生上下文切换(在进程和线程之间),它将如何影响性能?
2. 在一个端口上提供服务的单个多线程应用程序实例。
对于像cassandra这样的应用程序,线程将具有共享内存进行写入,线程之间的上下文切换会在何时发生?
2个回答

2
在Windows环境下(我认为在Unix中也是如此),进程仅仅是一个结构上下文(还有一些内存保护措施),围绕着一个执行代码的线程,这意味着执行代码的东西只是一个线程。
进程不能像同一进程中的线程那样轻松地共享内存。
但始终是线程执行代码。
现在,在同一台机器上运行的两个实例多线程应用程序将使用可用的CPU核心,并且必须在它们之间共享这些核心。如果您拥有的核心数比应用程序中的总线程数多,那么您很幸运,因为这意味着它可以所有线程都在不需要上下文切换来为其他线程腾出位置的情况下运行。那只是理论上的情况。实际上,操作系统必须与运行在核心上的特定线程与其他线程(甚至可能不是您的应用程序的线程)共享时间,因此每个线程都有一定的时间片(量子)可以运行,然后被切换出去。
操作系统线程调度程序控制着这一点。
因此,性能取决于运行的线程数量、可用的核心数量以及这些线程正在做什么。假设它们可以在核心上运行一次,那么事情可能会很快。但这很少是情况,线程可能需要等待、阻塞等。
在运行两个实例的情况下,只有当您运行的两个实例中有比核心更多的线程时,才会产生真正的差异。
还有IO因素,它不取决于CPU或线程,而取决于硬盘延迟和RAM延迟。如果大量线程的大部分时间都花在等待IO上,那么运行一个或两个应用程序实例不会有太大的区别。
然而,这是性能和线程,除非进行测量,否则很难给出准确的预测。

1

在同一台机器上运行多个相同应用程序需要进程间同步。如果进程间同步的数量较少,则此方法可能是有益的。此外,如果您的应用程序本身是多线程的,则只需要一个进程。如果您的应用程序是单线程的,则可能希望运行多个实例,例如每个 CPU 一个进程,以利用硬件资源。

如果您的进程受 IO 限制,则吞吐量不受 CPU 限制,一个单线程可以处理所有 IO 请求。

对于像cassandra这样的应用程序,在这些线程将写入共享内存的情况下,线程之间的上下文切换会在何时发生?

当两个或多个线程尝试同步它们对共享内存的写入时,上下文切换会发生。


1
只有当这些进程需要相互通信时,才需要进行进程间同步。 - Tony The Lion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接