之前發現nginx的進程在任務分配方面非常的不平均,即某個進程一旦忙起來會忙很久,而空閒的線程卻一直空閒,跟下代碼發現epoll_wait中默認的timer是500ms(沒有任務的情況下),可以通過減少accept_mutex_delay這個參數讓空閒的進程有更大的機會搶到accept鎖,從而使任務更加平均的分配,至於對效率的影響,需要測試才能知道。
worker process如果想要搶鎖,就必須從epoll_wait中醒過來纔可以走循環流程,然後走到搶鎖的地方纔有機會搶,而一旦worker process搶到了accept鎖,任務比較多的情況下,epoll_wait會被頻繁激活,導致搶鎖的機會大大增加,而空閒的進程500ms纔去嘗試一次搶accept鎖,所以請求量越大,空閒進程搶到鎖的可能性就越小.
搶鎖流程:
1、搶鎖
2、把listen fd加入epoll事件
3、解鎖(如果不解鎖,那其他進程永遠沒有機會再accept了)
accept_mutex_delay
含義:設置獲得互斥鎖的最少延遲時間。
語法:accpet_mutex_delay <number of millisecs>
缺省:500ms
示例:accpet_mutex_delay 1000ms;