nginx架构初探
nginx是多進程的架構,由master進程和多個worker進程組成。master進程和worker進程之間
用信號進行通信。nginx默認是以后臺進程的形式運行的。系統管理員通過信號與master進程通信
進而與worker進程通信。同一個請求只會在一個worker進程之間進行處理。worker進程的數目是
可以通過配置文件改變的。一般worker進程的數目設置為cpu的核數。進程越多并不代表性能越高,
因為操作系統在管理多進程的時候還需要進程的上下文切換,這個也是有時間消耗的。
?
?
1、nginx的信號處理
kill -HUP pid用于告訴nginx,從容地重啟nginx,我們一般用這個信號來重啟nginx,或重新加載配置,因為是從容地重啟,因此服務是不中斷的。master進程在接收到HUP信號后是怎么做的呢?首先master進程在接到信號后,會先重新加載配置文件,然后再啟動新的進程,并向所有老的進程發送信號,告訴他們可以光榮退休了。新的進程在啟動后,就開始接收新的請求,而老的進程在收到來自master的信號后,就不再接收新的請求,并且在當前進程中的所有未處理完的請求處理完成后,再退出。當然,直接給master進程發送信號,這是比較老的操作方式,nginx在0.8版本之后,引入了一系列命令行參數,來方便我們管理。比如,./nginx -s reload,就是來重啟nginx,./nginx -s stop,就是來停止nginx的運行。如何做到的呢?我們還是拿reload來說,我們看到,執行命令時,我們是啟動一個新的nginx進程,而新的nginx進程在解析到reload參數后,就知道我們的目的是控制nginx來重新加載配置文件了,它會向master進程發送信號,然后接下來的動作,就和我們直接向master進程發送信號一樣了。
2.nginx如何處理請求
每一個nginx的worker進程都是平等的,都有同樣的機會獲得處理一個client請求的機會,
nginx啟動之后,master進程會去監聽80端口,worker進程從master進程fork出來之后,
子進程繼承了父進程打開的文件句柄,則子進程同樣監聽了80端口,每個請求來了之后
所有在accept在這個socket上面的進程,都會收到通知,而只有一個進程可以accept這個
連接,其它的則accept失敗,這是所謂的驚群現象。當然,nginx也不會視而不見,所以
nginx提供了一個accept_mutex這個東西,從名字上,我們可以看這是一個加在accept上
的一把共享鎖。有了這把鎖之后,同一時刻,就只會有一個進程在accpet連接,這樣就
不會有驚群問題了。accept_mutex是一個可控選項,我們可以顯示地關掉,默認是打開
的。當一個worker進程在accept這個連接之后,就開始讀取請求,解析請求,處理請求
,產生數據后,再返回給客戶端,最后才斷開連接,這樣一個完整的請求就是這樣的了。
我們可以看到,一個請求,完全由worker進程來處理,而且只在一個worker進程中處理。
nginx采用了異步非阻塞的方式來處理請求。nginx為了更好的利用多核特性,提供了cpu
親緣性的綁定選項,我們可以將某一個進程綁定在某一個核上,這樣就不會因為進程的
切換帶來cache的失效。
nginx在做4個字節的字符串比較時,會將4個字符轉換成一個int型,再作比較,以減少
cpu的指令數等等。
3. nginx的事件處理模型
對于一個基本的web服務器來說,事件通常有三種類型,網絡事件、信號、定時器。
?
while (true) {
??? for t in run_tasks:
??????? t.handler();
??? update_time(&now);
??? timeout = ETERNITY;
??? for t in wait_tasks: /* sorted already */
??????? if (t.time <= now) {
??????????? t.timeout_handler();
??????? } else {
??????????? timeout = t.time - now;
??????????? break;
??????? }
??? nevents = poll_function(events, timeout);
??? for i in nevents:
??????? task t;
??? if (events[i].type == READ) {
??????? t.handler = read_handler;
??? } else (events[i].type == WRITE) {
??????? t.handler = write_handler;
??? }
??? run_tasks_add(t);
}
?
?
?
轉載于:https://www.cnblogs.com/flowly/archive/2013/04/06/3002789.html
總結
- 上一篇: 常用工具备忘(更新中)
- 下一篇: Essential Grouping高性