Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Nginx 事件驱动机制

David Zhang
September 09, 2016

Nginx 事件驱动机制

来自 Nevermore (@hzphust)

David Zhang

September 09, 2016
Tweet

More Decks by David Zhang

Other Decks in Programming

Transcript

  1. ⽂本 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);
  2. ⽂本 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
  3. ⽂本 nginx事件模块 ▸ 事件驱动架构 ▸ ᗑܜ/ᏺፏ/ਧ෸࢏ԾኞԪկ ▸ ngxԪկཛྷࣘᨮᨱԪկጱතᵞ/ړݎ ▸ ٌ՜ཛྷࣘဳٙఽي᪁Ԫկ҅ၾᩇԪկ

    ▸ 与传统web服务器比较 ▸ 不再使用进程/线程作为事件消费者,只能是模块,只有事件收集/分发器才能占用 进程资源 ▸ 事件消费者不允许有任何阻塞操作,进程不会休眠
  4. ⽂本 EVENT ▸ IO和定时器 ▸ ngx_event_t ▸ void *data, ngx_event_handler_pt

    handler ▸ nginx启动时预分配了所有读写事件,和连接相对应 ▸ ngx_handle_read_event/ngx_handle_write_event
  5. ⽂本 CONNECTION ▸ 主动连接/被动连接 ▸ ngx_connection_t ▸ fd, read_ev, write_ev,data,

    sockaddr,recv,write ▸ 连接池 ▸ connections/free_connections ▸ ngx_get_connection/ngx_free_connection
  6. ⽂本 NGX_EVENT_MODULE ▸ 事件模块 ▸ 功能 ▸ 定义新的事件类型 ▸ 定义所有事件模块必须实现的ngx_event_module_t接口

    ▸ 管理并解析事件类模块的配置项 ▸ ngx_events_module ▸ ngx_events_commands ▸ ngx_events_module_ctx
  7. ⽂本 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 标志位
  8. ⽂本 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