多线程并发服务器设计

YanDong_8212 2006-03-11 12:28:18
目前准备做一个很大的服务器,希望是能支持万人级同时下载。但是,之前没有做过这么多的并发数。我在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。那些万人级的并发服务器的原理是什么呢?
...全文
1372 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
darkstar21cn 2006-04-01
  • 打赏
  • 举报
回复
万人级同时下载
这是不合理的,目前没有任何一台服务器能达到这么高的数字
一般所谓支持万人以上的都是服务器集群(不是一个单独的服务器)

在这使用线程池是个不错的选择,因为每个数据库,线程的数量都是有限定的。
wanghi 2006-04-01
  • 打赏
  • 举报
回复
mark!!!
好像有篇C10k 的文章
http://www.kegel.com/c10k.html

ice_soft 2006-03-31
  • 打赏
  • 举报
回复
哥们你真幽默,在一个pc上或workstation上想起10000个线程甚至于更多,其实就用一个线程池,里面有200个线程,让sync操作高效一些就可以了,能达到你说的要求。
manplus 2006-03-25
  • 打赏
  • 举报
回复
ma r k
zengwujun 2006-03-25
  • 打赏
  • 举报
回复
ding
sunj_study 2006-03-24
  • 打赏
  • 举报
回复
study
YanDong_8212 2006-03-24
  • 打赏
  • 举报
回复
再次感谢!
csdddn 2006-03-24
  • 打赏
  • 举报
回复
请问怎么查看一个线程的状态,用哪个函数?
universes 2006-03-24
  • 打赏
  • 举报
回复
mark
YanDong_8212 2006-03-23
  • 打赏
  • 举报
回复
我在网上搜索,有的人说用epoll模型可以支持上万个连接呢?
fierygnu 2006-03-23
  • 打赏
  • 举报
回复
epoll不能并发处理,还是得借助线程。可以考虑一下线程池。
YanDong_8212 2006-03-23
  • 打赏
  • 举报
回复
谢谢大家,还有什么能提示下吗?
我考虑用epoll模型。
fierygnu 2006-03-23
  • 打赏
  • 举报
回复
另外进程池比如线程池。
fierygnu 2006-03-23
  • 打赏
  • 举报
回复
并发连接和并发处理需要同时考虑。
vipiii 2006-03-23
  • 打赏
  • 举报
回复
>>epoll不能并发处理,还是得借助线程。可以考虑一下线程池。
楼主说的不是并发处理,是并发连接。并发处理完全是另外一个东西。
况且作线程池还不如作进程池呐
beipiao 2006-03-23
  • 打赏
  • 举报
回复
如果单台服务器承受不了那么大的并发,可以考虑采用负载均衡手段
beipiao 2006-03-23
  • 打赏
  • 举报
回复
有足够的精力就研究一下squid,我们曾经在它基础上改过一个应用,主要是将select & poll方式改为epoll,一万多并发处理能力。

涉及技术如下:

内存池;
异步模式;
状态机;
hash;
cache;
epoll
vipiii 2006-03-22
  • 打赏
  • 举报
回复
架构不合理。
线程太多会导致进程内的资源过渡紧张,应该用多进程模型。
另外处理大并发连接时应该尽量依靠系统提供的手段,比如epoll,kqueue等。
ari 2006-03-22
  • 打赏
  • 举报
回复
考虑换一种网络模型,
用线程的话,太多会有问题。
fierygnu 2006-03-21
  • 打赏
  • 举报
回复
"interrupted system call"是系统调用被信号中断,不算错误。可以用sigaction设置自动重新执行,也可以在代码里判断EINTR,自己重新执行。
加载更多回复(21)

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧