免费注册 查看新帖 |

Chinaunix

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

高并发的问题 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2009-08-18 14:01 |只看该作者
原帖由 cookis 于 2009-8-18 13:55 发表
干吗要用sleep .不是有事件通知机制吗?



事件通知不代表不需要主循环吧。。。。。。

论坛徽章:
1
寅虎
日期:2014-11-30 21:25:54
32 [报告]
发表于 2009-08-18 14:05 |只看该作者

回复 #31 redor 的帖子

select/poll/epoll不都有超时吗 还要sleep做什么用啊?

论坛徽章:
0
33 [报告]
发表于 2009-08-18 14:07 |只看该作者
原帖由 群雄逐鹿 于 2009-8-18 13:55 发表


还真刺激我呀,呵呵。。很多都是基本功了。别生气,是我多语了,向你道歉。
也希望你能一贯的坚持己见,即使程序当掉



咱就仅仅讨论问题, 可能我没看明白你说程序要down掉的理由。

rd是限制在CONN_MAX 范围 之内的, buffer[CONN_MAX][EV_BUF_SIZE]
n = read(fd, buffer[rfd], EV_BUF_SIZE) buffer[]这个是不会产生内存溢出的,

另外n <= EV_BUF_SIZE  buffer[rfd] 也不会产生内存溢出, 当然你说的可能是 我通过fprintf()sprintf() 之类的把buffer[rfd][EV_BUF_SIZE]  打印出来 而且 n== EV_BUF_SIZE的时候是完全有可能的,但是我一般都是适用write(fd, buffer[rfd], n); 这个是不会产生内存溢出的。

还请赐教。

我之所以得出那个结论 我是觉得你给我发了那么多问题吧 感觉没有一个问题是真的问题, 而且我都给你作答了。

论坛徽章:
0
34 [报告]
发表于 2009-08-18 14:09 |只看该作者
原帖由 vbs100 于 2009-8-18 14:05 发表
select/poll/epoll不都有超时吗 还要sleep做什么用啊?



while(1){} 里不仅仅只有evbase 还有一些其他的比如消息队列的运行, 我说的消息队列不是系统自带的msg那个, 是我自己实现的。


没有主循环的线程怎么运行呢?

论坛徽章:
0
35 [报告]
发表于 2009-08-18 14:13 |只看该作者
原帖由 群雄逐鹿 于 2009-8-17 22:29 发表
这个 buffer[fd] 更加诡异了,
内存浪费先不谈,fd的值会限定在CONN_MAX ?


这个问题我就更无语了, fd的最大值一般系统默认1024,我们需要通过setrtlimit() 来设置 RLIMIT_NOFILE这个的大小,我里边应该设置的RLIMIT_NOFILE 就是CONN_MAX。
这种测试代码也无所谓内存浪费了, 就是65536个连接也不过24k * 1024的内存占用, 基本所有的机器用这个做测试是没有问题的。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
36 [报告]
发表于 2009-08-18 14:29 |只看该作者
原帖由 redor 于 2009-8-18 14:09 发表



while(1){} 里不仅仅只有evbase 还有一些其他的比如消息队列的运行, 我说的消息队列不是系统自带的msg那个, 是我自己实现的。


没有主循环的线程怎么运行呢?


看字面意思,你是在一个循环里执行了两个逻辑,

while 1:
    a: find active event
        process  event
    b: check message queue
        process message

这两个是非常独立的呀,干吗不分做两个线程? 个人认为在这里增加一个线程是很优雅的

论坛徽章:
0
37 [报告]
发表于 2009-08-18 14:47 |只看该作者
原帖由 cookis 于 2009-8-18 14:29 发表


看字面意思,你是在一个循环里执行了两个逻辑,

while 1:
    a: find active event
        process  event
    b: check message queue
        process message

这两个是非常独立的呀,干吗不 ...



每个线程里的连接和业务是相关联的,比如上面的evbase->loop() 就可能产生新的message 下面的message_loop()就开始处理上面产生的message,
这样提高总体的处理能力,processing event不做任何的数据出了读/写数据之外的事情。

论坛徽章:
0
38 [报告]
发表于 2009-08-18 16:19 |只看该作者
原帖由 redor 于 2009-8-18 14:07 发表



咱就仅仅讨论问题, 可能我没看明白你说程序要down掉的理由。

rd是限制在CONN_MAX 范围 之内的, buffer[CONN_MAX][EV_BUF_SIZE]
n = read(fd, buffer[rfd], EV_BUF_SIZE) buffer[]这个是 ...


好吧,我再说说。

1. CONN_MAX
    老实说,开始只注意到listen里面,使用CONN_MAX使用限制了做大连接数,最大连接数不等于最大fd+1,这个你同意吧。
    还真没留意到你用RLIMIT_NOFILE来做过限制。

    用RLIMIT_NOFILE,如果没有设成功,你的程序照样crash.
    如果不是超级用户,失败的几率也不少:
http://www.manpagez.com/man/2/setrlimit/
  Only the super-user may raise the maximum limits.  Other users may only
     alter rlim_cur within the range from 0 to rlim_max or (irreversibly)
     lower rlim_max.
    另外记得好像在某些系统上,设限制为某个值,实际返回的fd可以超过。

  用fd做数组下标,可以说是玩火。


2. 对于
  buffer[CONN_MAX][EV_BUF_SIZE]
      n == EV_BUF_SIZE

  buffer[rfd][n] = 0; 没有错?
    不说了,这个版99%的网友能告诉你答案,你好自信!

论坛徽章:
0
39 [报告]
发表于 2009-08-18 16:28 |只看该作者
争执usleep的问题,我想你可能是因为不知道忙等在哪里。

看到这段代码作何感想?某些情况下就是这样的,等于插了一个无意义的浪费时间的for.
(另外即使不浪费时间,我也看不出这个sleep/usleep意义何在)

  1. while(1)
  2. {
  3.     evbase->loop(evbase, 0, NULL);
  4.     for(volatile int i = 0; i < 10000; ++i);
  5. }
复制代码

论坛徽章:
1
寅虎
日期:2014-11-30 21:25:54
40 [报告]
发表于 2009-08-18 16:38 |只看该作者

回复 #38 群雄逐鹿 的帖子

好像lighttpd 就是fd做数组下标的  。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP