之前发现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;
原文地址:http://1038741.blog.51cto.com/1028741/1828530