多个进程与多个线程,用于服务器上的CPU密集型和IO密集型进程

时间:2012-10-03 11:53:23

标签: multithreading cassandra operating-system multiprocessing

我有一台服务器,例如16核和32G内存。对于像apache这样的进程,它为每个新连接生成一个新线程,以下哪个选项更好,为什么? 此外,在cassandra等应用程序的情况下会发生什么。如果cassandra存在大量写入内存,这意味着在同一台机器上有两个“节点”将以任何方式受益?

  1. 同一个应用程序在同一台计算机上运行并在两个不同端口上运行的多个(例如两个)实例。(可能是本机前面不同计算机上的LB )。

    我很困惑OS将如何处理多线程应用程序的两个实例。这两个进程是否都会在所有内核上运行线程?在什么情况下将发生上下文切换(在进程和线程之间)以及它将如何影响性能?

  2. 在一个端口上提供服务的多线程应用程序的单个实例。

  3. 对于像cassandra这样的应用程序,其中线程将具有他们将要写入的共享内存,何时将在线程之间进行上下文切换?

2 个答案:

答案 0 :(得分:2)

在Windows上下文(以及Unix上的AFAIK)中,进程只是一个执行线程的结构上下文(并且还有一些内存保护),这意味着执行的事情代码只是一个线程。

进程不能像线程在同一进程中那样容易地共享内存。

但它总是一个执行代码执行的线程。

现在,在同一台机器上运行的两个应用程序实例(多线程)将使用可用的CPU内核,并且必须共享这些内核。如果你的核心数量多于你的应用程序中的线程总数,那么你很幸运,因为这意味着可以让所有线程都运行而无需上下文切换到位为了另一个。然而,那是理论上的 。在实践中,操作系统必须与其他线程(可能甚至不是您的应用程序的线程)共享在核心上运行的特定线程的时间,因此每个线程都有一个特定的时间片(量子),它可以在被切换之前运行

OS线程调度程序可以控制它。

因此,性能取决于正在运行的线程数以及可用的内核数以及这些线程正在执行的操作。假设他们可以只运行,一旦进入核心,那么事情可能会很快。但这种情况很少发生,线程可能需要等待,阻止等等。

运行两个实例或一个多线程实例只会产生一个真正的区别我认为当你运行两个实例的情况下你有比核心更多的线程。

还有IO的因素,它不依赖于您的CPU或线程,而是依赖于您的硬盘延迟和RAM延迟。如果很多线程花费大部分时间等待IO,那么运行应用程序的一个或两个实例将没有太大的区别。

然而,这是性能和线程,除非测量非常难以给出更准确的预测。

答案 1 :(得分:1)

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

如果您的进程受IO限制,则吞吐量不受CPU限制,并且一个线程可以为所有IO请求提供服务。

  

对于像cassandra这样的应用程序,其中线程将具有他们将要写入的共享内存,何时将在线程之间进行上下文切换?

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