多线程并发服务器设计
目前准备做一个很大的服务器,希望是能支持万人级同时下载。但是,之前没有做过这么多的并发数。我在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分




