免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 思一克
打印 上一主题 下一主题

惊群(thundering herd)问题在linux上可能是莫须有的问题 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2007-06-08 15:23 |只看该作者
各个进程的负载均衡问题。

如果accept后有一点事情做(比如转移数据,建立新孩子进程),那么应该是均衡的。
如果accept后立即close, 就不一定。

以上是猜测。需要程序实验证实。

论坛徽章:
0
32 [报告]
发表于 2007-06-08 16:47 |只看该作者
验证过了, 在大数量的客户端连接后,两个进程的确 accepted 的 socket 个数相当。

两个进程很简单, 在 accept 函数返回 后,什么事情都不做,继续调用 accept, 呵呵

我的测试环境是:  FC5, 双核CPU, 2G内存, 测试时基本上没有其它进程在运行。

我想知道, kernel 怎么做到 均衡分配的,呵呵

论坛徽章:
0
33 [报告]
发表于 2007-06-08 16:51 |只看该作者
你实验了。好呀

大量连接进入,KERNEL有队列,一个个分基本上就是均衡的。


原帖由 于 2007-6-8 16:47 发表
验证过了, 在大数量的客户端连接后,两个进程的确 accepted 的 socket 个数相当。

两个进程很简单, 在 accept 函数返回 后,什么事情都不做,继续调用 accept, 呵呵

我的测试环境是:  FC5, 双核CPU,  ...

论坛徽章:
0
34 [报告]
发表于 2007-06-08 17:04 |只看该作者
借这里问个跟相关的问题。

假如有两个进程A, B, A首先bind udp port 10000, 同时打开reuse功能。
随后B进程bind udp port 10000.

在这种情况下,如果本机器port 10000上有数据到达的时候, kernel会换醒那个进程?

是否能同时唤醒两个进程呢?

如果是唤醒一个进程,
是每次唤醒固定的进程(A or B), 还是随机的呢?

论坛徽章:
0
35 [报告]
发表于 2007-06-08 17:08 |只看该作者
你写个测试程序发上来,如果有兴趣

原帖由 xhl 于 2007-6-8 17:04 发表
借这里问个跟相关的问题。

假如有两个进程A, B, A首先bind udp port 10000, 同时打开reuse功能。
随后B进程bind udp port 10000.

在这种情况下,如果本机器port 10000上有数据到达的时候, kernel会换醒 ...

论坛徽章:
0
36 [报告]
发表于 2007-06-08 17:21 |只看该作者
原帖由 思一克 于 2007-6-8 13:10 发表
根据研究结果,多个进程直接accept一个sock是没有问题的好程序。
但不好的程序是(如果能这样编的话)

r = select(........);  //或 poll(....)
if(r) {
    fd1 = accept(.........):
}

这样有惊群 ...




对于在accept()前面调用select,  我一直觉得奇怪.
这样的模型有什么更优雅的地方? 我是从未这么设计过.

还有,版主认为在accept()前面调用lock()并不好,这一点我还是有点疑惑.
那为什么apache依然不改,而且在源码中的表现是为了安全,所以调用lock()先.
是为了兼容其它系统吗?即使这样也可以为linux加个宏呀..

论坛徽章:
0
37 [报告]
发表于 2007-06-08 17:24 |只看该作者
我没有研究过APACHE代码。

accept()前lock什么?看有无和多进程/县城的lock必要,而不是为了accept自己的?

有时间我看一下apache的网络部分代码。

原帖由 yulc 于 2007-6-8 17:21 发表




对于在accept()前面调用select,  我一直觉得奇怪.
这样的模型有什么更优雅的地方? 我是从未这么设计过.

还有,版主认为在accept()前面调用lock()并不好,这一点我还是有点疑惑.
那为什么apache依然不改 ...

论坛徽章:
0
38 [报告]
发表于 2007-06-08 17:30 |只看该作者
原帖由 思一克 于 2007-6-8 17:24 发表
我没有研究过APACHE代码。

accept()前lock什么?看有无和多进程/县城的lock必要,而不是为了accept自己的?

有时间我看一下apache的网络部分代码。




好, prefork mpm的源码目录在 apache.*.tar.gz包中:
.\server\mpm\prefork\

这个源代码影响了我好几年呀...

论坛徽章:
0
39 [报告]
发表于 2007-06-08 21:03 |只看该作者
我看了一下apache2.049(?)

在文件docs/manual/misc/perf-tunnng.html.en 中有详细解释lock accept的原因.
文件我记忆不是绝对清楚. 你可以grep -r "accept lock" *  或 grep -r "SINGLE_SOCKET" *
找到文件.

那里说2中方式:
1) 多个socket同时accept
2) 一个socket同时accept

使用lock关键原因还是原来的系统thurndering herd问题.

那里还说了,单个socket多进程accept也有"在KERNEL中唤醒所有的然后多数又在KERNEL中再睡下"的而浪费CPU的说法.

这些问题在LINUX 2.6.X 是不存在的.

看来, 在许多系统上, "唤醒一群" 原来的确是问题. 否则APACHE不会那样做.

但那个文件中的说法在新LINUX中却是不对的---比如再直接睡下的问题.



原帖由 yulc 于 2007-6-8 17:30 发表



好, prefork mpm的源码目录在 apache.*.tar.gz包中:
.\server\mpm\prefork\

这个源代码影响了我好几年呀...

论坛徽章:
0
40 [报告]
发表于 2007-06-09 11:27 |只看该作者
原帖由 思一克 于 2007-6-7 16:24 发表
你看net/ipv4/tcp.c
中的
wait_for_connect函数,里面有说明,仅仅唤醒一个进程

accept()调用sys_accept, 然后是tcp_accept.

单CPU肯定是唤醒一个。一个CPU只能在同一时间作一件事根本不用跟踪。SMP的就不一样了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP