首页 文章

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

提问于
浏览
5

为了在Linux上开发高度网络密集型服务器应用程序,首选哪种架构?这个想法是这个应用程序通常运行在具有多个核心(虚拟或物理)的机器上 . 考虑到性能是关键标准,是否更适合采用多线程应用程序或具有多进程设计的应用程序?我知道共享资源和同步以从多个进程访问这些资源是很多编程开销,但如前所述,整体性能是关键要求,因此我们可以忽略这些事情 . 编程语言是C / C.

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

谢谢 .

2 回答

  • 3

    Linux上的进程和线程彼此非常相似 - 主要区别在于整个虚拟内存是共享的,而某些事情如信号处理也不同 .

    这使得线程之间的上下文切换更便宜(不需要昂贵的MMU重新加载等),但不一定会导致速度上的太大差异(特别是在线程创建之外) .

    对于设计高度网络密集型应用程序,基本上 only 解决方案是使用一个公平的体系结构(否则你将使用大量的进程/线程使系统陷入困境,并且在管理上花费的时间比实际运行的工作代码要多),对套接字上的I / O做出反应,并根据哪些套接字显示活动进行适当的操作 .

    关于在这种情况下遇到的问题的着名文章是"The C10k problem",它可以从http://www.kegel.com/c10k.html获得 - 它描述了不同的I / O方法,所以尽管有点过时,但它是一个非常好的介绍 .

    在深入探讨类似反应堆的设计之前要小心 - 它们会变得笨拙和复杂,所以看看你是否能够使用提供更好抽象的库/语言(Erlang是我个人最喜欢的,带有协程的语言)喜欢Go也很有用) .

  • 1

    如果您的线程在独立的情况下独立完成工作,那么在Linux下,根本就没有理由不使用多个进程 . 多个进程会增加内存使用量,因为每个进程都有自己的私有内存空间,但另一方面,在独立线程之间共享内存空间是更糟糕的决定 . 线程与进程之间的上下文切换通常对于进程而不是线程更好,尽管它有点体系结构和代码依赖 . 使用锁和互斥锁进行序列化是安全的 . 进程在Linux中更易于管理和交互 . 这是一篇你可能会感兴趣的好文件(http://elinux.org/images/1/1c/Ben-Yossef-GoodBadUgly.pdf) .

相关问题