免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
41 [报告]
发表于 2007-06-09 13:02 |只看该作者
单CPU也不一定总是唤醒一个.

比如,你select pipe描述符, 一有数据就唤醒每一个. 尽管是单CPU.

一个CPU每时间做一个事情和唤醒多个没有矛盾. 说的不是一回事情.

原帖由 信赖CU 于 2007-6-9 11:27 发表

单CPU肯定是唤醒一个。一个CPU只能在同一时间作一件事根本不用跟踪。SMP的就不一样了

[ 本帖最后由 思一克 于 2007-6-9 13:04 编辑 ]

论坛徽章:
0
42 [报告]
发表于 2007-06-09 19:22 |只看该作者
原帖由 思一克 于 2007-6-9 13:02 发表
单CPU也不一定总是唤醒一个.

比如,你select pipe描述符, 一有数据就唤醒每一个. 尽管是单CPU.

一个CPU每时间做一个事情和唤醒多个没有矛盾. 说的不是一回事情.


实际上真正醒的只有一个。

论坛徽章:
0
43 [报告]
发表于 2007-06-11 08:57 |只看该作者
不要将“已经唤醒的”在运行的进程和此刻才CPU上运行的混淆了。

在一个CPU机器上

  1. main()
  2. {
  3. int i;
  4.    for(i = 0; i < 3; i++) fork();
  5.    for(;;) ;
  6. }
复制代码

这个程序运行后,你top看有几个进程正在运行?是8个以上。但实际每时刻仅仅一个。唤醒所有的进程也是这样。


原帖由 信赖CU 于 2007-6-9 19:22 发表

实际上真正醒的只有一个。

[ 本帖最后由 思一克 于 2007-6-11 08:58 编辑 ]

论坛徽章:
0
44 [报告]
发表于 2007-06-11 09:34 |只看该作者
原帖由 思一克 于 2007-6-8 21:03 发表
我看了一下apache2.049(?)

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



apache源码包中的文档,已经很久没去看过了..
我想是文档已经过时了,
那上面用的例子都是说在p166CPU/128M内存的机器上,内核是2.0.....

论坛徽章:
0
45 [报告]
发表于 2007-08-30 17:32 |只看该作者
我刚刚做了个测试,两个线程都等在同一个socket的read上,当收到客户端的数据的时候,只有一个read返回
会否是因为只有一个线程被唤醒?
或则两个都被唤醒,但其中一个线程锁住了资源
又或则两个都被唤醒,但其中一个线程读的太快,导致另一个没内容可读

[ 本帖最后由 空灵静世 于 2007-8-30 17:41 编辑 ]

论坛徽章:
0
46 [报告]
发表于 2007-08-30 17:35 |只看该作者
原帖由 空灵静世 于 2007-8-30 17:32 发表
我刚刚做了个测试,两个线程都等在同一个socket的read上,当收到客户端的数据的时候,只有一个read返回


想说明什么?
这个线程没有醒来?

论坛徽章:
0
47 [报告]
发表于 2007-08-30 17:42 |只看该作者
刚刚重新编辑了下,只是想问几个问题
会否是因为只有一个线程被唤醒?
或则两个都被唤醒,但其中一个线程锁住了资源
又或则两个都被唤醒,但其中一个线程读的太快,导致另一个没内容可读

[ 本帖最后由 空灵静世 于 2007-8-30 17:45 编辑 ]

论坛徽章:
0
48 [报告]
发表于 2007-08-30 19:18 |只看该作者
accept每次只唤醒一个.

recv 应该唤醒多个(没有具体实验)

原帖由 空灵静世 于 2007-8-30 17:42 发表
刚刚重新编辑了下,只是想问几个问题
会否是因为只有一个线程被唤醒?
或则两个都被唤醒,但其中一个线程锁住了资源
又或则两个都被唤醒,但其中一个线程读的太快,导致另一个没内容可读

论坛徽章:
0
49 [报告]
发表于 2007-08-31 09:12 |只看该作者
有个线程就一直停留在read调用上的,
我客户端发送的是6000多个字节,
read的第三个参数都是10000

论坛徽章:
160
酉鸡
日期:2013-10-08 17:08:46丑牛
日期:2013-11-15 14:57:11双鱼座
日期:2014-02-14 01:12:01狮子座
日期:2014-03-27 10:36:09子鼠
日期:2014-05-22 13:34:36戌狗
日期:2014-07-29 14:29:35酉鸡
日期:2014-08-12 08:52:06水瓶座
日期:2014-08-12 12:18:45午马
日期:2014-10-30 22:49:57金牛座
日期:2014-11-19 09:52:57天蝎座
日期:2014-11-20 11:16:17射手座
日期:2014-11-27 17:52:22
50 [报告]
发表于 2007-09-10 15:04 |只看该作者

看来 线程 futex 没这个问题

FUTEX_REQUEUE (since Linux 2.5.70)
    This operation was introduced in order to avoid a "thundering herd" effect when FUTEX_WAKE is used and all processes woken up need to acquire another futex. This call wakes up val processes, and requeues all other waiters on the futex at address uaddr2. The arguments timeout and val3 are ignored.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP