5

我有一台服务器,比如 16 核和 32G 内存。对于像这样的进程apache,它为每个新连接生成一个新线程,以下哪个替代方案更好,为什么?同样在应用程序的情况下会发生什么cassandra。如果 cassandra 有很多写入内存的情况,这意味着在同一台机器上拥有两个“节点”会有任何好处吗?

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

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

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

对于像 cassandra 这样的应用程序,其中线程将拥有它们将写入的共享内存,线程之间的上下文切换何时发生?

4

2 回答 2

2

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

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

但它始终是执行代码的线程。

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

操作系统线程调度程序对此进行控制。

因此,性能取决于正在运行的线程数、可用内核数以及这些线程在做什么。假设它们可以在核心上运行,那么事情可能会很快。但这种情况很少发生,线程可能需要等待、阻塞等。

运行两个实例或一个实例多线程只会产生真正的区别,我认为在运行两个实例的情况下,线程数多于内核数。

还有 IO 的因素,它不取决于您的 CPU 或线程,而是取决于您的硬盘延迟和 RAM 延迟。如果您的许多线程将大部分时间都花在等待 IO 上,那么运行您的应用程序的一两个实例不会有太大的不同。

然而,这是性能和线程,除非经过测量,否则很难给出准确的预测。

于 2012-10-03T12:06:08.777 回答
1

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

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

对于像 cassandra 这样的应用程序,其中线程将拥有它们将写入的共享内存,线程之间的上下文切换何时发生?

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

于 2012-10-03T12:03:16.673 回答