2013-05-16 34 views
5

为了开发在Linux上一个高度密集的网络服务器应用程序,最好什么样的架构?这个想法是,这个应用程序通常运行在具有多个内核(虚拟或物理)的机器上。考虑到性能是关键的标准,最好去多线程应用程序还是多进程设计的应用程序?我知道共享资源和同步从多个进程访问这些资源是很多编程开销,但正如前面提到的,整体性能是关键要求,所以我们可以忽略这些东西。编程语言是C/C++。性能 - 多线程或者多进程应用程序

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

谢谢。

回答

3

进程和Linux上的螺纹是非常相似的彼此 - 的主要区别是,整个虚拟存储器是共享的,以及像信号处理某些事情有所不同。

这使得更便宜的情况下线程(无需昂贵的MMU重载等)之间进行切换,但不一定会导致速度太大的差别(尤其是外螺纹的创作)。为了设计高度网络密集型的应用程序,基本上只有的解决方案是使用一个平衡的架构(否则你会让系统陷入大量的进程/线程,并花费更多的时间在他们的管理上,而不是实际运行工作代码),您对套接字上的I/O做出反应,并根据哪些套接字展示活动执行适当的操作。

约在面临这种情况的问题,一位著名的书面记录是“的C10K问题”,可从http://www.kegel.com/c10k.html - 它描述了不同的I/O方法,所以尽管是有点过时了,这是一个很好的入门。

尽管在深入类反应堆设计之前要小心 - 它们可能会变得笨重和复杂,因此请查看您是否不能使用提供更好抽象的库/语言(Erlang是我个人最喜欢的,像Go这样的协程的语言也可以是有用的)。

+0

@ P-L:谢谢您的回答。是的,该计划将使用基于偶数的架构,并基于网络事件采取行动。在运行时不会创建额外的线程和进程。鉴于此,您看到多线程和多进程应用程序之间没有性能差异吗?例如:如果有一个带有4个内核的系统,两个架构之间的性能不会有明显差异? – sthustfo

+0

可能的最大差异是在调度中,可以使用任务的cpu关联性修改,将每个任务(线程/进程)固定到特定的cpu。服务器进程完成的实际工作以及与网络部分的交互方式可能会有更多不同。 可能存在与内存访问方式有关的差异,但与线程/进程差异相关性较低,因为在NUMA系统上一般共享内存 - 尽管目前的内核有可能支持在不同的NUMA中创建代码段的副本区域(过去他们确实拥有内核本身)。 –

1

如果你的线程做的工作相互独立,在linux下,根本就没有任何理由不与多个进程,而不是去。多个进程会增加你的内存使用量,因为每个进程都有自己的私有内存空间,但另一方面,在独立线程之间共享内存空间是更糟的决定。线程与进程之间的上下文切换通常对进程更好,而不是线程,尽管它的体系结构和代码有点相关。进程是安全的,不会被锁和互斥锁序列化。在Linux中,进程更容易管理和交互。这里有一个很有意思的文档(http://elinux.org/images/1/1c/Ben-Yossef-GoodBadUgly.pdf)。

+0

感谢您对本文的参考,非常有帮助。我相信线程更快的感觉来自早期的Windows环境,它将从头开始创建完整的进程,这与Linux fork不同,后者只是重复堆栈,并且最初子进程和父进程共享相同的内存段。我认为,除非进行一个EXEC调用,代码将继续在所有子进程和父进程之间共享。 – CyberFonic