tcp多客户端程序设计

召唤兽 发布于 2014/09/04 09:30
阅读 1K+
收藏 3

问题:想设计一个多客户端的tcp程序,客户端每隔1s(或更短)时间向服务器端发送心跳包(几KB),服务器收到后发送响应给客户端,现在设计一个程序开辟多个线程来模拟场景,要求客户端10000~25000个,服务器端的CPU使用率不能太高。

现状:目前程序跑5000个线程间隔1s发送,程序没有问题,无丢包,服务器的cpu使用率在45%左右
问题:当跑10000个线程时,客户端部分线程connect报错:connection reset by peer,网上的解释是访问太频繁服务器端关闭了某些socket,但是没有提供好的解决方法
今天做了两个实验:
1.服务器端开两个进程用两个port来收发来自两个节点的各5000个线程,两个节点的客户端都报出上述错误
2.将客户端的收发请求间隔时间从1s延长到3s(等待每一轮收发完毕),再跑10000个线程,发现没有问题,程序能稳定运行下去

加载中
0
Monkey
Monkey
长连接上限就只有几千,再往上开就有断连现象。
Monkey
Monkey
回复 @召唤兽 : 这个我了解不多,不过长连接多了就会掉,超载了。
召唤兽
召唤兽
能细说下吗?一个端口最多能开多少个tcp连接?有没有办法优化,或设置能接受更多的连接?
0
逍遥huang
逍遥huang
udp才有丢包吧
召唤兽
召唤兽
恩 tcp不会丢包 现在是负载太高服务器端关闭连接
0
i
ibmo

最有可能是服务器负载过高,造成客户端发完tcp sync包之后服务器没能响应, 所以就提示错误。

可以试试优化一下服务器,或者把服务器的业务处理部分注释掉,然后再跑跑看。

还可以尝试加大 listen的 backlog

i
ibmo
回复 @召唤兽 : 在客户端加个代码,看看到底在哪步失败,是connect 还是在send 或者recv, 同时计算一下执行这些函数所用的时间。总之就是加一些代码验证猜测。
i
ibmo
回复 @召唤兽 : 把心跳包的大小减小试试看
召唤兽
召唤兽
1.backlog我调过100、10000,试了还是如此。 2.把服务器的处理代码修改成纯接收,没有其他操作,还是会出现错误 感觉真的是负载过大有关系,有没有好的方法解决。。
0
召唤兽
召唤兽

我改了下程序:原先客户端每秒都要连接---收发---关闭连接,改成一直保持10000个连接---循环收发-----关闭

现在程序可以接受10000+的客户端访问,cpu使用率63%(10000个线程),感觉有点高,有什么办法降低吗?

0
少帮主
少帮主

引用来自“召唤兽”的评论

我改了下程序:原先客户端每秒都要连接---收发---关闭连接,改成一直保持10000个连接---循环收发-----关闭

现在程序可以接受10000+的客户端访问,cpu使用率63%(10000个线程),感觉有点高,有什么办法降低吗?

每个链接一个线程的传统模式是应付不了的,看下C10K,C1000K问题

windows下考虑IOCP,linux epoll之类

java考虑看netty、mina,或者自己的NIO

C下考虑libevent,redis AE等等

0
DavidWTF
DavidWTF
你用一个客户端开5000个线程模拟,与5000个客户端访问是不太一样的。
召唤兽
召唤兽
现在只有5台机器,我只做了10000线程*1台、5000*2、2500*4的实验
召唤兽
召唤兽
区别能说深入一点吗 麻烦多多指教下
返回顶部
顶部