免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3289 | 回复: 11
打印 上一主题 下一主题

[C++] 快速连接服务器但是 部分连接会失败 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-09-20 23:19 |只看该作者 |倒序浏览
快速连接 服务器,一共发送了6万多个情况。 服务器为自己编写的代码,通常6万个会有几十个到几百个连接是失败的。
如果服务器负载比较轻,基本可以保证6万多个请求一次完全连上,在总连接数在30-50万以后,就很难保证了。

accept的线程是单线程的,我猜不会因为accept不够快而造成失败,这是我能想到最快的办法了。

如果认为是机器性能不够作为理由, 但是用go 语言编写的服务程序,同一个器 就没有这个问题, 和它的连接总是能保证6万多个 一个不少。

linux 内核参数经过修改

c++ 和 go 是同一套配置, fd 不够这种问题也不存在。

从系统看 c++ 服务器的负载比go 写的 在同样压力下 cpu更低。但是accept 就是不行,请问这里有什么技巧吗?

论坛徽章:
0
2 [报告]
发表于 2014-09-21 11:33 |只看该作者
accept的参数里设的排除连接数是多少?

论坛徽章:
0
3 [报告]
发表于 2014-09-21 12:31 |只看该作者
你说的是listen的参数吧? 6000 已经配合内核参数修改。

论坛徽章:
0
4 [报告]
发表于 2014-09-21 17:35 |只看该作者
那连接失败的errno是什么呢

论坛徽章:
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
5 [报告]
发表于 2014-09-22 09:56 |只看该作者
benjiamsh 发表于 2014-09-21 12:31
你说的是listen的参数吧? 6000 已经配合内核参数修改。

改60000。。。。。。。。

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
6 [报告]
发表于 2014-09-22 11:16 |只看该作者
优化过内核参数?关注我的历史发帖。

论坛徽章:
0
7 [报告]
发表于 2014-09-22 12:05 来自手机 |只看该作者
我会仔细看看,猜测是因为我提供秒级定时器,在瞬间发包导致整个千兆网卡,满,而导致部分syn被丢弃。猜想而已,go版本的数据流量明显更稳定

论坛徽章:
0
8 [报告]
发表于 2014-09-22 12:59 来自手机 |只看该作者
但网卡应该是双工的,收发并不影响。所以猜测未必对

论坛徽章:
0
9 [报告]
发表于 2014-09-22 21:41 |只看该作者
查了下客户端的情况 是有很多SYN_SEND 的状态, 而服务器端 没有SYN_RECV 状态。 这些连接没有建立起来。


查看了下客户端,没有出现错误。 这个是个问题, 客户端的写法 是 socket, 然后 connect (非阻塞模式) 加入epoll.
但是到最后也没出现任何事件。...  正常情况下,我会加一个定时器在这个socket 上,如果 一定时间没有出现事件,我会先主动关闭掉这个连接。但是现在 我想知道最后
出现什么情况,可惜 到了最后 epoll 也没有出现事件,还不知道 怎么改这个问题


服务器这段, 如果accept 线程 做点别的事情,那么基本上会有大量socket无法连接。所以 一切照旧。

还没解决

论坛徽章:
0
10 [报告]
发表于 2014-10-02 17:19 |只看该作者
我会仔细看看,猜测是因为我提供秒级定时器,在瞬间发包导致整个千兆网卡,满,而导致部分syn被丢弃。猜想而已,go版本的数据流量明显更稳定


问题可能出现在这里, 我将定时器设定为毫米级别。c++ 果然不再有syn lose. 当然还有一个改变是专门拿一个cpu core 处理accept. 目前100w连接不在有syn 丢失。

现在c++ 版本反而比go 更好一些。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP