apache - nginx : Its Multithreaded but uses multiple processes?

标签 apache architecture nginx

我试图了解 Nginx 为何如此之快,但我有几个问题。

据我了解,Apache 要么生成一个新进程来服务每个请求,要么生成一个新线程来服务每个请求。由于每个新线程共享虚拟地址空间,因此如果有大量并发请求传入,内存使用量就会不断攀升。

Nginx 通过只有一个监听进程(Master)、一个执行线程和 2 或 3 个(数量可配置)工作进程来解决这个问题。该主进程/线程正在运行事件循环。有效地等待任何传入的请求。当请求到来时,它会将请求发送给其中一个工作进程。

以上理解如有不正确之处请指正

如果以上正确,那么我有几个问题:

  1. 工作进程是否会产生多个线程并遇到与 apache 相同的问题?

  2. 或者 nginx 速度快是因为它基于事件的架构在底层使用了非阻塞 IO。也许工作进程会生成执行非阻塞 IO 的线程,是这样吗?

  3. “到底”是什么“基于事件的架构”,有人可以真正简化它,让像我这样的人能够理解吗?它只与非阻塞 io 还是其他相关?

我得到了c10k的引用,我正在尝试详细了解它,但我不认为它与基于事件的拱门有关。似乎更适合非阻塞 IO。

最佳答案

Apache 使用多个线程为每个请求提供它自己的执行线程。这是避免使用同步 I/O 时发生阻塞所必需的。

Nginx 仅使用异步 I/O,这使得阻塞不再是问题。 nginx使用多进程的唯一原因是为了充分利用多核、多CPU和超线程系统。即使有 SMP 支持,内核也无法在多个 CPU 上调度单个执行线程。每个逻辑 CPU 至少需要一个进程或线程。

所以区别在于,nginx需要足够的工作进程来充分利用 SMP,而 Apache 的架构需要创建一个新线程(每个线程都有自己的堆栈)每个请求约 8MB)。显然,在高并发情况下,Apache 将使用更多的内存,并因维护大量线程而承受更大的开销。

关于apache - nginx : Its Multithreaded but uses multiple processes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4764731/

相关文章:

ruby - 我如何从 Ansible 安装 passenger-nginx?

angularjs - 在 Nginx 上部署 AngularJS 应用程序

php - WAMPserver - 为什么堆栈安装了 2 个 php.ini 文件?

php - 尝试更改 htaccess 中的 session.name,仍为 PHPSESSID

php - Apache /CentOS 7 :/var/www/html/owned by root but created files owned by apache - how do I resolve this?

javascript - 回调/复用 channel 的复用参数

asp.net - Enterprise ASP.NET MVC 3 架构大纲

apache - 安装 solr 和索引 mysql

c# - 在面向服务的体系结构中为服务调用定义方法签名的最佳实践是什么?

static - 配置 NGinx 以提供静态文件和代理传递某些 url