文章6 Nginx中的Epoll事件處理機制

2021-07-04 05:44:05 字數 1886 閱讀 1027

0.序

1.epoll事件初始化

2.epoll事件處理

0.序在linux下,nginx預設的事件處理機制是epoll事件處理機制。當然nginx也可以使用select等事件處理機制,因此nginx為了支援和開發具體的i/o模型,nginx將事件處理機制抽象化。

在ngx_epoll_module.c中,可以看到。

1.epoll事件初始化

從總圖中來看,我們可以更好的明白epoll事件初始化所牽涉的內容。

主要看ngx_worker_process_init函式中內容

1)ngx_epoll_init 通過epoll_create函式建立了epfd控制代碼,這是epoll的介面,之後所有的函式呼叫都要使用該epfd控制代碼。

2)之後在ngx_event_process_init中,通過epoll_ctl將監聽套接字和其對應的事件型別新增到epfd控制代碼中。

通過這兩步,就完成了epoll事件處理的三部曲中的前兩部,接下來就是由epoll_wait等待事件的發生。

2.epoll事件處理

1)epoll_wait函式在ngx_epoll_process_events中,這個函式是由ngx_process_events_and_timers函式呼叫的。關於ngx_process_events_and_timers函式的介紹,詳見文章4:nginx原始碼分析-事件迴圈修改版。

2)關於ngx_epoll_process_events的處理

static

ngx_int_t

ngx_epoll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags)

if(err)

if(events == 0)

ngx_mutex_lock(ngx_posted_events_mutex);

/*只有在使用執行緒時,該函式才有作用*/

/*處理wait的事件,wait的事件及其處理方式都在event_list陣列中,個數為events個。*/

for(i = 0; i < events; i++)

if((revents & (epollerr|epollhup))

&& (revents & (epollin|epollout)) == 0)

/*該事件是乙個讀事件,並該連線上註冊的讀事件是active的*/

if((revents & epollin) && rev->active)

else

/*根據

文章8:nginx accept互斥鎖和文章和文章4:nginx原始碼分析-事件迴圈修改版中所講,搶到accept互斥體的程序a,程序a會對所發生的事件進行ngx_post_events標記,先將事件存入ngx_posted_accept_events或ngx_posted_events陣列中,之後在程序a解除accept互斥鎖以後,才會處理這些事件。*/

if(flags & ngx_post_events)

else

}

/*寫事件 的方式與讀事件一樣

*/wev = c->write;

if((revents & epollout) && wev->active)

if(flags & ngx_post_thread_events)

else

if(flags & ngx_post_events)

else

}

}

ngx_mutex_unlock(ngx_posted_events_mutex);

return

ngx_ok;

}

參考文章

6 nginx負載均衡

mkdir p server tools cd server tools wget 從其他機器拷貝過來 scp nginx 1.18.0.tar.gz 172.16.1.5 server tools 2 安裝依賴 yum install pcre pcre devel y yum install o...

6 nginx 配置 tomcat集群

1.在nginx.conf中的server 節點上面新增 和 sever節點同級 include ttt conf 2.在nginx.conf 同級建立ttt目錄,裡面新增aslan.conf配置檔案upstream www.aslan.com server 3.檢查nginx配置檔案是否有問題ro...

6 Nginx效能引數調優

1.worker processes語法 worker processes number auto number nginx程序最多可以產生的工作程序數量 auto nginx程序將自動檢測nginx伺服器實現併發處理服務的關鍵。每個worker程序都是單執行緒的程序,它們會呼叫各個模組以實現多種多...