性能-多线程或多进程应用程序

7
为了在Linux上开发高度网络密集型的服务器应用程序,什么样的架构更受推崇?想法是这个应用程序通常会在具有多个核心(虚拟或物理)的机器上运行。考虑到性能是关键标准,是选择多线程应用程序还是具有多进程设计更好呢?我知道共享资源和同步访问多个进程的编程开销很大,但正如前面所述,整体性能是关键要求,因此我们可以忽略这些问题。编程语言将是C/C ++。

我听说即使是多线程应用程序(单个进程),也可以利用多个核心并独立地在不同的核心上运行每个线程(只要没有同步问题)。而且这个调度是由内核完成的。如果是这样的话,多线程应用程序和多进程应用程序之间的性能差异不会太大吧?Nginx使用多进程架构,速度非常快,但是多线程应用程序能否获得相同的性能呢?

谢谢。

2个回答

4
在Linux上,进程和线程非常相似 - 主要区别在于整个虚拟内存是共享的,以及某些事情如信号处理的差异。这使得线程之间的上下文切换更便宜(无需昂贵的MMU重新加载等),但并不一定会在速度上造成很大的差异(特别是在线程创建之外)。对于设计高度网络密集型应用程序来说,基本上唯一的解决方案就是使用事件驱动架构(否则,您将用大量的进程/线程拖垮系统,并花费更多时间管理它们而不是实际运行工作代码),其中您根据套接字上的I/O反应,并根据哪些套接字显示活动执行适当的操作。关于此类情况面临的问题的著名论述是"C10k问题",可以从http://www.kegel.com/c10k.html获取 - 它描述了不同的I/O方法,因此尽管有点过时,但是它是一个非常好的介绍。但在深入研究像反应器一样的设计之前,请小心 - 它们可能变得笨重和复杂,因此请查看是否可以使用提供更好抽象的库/语言(Erlang是我个人最喜欢的,具有协程的语言如Go也可能很有用)。

@p-l:感谢您的回答。是的,计划使用基于事件的架构,并根据网络事件进行操作。在运行时不会创建任何额外的线程和进程。鉴于此,您认为多线程和多进程应用程序之间没有性能差异吗?例如:如果有一个具有4个核心的系统,则两种架构之间的性能差异不会明显吗? - sthustfo
最大的差异可能在调度方面,可以通过任务的CPU亲和力来修改,将每个任务(线程/进程)固定到特定的CPU上。更多的差异可能来自服务器进程实际执行的工作以及它如何与网络部分交互。可能存在与内存访问方式有关的差异,但与线程/进程差异不太相关,而是与在NUMA系统上共享内存一般有关 - 尽管当前的内核可能支持在不同的NUMA区域中复制代码段(过去内核本身就有这样的支持)。 - p_l

2

如果你的线程是相互独立的,那么在Linux下,没有理由不选择多进程。每个进程都有自己的私有内存空间,因此多进程会增加内存使用量,但与独立线程共享内存空间是更糟糕的决定。线程与进程之间的上下文切换通常对于进程比线程更好,尽管这有点取决于架构和代码。进程不需要锁和互斥体进行序列化,因此更安全。在Linux中,进程更易于管理和交互。这里有一份你可能会感兴趣的好文档(http://elinux.org/images/1/1c/Ben-Yossef-GoodBadUgly.pdf)。


感谢提供文档的参考,非常有帮助。我认为线程更快的看法来自早期的Windows环境,它会从头开始创建完整的进程,而不像Linux fork仅仅是复制堆栈,最初子进程和父进程共享相同的内存段。我认为,除非进行exec调用,否则代码将继续在所有子进程和父进程之间共享。 - CyberFonic
简短的描述和文件链接非常有帮助。 - undefined

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