multithreading - 服务器上 CPU 密集型和 IO 密集型进程的多进程与多线程

标签 multithreading cassandra operating-system multiprocessing

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

  • 同一应用程序的多个(例如,两个)实例在同一台机器上运行并在两个不同的端口上提供服务。 (可能是 native 前面不同机器上的LB)。

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

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

    最佳答案

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

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

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

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

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

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

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

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

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

    关于multithreading - 服务器上 CPU 密集型和 IO 密集型进程的多进程与多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12707924/

    相关文章:

    c - 如何获取进程信息?

    c# - 异步和等待 - 如何维护执行顺序?

    objective-c - 如何确定什么阻塞了主线程

    iOS UI 线程/后台或后台到后台线程通信

    Cassandra : java. lang.OutOfMemoryError:Java 堆空间

    java - 在 cassandra 中上传模式时出现问题

    multithreading - 后台进程是否需要CFThread join?

    postgresql - 从 PostgreSQL 到 Cassandra - 不支持聚合函数

    c - C 中的 Pthread_Create 导致奇怪的输出

    multithreading - 用户级线程会利用多处理吗?