读《UNIX网络编程》第二版的第一卷时,发现作者在第27章“客户-服务器程序其它设计方法”中的27.6节“TCP预先派生子进程服务器程序,accept无上锁保护”中提到了一种由子进程去竞争客户端连接的设计方法,用伪码描述如下:
服务器主进程:
listen_fd = socket(...); bind(listen_fd, ...); listen(listen_fd, ...); pre_fork_children(...); close(listen_fd); wait_children_die(...);
|
服务器服务子进程:
while (1) { conn_fd = accept(listen_fd, ...); do_service(conn_fd, ...); }
|
初识上述代码,真有眼前一亮的感觉,也正如作者所说,以上代码确实很少见(反正我读此书之前是确实没见过)。作者真是构思精巧,巧妙地绕过了常见的预先创建子进程的多进程服务器当主服务进程接收到新的连接必须想办法将这个连接传递给服务子进程的“陷阱”,上述代码通过共享的倾听套接字,由子进程主动地去向内核“索要”连接套接字,从而避免了用UNIX域套接字传递文件描述符的“淫技”。
不过,当接着往下读的时候,作者谈到了“惊群”(Thundering herd)问题。所谓的“惊群”就是,当很多进程都阻塞在accept系统调用的时候,即使只有一个新的连接达到,内核也会唤醒所有阻塞在accept上的进程,这将给系统带来非常大的“震颤”,降低系统性能。
除了这个问题,accept还必须是原子操作。为此,作者在接下来的27.7节讲述了加了互斥锁的版本:
while (1) { lock(...); conn_fd = accept(listen_fd, ...); unlock(...); do_service(conn_fd, ...); }
|
原子操作的问题算是解决了,那么“惊群”呢?文中只是提到在Solaris系统上当子进程数由75变成90后,CPU时间显著增加,并且作者认为这是因为进程过多,导致内存互换。对“惊群”问题回答地十分含糊。通过比较书中图27.2的第4列和第7列的内容,我们可以肯定“真凶”绝对不是“内存对换”。
“元凶”到底是谁?
仔细分析一下,加锁真的有助于“惊群”问题么?不错,确实在同一时间只有一个子进程在调用accept,其它子进程都阻塞在了lock语句,但是,当accept返回并unlock之后呢?unlock肯定是要唤醒阻塞在这个锁上的进程的,不过谁都没有规定是唤醒一个还是唤醒多个。所以,潜在的“惊群”问题还是存在,只不过换了个地方,换了个形式。而造成Solaris性能骤降的“罪魁祸首”很有可能就是“惊群”问题。
崩溃了!这么说所有的锁都有可能产生惊群问题了?
似乎真的是这样,所以
减少锁的使用很重要。特别是在竞争比较激烈的地方。
作者在27.9节所实现的“传递文件描述符”版本的服务器就有效地克服了“惊群”问题,在现实的服务器实现中,最常用的也是此节所提到的基于“分配”形式。
把“竞争”换成“分配”是避免“惊群”问题的有效方法,但是
也不要忽视“分配”的“均衡”问题,不然后果可能更加严重哦!
分享到:
相关推荐
对于nginx的惊群问题,我们首先需要理解的是,在nginx启动过程中,master进程会监听配置文件中指定的各个端口,然后master进程就会调用fork()方法创建各个子进程,根据进程的工作原理,子进程是会继承父进程的全部...
深入浅出Linux惊群:现象、原因和解决方案.docx
所谓惊群问题,就是指的像Nginx这种多进程的服务器,在fork后同时监听同一个端口时,如果有一个外部连接进来,会导致所有休眠的子进程被唤醒,而最终只有一个子进程能够成功处理accept事件,其他进程都会重新进入...
没什么好说的,是猪是马看看就知. 如有问题请call:yju0825@163.com 没什么好说的,是猪是马看看就知. 如有问题请call:yju0825@163.com
惊天王1.3B是一个可以瞬发技能的外挂!
【半亩缤纷惊天下,阅读答案】半亩缤纷惊天下阅读.docx
PHPWind 惊鱼e族模板
Java游戏\漆黑惊粟DarkestFear.jarJava游戏\漆黑惊粟DarkestFear.jarJava游戏\漆黑惊粟DarkestFear.jar
惊帆科技健康模块USB评估套件软件评估包(完整压缩包),惊帆模块软件资料下载.世联芯科技是惊帆科技授权代理商.提供原厂完整资料下载.技术支持等一站式服务!
惊帆科技健康模组蓝牙评估套件软件包.蓝牙智能健康监测模块可准确测量脉搏波形、心率值、血氧值和血管微循环参数等信息。此模块支持蓝牙 通信,可远程将采集数据发送给手机app,测试与有线产品相比更为灵活、方便。...
惊帆科技JFH111健康模块完整资料下载,世联芯科技提供惊帆健康模块完整资料,原厂技术支持!长期供应心率监测模组,血氧监测模组等方案集成!
微信小游戏源码 步步惊心小游戏源码(仅用于学习参考)微信小游戏源码 步步惊心小游戏源码(仅用于学习参考)微信小游戏源码 步步惊心小游戏源码(仅用于学习参考)微信小游戏源码 步步惊心小游戏源码(仅用于学习...
html5微信小游戏源码 步步惊心小游戏源码(仅用于参考)html5微信小游戏源码 步步惊心小游戏源码(仅用于参考)html5微信小游戏源码 步步惊心小游戏源码(仅用于参考)html5微信小游戏源码 步步惊心小游戏源码(仅...
《步步惊“芯”——软核处理器内部设计分析》【迷你书】的第一章
另一个问题是锁的"惊群"效应,在多个进程同时等待获取锁时,若锁被释放,所有等待进程可能同时被唤醒,导致不必要的竞争和性能损耗。可通过引入随机退避策略来缓解这一问题,即进程在获取锁失败后不立即重试,而是...
手把手教你设计cpu,本书作者为具有多年经验的从业工程师
JFH-RPO-A3V3模块输出脉搏波形、心率值、血氧值和血管微循环参数测量功能。体检包经过后端 大数据分析后,还可为客户提供血压、呼吸频率、...世联芯科技为天津惊帆深圳授权代理商!提供从产品开发到销售等一站式服务!
步步惊心 iebk iebook