• 许童童
    2019-08-14
    你是怎么理解进程、线程上下文切换时的成本的,为什么 Nginx 要尽量避免?
    当从一个任务切换到另一个任务,当前任务的上下文,如堆栈,指令指针等都要保存起来,以便下次任务时恢复,然后再把另一个任务的堆栈加载进来,如果有大量的上下文切换,就会影响性能。

    试着自己描述一下 Nginx 用进程、epoll、模块流水线处理 HTTP 请求的过程。
    Nginx 启动进程,一个master,多个worker,创建epoll,监听端口,多路复用来管理http请求,http请求到达worker内部,通过模块流水线处理,最后返回http响应。
    展开

    作者回复: √

    
     6
  • Leon📷
    2019-08-14
    一个线程的时间片没用完就系统调用被系统调度切换出去,浪费了剩余的时间片,nginx通过epoll和注册回调,和非阻塞io自己在用户态主动切换上下文,充分利用了系统分配给进程或者线程的时间片,所以对系统资源利用很充分

    作者回复: great。

    
     4
  • 徐海浪
    2019-08-15
    多线程就好比一条流水线有多个机械手,把一件事情中途交给其他线程处理,要交接处理中间状态信息。
    单进程就好比一条流水线只有一个机械手,切换时间片时暂停状态就可以,不用交接信息,减少无用功,所以效率高。

    作者回复: great

    
     3
  • -W.LI-
    2019-08-14
    老师好!我打算学习nginx,有适合初学者的书推荐么?Java工程师,c全忘了。
    线程切换开销:线程切换需要进行系统调用。需要从用户态->内核态->用户态。上下文切换,需要保存寄存器中的信息,以便于完成系统调用后还原现场。会多跑很多指令,出入栈会比寄存器慢很多。相对来说开销就很大了。
    nginx和redis一样采用单线程模型。是因为cpu计算不可能是它们瓶颈(所以有些耗cpu资源高的计算不适合放在nginx上做会导致响应时间变长)?进程池+单线程是指,每个worker进程都是单线程是么?

    作者回复:
    1.Nginx的内容很多,看你想学哪方面了。如果是单纯的运维操作网上的资料有很多,如果是想学Nginx开发和源码就看《Nginx完全开发指南》吧。

    2.说的很对,看Nginx源码可以学到很多高性能编程的技巧。

    3.Nginx里也可以使用多线程,但需要“魔改”。

    
     1
  • Leon📷
    2019-08-14
    切换cpu需要保存线程的上下文,然后再切回去,这是开销

    作者回复: √

     2
     1
  • Jeff.Smile
    2020-01-20
    说一下http2和nginx的多路复用区别和联系:
    http2的多路复用:多个请求复用同一个连接并行传输数据,且每个请求抽象为流传输的对象为帧序列。
    nginx的IO多路复用:将多个线程的请求打散,汇入同一个线程中传输,epoll监听到事件通道可读或者可写的时候取出或者写入数据,所以nginx的IO多路复用是基于linux内核epoll实现的一种事件监听机制,是NIO非阻塞IO。

    作者回复: 说的很好。

    
    
  • Flourishing
    2019-12-26
    老师,以下问题,麻烦回答一下,谢谢:

    1. 把进程“绑定”到独立的 CPU 上。意思是一个CPU专门负责管理进程嘛?

    2. 不过 master 进程完全是 Nginx 自行用 C 语言实现的,这就摆脱了外部的依赖,简化了 Nginx 的部署和配置。这句话没理解。

    作者回复:
    1.unix/linux有个特别的功能,可以让进程“绑定”在一个cpu上运行,不会被操作系统调度到其他cpu上跑,这样就减少了切换的成本,提高运行效率。不是管理进程的意思。配置指令是“worker_cpu_affinity”。

    2.在unix上有很多服务管理程序,比如systemd、supervisor,可以实现进程监控、自动重启等。而Nginx的master进程实现了同样的功能,就不需要这样的外部程序来管理进程,保持服务的稳定性。

    
    
  • 夏目
    2019-12-10
    好像高性能的服务都是这样玩的,nginx这个架构类似于netty中的多线程reactor模式,redis则是单线程reactor

    作者回复: nginx也是单线程的,和redis一样自己封装了epoll。单线程的好处是没有race condition,处理简单。

    nginx比redis高明的一点是多进程,提高了稳定性和并发能力。

    
    
  • 蓝配鸡
    2019-10-30
    买书为敬。

    作者回复: 感谢支持,有问题也可以在GitHub上提issue。

    
    
  • 👻 小二
    2019-08-23
    线程是用来解决IO阻塞时CPU浪费的问题, 如果没有IO阻塞的问题, 单线程最能发挥CPU的能力,多线程反而要花时间切换。
    由于CPU一般有多核, 所以不考虑阻塞的话, 几个核就 几个线程, 将是最佳选择。

    作者回复: 对,所以Nginx采用的是多进程+单线程的模式。

    
    
  • Been
    2019-08-15
    感觉和 node 类似

    作者回复: 其实底层都是epoll。

    
    
  • 阿锋
    2019-08-14
    缓存服务器,是属于正向代理还是反向代理,还是根据情况而定。

    作者回复: 正向代理和反向代理是根据它所在的位置来定义的,靠近客户端就是正向,靠近服务器就是反向。

    代理与缓存是不相关的,代理可以没有缓存功能。

    
    
  • 趙衍
    2019-08-14
    老师请问一下Nginx相比于其他的服务器,比如Tomcat,具体有哪些优势呢?

    作者回复: 高并发高性能、低资源消耗、稳定,配置方便,功能丰富。

    
    
我们在线,来聊聊吧