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程序都是單執行緒的程序,它們會呼叫各個模組以實現多種多...