免费注册 查看新帖 |

Chinaunix

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

[C] 多线程服务器,发现个问题,请高人解惑 [复制链接]

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
31 [报告]
发表于 2010-07-06 15:38 |只看该作者
本帖最后由 yulihua49 于 2010-07-06 15:47 编辑

回复 30# samlumengjun


    这是需要在应用函数里做的。有的服务可以没有回执,如net_showlog,有的服务需要多次交互,如get_file,这些具体的流程都由应用函数处理,客户端和服务器的应用函数自行约定协议内容和流程。协议头是由框架规定的。

比方这个Echo服务:
  1. #include <scsrv.h>


  2. int Echo(T_Connect *connect,T_NetHead *NetHead)
  3. {
  4.         if(NetHead->PKG_LEN) {
  5.                 ShowLog(5,"PROTO_NUM=%d,data=%s",
  6.                                 NetHead->PROTO_NUM,NetHead->data);
  7.         }
  8.         NetHead->PROTO_NUM=PutEvent(connect,NetHead->PROTO_NUM);
  9.         NetHead->ERRNO1=0;
  10.         NetHead->ERRNO2=0;
  11.         NetHead->PKG_REC_NUM=0;
  12.         NetHead->O_NODE=ntohl(LocalAddr(0,0));
  13.         reversln(NetHead->data);
  14.         SendPack(connect,NetHead);
  15.         return 0;
  16. }
复制代码
而服务器需要安排一个函数表,如下,就是thread_work调用的了。
  1. srvfunc Function[]={
  2.         {login,"login"},        /*0 login.c */
  3.         {Echo,"Echo"},                  /*1*/
  4.         {Rexec, "Rexec"},
  5.         {GetFile,"GetFile"},
  6.         {PutFile,"PutFile"},
  7.         {Pwd,"Pwd"},
  8.         {filels,"filels"},
  9.         {SQL_Select,"SQL_Select"},
  10.         {page_select,"page_select"},
  11.         {dui_svc,"dui_svc"},
  12.         {SQL_RPC,"SQL_RPC"},
  13.         {net_showlog,"net_showlog"},
  14.         {0,0}
  15. };
复制代码

论坛徽章:
0
32 [报告]
发表于 2010-07-06 16:04 |只看该作者
可能帮不了你什么了,呵呵,再仔细检查一下业务那边的代码吧.

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
33 [报告]
发表于 2010-07-06 16:17 |只看该作者
本帖最后由 yulihua49 于 2010-07-06 17:34 编辑
可能帮不了你什么了,呵呵,再仔细检查一下业务那边的代码吧.
samlumengjun 发表于 2010-07-06 16:04



  谢谢了,是我的错,别人帮不了了。
密钥协商出错,我自己找吧。是一种偶然性的错误。与socket无关。

毛病找到了,密钥生成系统的错,偶然会生成空密钥。现在系统稳定了。

论坛徽章:
0
34 [报告]
发表于 2010-07-07 12:56 |只看该作者
哥们,你这是在做服务器么?你见过有服务器这么开线程的?

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
35 [报告]
发表于 2010-07-07 15:51 |只看该作者
本帖最后由 yulihua49 于 2010-07-07 16:39 编辑
哥们,你这是在做服务器么?你见过有服务器这么开线程的?
souldemo 发表于 2010-07-07 12:56



    说说,存在什么问题?应该怎样做?
目前可以稳定支持近1000个在线用户,超过1000个,2000个以内,排队等待,2分钟内如果有人退出,就可以进入。超过2分钟就夭折了,再次连接吧。
在过载状态下,服务器是不死的,所有已连接用户都可以完成他们的作业。就是所谓TPS吧,每个服务一个线程。代价比较大。好在数据库已经是连接池了,1000个客户共享几十个数据库连接。
准备改线程池,但首先要解决增加文件数问题,现在是非特权用户不能增加文件数,怎么办?
因为要支持OLTP的长连接,至少每个客户端占用一个连接(fd)。
我们希望每个中间件服务器支持4000-8000个同时在线客户端。

论坛徽章:
0
36 [报告]
发表于 2010-07-07 17:25 |只看该作者
说说,存在什么问题?应该怎样做?

======================
我说一个问题,这种方式的结果是,一个用户一个线程,线程会占用系统资源,所以你只能设置一个最大线程数,这样同时限制了最大用户数,因为他们是相等的。如果用户连上来,什么都不做,或者半天动一下,或者完事他们不主动关闭连接。。。。白白占用了连接数。
一个方法是每个线程可以处理不同用户,然后创建一个线程池,谁活动就给谁服务,就不会有这样的问题。

论坛徽章:
0
37 [报告]
发表于 2010-07-08 09:12 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
38 [报告]
发表于 2010-07-08 13:19 |只看该作者
本帖最后由 yulihua49 于 2010-07-08 13:30 编辑
说说,存在什么问题?应该怎样做?

======================
我说一个问题,这种方式的结果是,一个用户 ...
yaoaiguo 发表于 2010-07-07 17:25



    是这样。如果是几百个用户的OLTP系统,还可以。客户端程序可以注意一下,不要产生太长时间的空连接。如果有web服务,在webservice中要搞一个连接池,用有限的连接为无限的用户服务。1000个线程,进程空间和系统空间还有富余。1000个线程齐上阵,CPU时间还有10%-20%的空转,这可能就是池的作用,以前测TUXEDO,CPU可以100%的。
另外,正在研究线程池。

多级池的结果,一个服务要排几次队才能完成,性能和响应时间都有影响。

论坛徽章:
0
39 [报告]
发表于 2010-07-08 13:29 |只看该作者
本帖最后由 没本 于 2010-07-08 13:31 编辑

回复 35# yulihua49


    我是专做服务器程序的。照说正经做服务器很少用每连接一线程模型的,因为这样的话,一千条线程加锁的话需要1000个锁,很是恐怖。推荐老兄读一下这篇介绍服务器模型的文章。
The C10K problem  http://www.kegel.com/c10k.html

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
40 [报告]
发表于 2010-07-08 13:44 |只看该作者
回复  yulihua49


    我是专做服务器程序的。照说正经做服务器很少用每连接一线程模型的,因为这样的 ...
没本 发表于 2010-07-08 13:29



    C10K,是个中间件?

研究线程池,向你学习。
但每个OLTP客户还是需要一个长连接,TUXEDO也保留了长连接,并未实现完全的无连接、无状态。
完全无连接、无状态,如http协议,在进行OLTP时经常性能不达标。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP