CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Linux/Unix社区 >  程序开发区

多线程并发服务器设计

楼主YanDong_8212(谢科)2006-03-11 12:28:18 在 Linux/Unix社区 / 程序开发区 提问

目前准备做一个很大的服务器,希望是能支持万人级同时下载。但是,之前没有做过这么多的并发数。我在google和CSDN查了很多以往的资料,但是都解决不了问题。  
  为了测试单个进程能支持多少个线程,我写了个测试程序:  
  #include   <stdio.h>  
  #include   <pthread.h>  
  #include   <errno.h>  
   
  #define   PTHREAD_THREADS_MAX   20000  
  void   thread(void)  
  {  
      char   ch[128];  
  }  
   
  int   main()  
  {  
          pthread_t   id;  
          int   i=0,   ret;  
          while(1)  
          {  
                  ret   =   pthread_create(&id,   NULL,   (void   *   (*)(void   *))thread,   NULL);  
                  i++;  
                  if   (ret   !=   0)  
                          printf("Max   =   %d   errno=%d\n",   i-1,   errno),perror("create   thread"),   exit(0);  
                  printf("i=%d       pthread_id=%d\n",   i,   id);  
          }  
          return   0;  
  }  
  当生成了1021个线程过后,程序退出了,错误信息是:  
  Interrupted   system   call  
  我尝试修改/usr/include/loacal_lim.h中的  
  #define   PTHREAD_THREAD_MAX   2048   //原来为1024  
  #define   PTHREAD_KEY_MAX   2048   //原来为1024  
  同时利用ulimit对一系列限制做了修改,但运行结果都一样,errno=4。  
  现在请问下高手,  
  1。interrupted   system   call是什么错误?  
  2。怎么在单进程提高并发上限?  
  3。那些万人级的并发服务器的原理是什么呢?  
  问题点数:200、回复次数:41Top

1 楼i_noname(晚九朝五)回复于 2006-03-11 12:51:39 得分 0

连接池?  
  可参考ACE的实现方法Top

2 楼YanDong_8212(谢科)回复于 2006-03-11 15:02:43 得分 0

ACE是什么,说具体点呢Top

3 楼fierygnu(va_list)回复于 2006-03-11 15:23:43 得分 200

YanDong,不知道ACE和TAO,不应该:)  
  http://www.cs.wustl.edu/~schmidt/ACE.htmlTop

4 楼fierygnu(va_list)回复于 2006-03-11 15:24:56 得分 0

ulimit   -Ha看看hard   limit是多少。需要改的是系统的配置文件,不是头文件。FC4好像是/etc/security/limit.conf里。Top

5 楼YanDong_8212(谢科)回复于 2006-03-11 16:42:27 得分 0

嘿嘿,很多不知道的,虚心求教:)  
  以前没做过这个。  
  我现在只需要能开多个线程即可,线程间不需要什么通信,用ACE会不会麻烦了?我想做一个简单的线程池就能满足需求了。我发觉系统不同能开的线程数好象不大一样,red   hat里面我把ulimit   -s   100后,能有20000多个线程  
  但在turbo   linux里面不管怎么改就只能开1024个。  
   
  还请   fierygnu(va_list)   和各位高手指点指点!  
  Top

6 楼fierygnu(va_list)回复于 2006-03-11 16:58:49 得分 0

应该跟内核编译的选择有关系。如果不考虑效率,干脆用原来的线程库,由库例程实现的线程调度。  
  turbo   linux有没有sysctl命令?Top

7 楼wangjinhu(金虎)回复于 2006-03-11 18:00:35 得分 0

http://blog.csdn.net/wangjinhu/archive/2006/03/11/621680.aspxTop

8 楼YanDong_8212(谢科)回复于 2006-03-12 11:33:19 得分 0

有那个命令,但不知道用那个命令有何意义呢?Top

9 楼lvxn_sina(XN)回复于 2006-03-12 15:25:29 得分 0

呵呵~~我也有这样的问题,不过找过资料好象没办法解决,除非产生新进程在与父进程交互。  
   
  pthread产生的线程都使用2M的堆栈空间,而且当前这个值无法改变,也就是说最多在2048(包含主程序等)地址空间将会用完也就无法创建了。  
  另一个限制就是系统限制了进程列表为1024个,超过1024个就会返回EINVAL错误。也许就是因为这个原因pthread库未提供设置堆栈空间大小的原因吧!Top

10 楼fierygnu(va_list)回复于 2006-03-12 16:33:10 得分 0

是不是有sysctl.conf?里边有设置的地方。Top

11 楼alaiyeshi(七宝树八宝饭)回复于 2006-03-12 23:40:51 得分 0

这个。。。。  
  还是一个线程池,  
  我想就是在规定数目以上的情况下,排队等待去  
  完成了的,结束掉,线程接新的任务去  
  我想这也是一种折中的办法吧,要不线程太多,机器的时间片太小了,也会影响性能的吧Top

12 楼YanDong_8212(谢科)回复于 2006-03-13 09:22:35 得分 0

有sysctl.conf这个文件,在里面怎么设置呢?Top

13 楼fierygnu(va_list)回复于 2006-03-13 09:40:04 得分 0

sysctl   -a   |   grep   threadTop

14 楼YanDong_8212(谢科)回复于 2006-03-13 15:10:47 得分 0

我把kernel.threads-max   改为了10000,但在turbo   linux里面仍然报错:"interrupted   system   call"Top

15 楼SK_fisker(龙猫挂风铃)回复于 2006-03-13 23:11:36 得分 0

xue   xiTop

16 楼eduyu(杜宇)回复于 2006-03-14 17:53:28 得分 0

If   you   do   not   patch   the   thread   library(LinuxThread),   you   cannot   have   more   than   1021    
  connections   since   you   can   have   only   1024   threads,   and   first   3   are   taken   for    
  internal   purposes   at   the   start.  
   
  patch见mysql的网站,或者干脆你换线程库,不过我想用   thread   pool也是不错的方法。Top

17 楼fierygnu(va_list)回复于 2006-03-18 10:53:17 得分 0

YanDong,google看看吧。Top

18 楼lbaby(春天来了...)回复于 2006-03-19 16:53:55 得分 0

vsftpd好像作的就不错,你可以看看它的源码Top

19 楼tengulre(debian core developer)回复于 2006-03-20 14:36:00 得分 0

upTop

20 楼cbeginner2000()回复于 2006-03-20 16:27:02 得分 0

太多的线程了,用点网络模型Top

21 楼tonyMCM(南京~上海)回复于 2006-03-21 14:51:09 得分 0

并发确实头疼阿  
  而且那么多  
   
  妥协的办法最好不要用  
   
  期待高人   指出来一条明路Top

22 楼fierygnu(va_list)回复于 2006-03-21 14:55:05 得分 0

"interrupted   system   call"是系统调用被信号中断,不算错误。可以用sigaction设置自动重新执行,也可以在代码里判断EINTR,自己重新执行。Top

23 楼ari(薛定锷)回复于 2006-03-22 15:48:57 得分 0

考虑换一种网络模型,  
  用线程的话,太多会有问题。Top

24 楼vipiii(vipiii)回复于 2006-03-22 17:28:42 得分 0

架构不合理。  
  线程太多会导致进程内的资源过渡紧张,应该用多进程模型。  
  另外处理大并发连接时应该尽量依靠系统提供的手段,比如epoll,kqueue等。Top

25 楼YanDong_8212(谢科)回复于 2006-03-23 12:05:37 得分 0

谢谢大家,还有什么能提示下吗?  
  我考虑用epoll模型。Top

26 楼fierygnu(va_list)回复于 2006-03-23 12:13:57 得分 0

epoll不能并发处理,还是得借助线程。可以考虑一下线程池。  
  Top

27 楼YanDong_8212(谢科)回复于 2006-03-23 12:56:40 得分 0

我在网上搜索,有的人说用epoll模型可以支持上万个连接呢?Top

28 楼beipiao(北漂)回复于 2006-03-23 13:10:43 得分 0

有足够的精力就研究一下squid,我们曾经在它基础上改过一个应用,主要是将select   &   poll方式改为epoll,一万多并发处理能力。  
   
  涉及技术如下:  
   
  内存池;  
  异步模式;  
  状态机;  
  hash;  
  cache;  
  epoll  
  等Top

29 楼beipiao(北漂)回复于 2006-03-23 13:12:17 得分 0

如果单台服务器承受不了那么大的并发,可以考虑采用负载均衡手段Top

30 楼vipiii(vipiii)回复于 2006-03-23 13:30:20 得分 0

>>epoll不能并发处理,还是得借助线程。可以考虑一下线程池。  
  楼主说的不是并发处理,是并发连接。并发处理完全是另外一个东西。  
  况且作线程池还不如作进程池呐Top

31 楼fierygnu(va_list)回复于 2006-03-23 14:02:21 得分 0

并发连接和并发处理需要同时考虑。Top

32 楼fierygnu(va_list)回复于 2006-03-23 14:02:44 得分 0

另外进程池比如线程池。Top

33 楼YanDong_8212(谢科)回复于 2006-03-24 09:55:56 得分 0

再次感谢!Top

34 楼sunj_study()回复于 2006-03-24 10:16:49 得分 0

studyTop

35 楼universes(及时揭帖是一种美德 | CSDN也这么黑)回复于 2006-03-24 15:20:24 得分 0

markTop

36 楼csdddn(csdddn)回复于 2006-03-24 17:11:36 得分 0

请问怎么查看一个线程的状态,用哪个函数?  
  Top

37 楼zengwujun(月之海 为linux入门奋斗100天)回复于 2006-03-25 20:37:48 得分 0

dingTop

38 楼manplus(魅力加加)回复于 2006-03-25 21:22:18 得分 0

ma   r   kTop

39 楼ice_soft(无言)回复于 2006-03-31 15:21:27 得分 0

哥们你真幽默,在一个pc上或workstation上想起10000个线程甚至于更多,其实就用一个线程池,里面有200个线程,让sync操作高效一些就可以了,能达到你说的要求。  
  Top

40 楼wanghi(海海)回复于 2006-04-01 02:08:19 得分 0

mark!!!  
  好像有篇C10k     的文章  
  http://www.kegel.com/c10k.html  
   
  Top

41 楼darkstar21cn(≮天残≯无畏)(死亡进行时)回复于 2006-04-01 09:45:17 得分 0

万人级同时下载  
  这是不合理的,目前没有任何一台服务器能达到这么高的数字  
  一般所谓支持万人以上的都是服务器集群(不是一个单独的服务器)  
   
  在这使用线程池是个不错的选择,因为每个数据库,线程的数量都是有限定的。Top

相关问题

  • 趋势的一道面试题:网络编程中设计并发服务器,使用多进程 与 多线程 ,请问有什么区别?
  • winsock服务器端多线程编程
  • 网络mud游戏服务器端,如何设计,采用多线程吗?服务器资源会不会耗尽?会不会有线程得不到控制?
  • 提个问题:用VC写WinSock服务器端程序,处理多用户并发请求,是用多线程好还是用队列好?
  • 请问哪位大虾有用多线程来处理并发服务器的例程(最好是windows socket API) 做的,指点一下
  • 多线程下载和服务器设置有何关系(有些服务器不支持多线程下载)
  • 请教:并发多服务的TCP服务器的算法设计
  • JAVA多线程并发的问题
  • 服务器并发问题
  • 关于多线程连接数据库服务器,急!100分

关键词

  • 线程
  • 服务器
  • 连接
  • 系统
  • ace
  • 并发
  • epoll
  • 进程
  • pthread
  • 模型

得分解答快速导航

  • 帖主:YanDong_8212
  • fierygnu

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo