Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Nginx 事件驱动机制
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
David Zhang
September 09, 2016
Programming
570
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Nginx 事件驱动机制
来自 Nevermore (@hzphust)
David Zhang
September 09, 2016
More Decks by David Zhang
See All by David Zhang
ngx_share: conf & module
crispgm
0
29
ReactNative 探索之路
crispgm
1
390
Other Decks in Programming
See All in Programming
エンジニアにデザインハーネスを 〜デザインプロセスを規定するためのハーネス〜 / Design harness from an engineer's perspective
rkaga
2
1.6k
yield再入門 #phpcon
o0h
PRO
0
700
Built Our Own Background Agent at LayerX #aidevex_findy
layerx
PRO
8
3k
Terraform標準の組織で AWS CDKをどう使うか
mu7889yoon
1
340
なぜ関数型プログラミングで「型」と「証明」が語られるのか #fp_matsuri
kajitack
3
1k
【やさしく解説 設計編 #0】DDDのコード、読めるのに分からない人へ
panda728
PRO
2
270
FDEが実現するAI駆動経営の現在地
gonta
2
200
『コードを書く以外の』エンジニアリング〜課金基盤移行プロジェクト推進のためのTips4選
yuriko1211
0
530
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
360k
AIが無かった頃の素敵な出会いの話
codmoninc
1
190
AI時代の仕事技芸論〜ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ(スクフェス仙台 2026バージョン)
kuranuki
0
690
フィードバックで育てるAI開発
kotaminato
1
120
Featured
See All Featured
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
220
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.2k
Chasing Engaging Ingredients in Design
codingconduct
0
240
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
A Tale of Four Properties
chriscoyier
163
24k
Designing for Timeless Needs
cassininazir
1
390
Building AI with AI
inesmontani
PRO
1
1.1k
The Language of Interfaces
destraynor
162
27k
BBQ
matthewcrist
89
10k
Code Reviewing Like a Champion
maltzj
528
40k
Practical Orchestrator
shlominoach
191
11k
Leo the Paperboy
mayatellez
8
1.9k
Transcript
NGINX事件驱动机制
大纲 ▸ Linuxᔮᕹ5ᐿIOཛྷୗ ▸ IOग़᪠॔አ ▸ nginxԪկཛྷࣘ ▸ nginxԪկḝۖຝ
⽂本 IO准备知识 ▸ DirectIO和BufferIO ▸ IO数据先拷贝到内核空间的缓冲区,然后从内核空间缓冲区复制到应用程序的地址 空间 ▸ 不经过内核缓冲区,直接访问应用程序地址空间 ▸
IO的两个阶段 ▸ 等待数据准备 ▸ 将数据从内核拷贝到用户进程中
LINUX系统5种IO模式 ▸ blocking IO ▸ nonblocking IO ▸ IO multiplexing
▸ signal driven IO ▸ asynchronous IO
⽂本
⽂本
⽂本 IO multiplexing ▸ I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个 描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写 操作 ▸ 本质是同步IO ▸
select/poll/epoll int select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); int poll (struct pollfd *fds, unsigned int nfds, int timeout);
⽂本 epoll ▸ 数据和接口 ▸ LT模式和ET模式 int epoll_create(int size); int
epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout); struct epoll_event { __uint32_t events; epoll_data_t data; } EPOLL_CTL_ADD EPOLL_CTL_DEL EPOLL_CTL_MOD EPOLLIN EPOLLOUT EPOLLHUP EPOLLERR
⽂本 nginx事件模块 ▸ 事件驱动架构 ▸ ᗑܜ/ᏺፏ/ਧԾኞԪկ ▸ ngxԪկཛྷࣘᨮᨱԪկጱතᵞ/ړݎ ▸ ٌ՜ཛྷࣘဳٙఽي᪁Ԫկ҅ၾᩇԪկ
▸ 与传统web服务器比较 ▸ 不再使用进程/线程作为事件消费者,只能是模块,只有事件收集/分发器才能占用 进程资源 ▸ 事件消费者不允许有任何阻塞操作,进程不会休眠
⽂本 EVENT ▸ IO和定时器 ▸ ngx_event_t ▸ void *data, ngx_event_handler_pt
handler ▸ nginx启动时预分配了所有读写事件,和连接相对应 ▸ ngx_handle_read_event/ngx_handle_write_event
⽂本 CONNECTION ▸ 主动连接/被动连接 ▸ ngx_connection_t ▸ fd, read_ev, write_ev,data,
sockaddr,recv,write ▸ 连接池 ▸ connections/free_connections ▸ ngx_get_connection/ngx_free_connection
⽂本 NGX_EVENT_MODULE ▸ 事件模块 ▸ 功能 ▸ 定义新的事件类型 ▸ 定义所有事件模块必须实现的ngx_event_module_t接口
▸ 管理并解析事件类模块的配置项 ▸ ngx_events_module ▸ ngx_events_commands ▸ ngx_events_module_ctx
⽂本 NGX_EVENT_CORE_MODULE ▸ 所有事件模块中顺序第一位 ▸ 功能 ▸ 创建连接池 ▸ 决定使用哪些事件驱动机制
▸ 初始化将要使用的事件模块 ▸ ngx_events_core_commands
⽂本 NGX_EPOLL_MODULE ▸ ngx_epoll_init ▸ epoll_create ▸ 创建event_list数组 ▸ ngx_epoll_add_event/ngx_epoll_del_event
▸ epoll_ctl ▸ ngx_epoll_process_events ▸ epoll_wait ▸ instance/NGX_POST_EVENTS 标志位
⽂本 ACCEPT_MUTEX ▸ “惊群”效应 ▸ 多个worker同时accept一个连接 ▸ accept_mutex ▸ ngx_trylock_accept_mutex
▸ ngx_enable_accept_event ▸ 什么时候释放? ▸ nginx post事件机制 ▸ NGX_POST_EVENTS flags ▸ ngx_posted_accept_events/ngx_posted_events ▸ worker子进程的负载均衡 ▸ ngx_accept_disabled = connection_n/8 - free_connection_n
⽂本 ▸ ngx_process_events_and_timer ▸ 处理网络事件 ▸ 调用所有事件模块的ngx_event_process ▸ 处理post事件队列 ▸
ngx_event_process_posted ▸ 处理定时器事件 ▸ ngx_event_expire_timer()
THANKS !