开发者社区 问答 正文

tcp多客户端程序设计?报错

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

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

展开
收起
爱吃鱼的程序员 2020-06-14 22:00:16 563 分享 版权
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

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

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

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

    还可以尝试加大listen的backlog

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

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

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

    <divclass='ref'>

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

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

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

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

    2020-06-14 22:00:33
    赞同 展开评论
问答分类:
问答标签:
问答地址: