Nginx源码阅读指南
-
培养一套学习方法 整理一套完善的体系
-
不要从main函数开始阅读
-
./nginx -c conf/nginx.conf 带配置启动
-
每个 ngx_command_t() 函数里面,都是一个配置关键字
-
阅读源码的工具: source_insight
-
从conf入手
- 找到 worker process,在通过 worker process 设置conf全局变量;主进程启动之后,启动 worker_process
-
进程开始的地方:ngx_process_cycle.c
-
worker process与server的关系:
- 每个process都运行所有的server,process同时监听所有server
- 每个server各自对应一个listenfd,将所有listenfd都加入到 epoll_ctl()中
- 当多个进程监听同一个端口时,会出现 “惊群” 的问题
- 什么是 “惊群”?
- 多个进程监听同一个端口
- 使用TCP客户端连接主机端口,所有进程全被唤醒,但只有一个进程处理消息
- 高并发的情况下,进程始终处于 唤醒→挂起 的循环状态,性能大大降低
- 如何解决“惊群”?
- 进程之间协商出一种规则:某一时刻,只有一个线程监听端口
- Nginx具体实现:ngx_event.c → ngx_process_events_and_timers
- ngx_trylock_accept_mutex
- 什么是 “惊群”?
-
惊群是如何产生的?
-
惊群的影响是什么?
-
惊群解决的原理时什么?
-
解决惊群的具体实现?(谁有资格拿到CAS锁,谁有资格listen)
-
进程释放锁之后,无需通知
-
为何多个进程监听事件?为何使用多进程而不是使用多线程?
-
进程间资源隔离,使用进程更安全
-
请求与请求之间独立,使用多线程需要加锁,而多进程隔离程度更高
-
CAS Compare and Swap (乐观锁)
-
Nginx作为高性能服务器,日志如何存储?
- 日志落盘,性能与磁盘性能相关
-
Nginx 线程池
- 什么是线程池?
- 线程池的原理
- 如何获取,并且返回给线程池?
- 动态伸缩
- 队列 异步写入 起到了解耦的作用
- 频繁的写入日志,可以采用线程池进行处理
-
拿到一个配置文件 深入理解模块
-
conf文件 ngx.modules.c
版权声明:
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自
北溟鱼的博客!
喜欢就支持一下吧