大佬们,请教一个关于websocket的问题。我用supersocket作为websocket服务器,然后服务器发送图片到客户端(整个数据包大概一百多kb)。
然后在测试环境(公司自己搭建的k8s集群)和自己本机都能正常发送,但是发布到阿里云上就出现无法发送数据的问题,通过日志,发送在Send的时候就阻塞了(但是,客户端发上来了的图片在各个环境都可以正常接收)。
然后我将sendBufferSize改成了400kb,就能正常发送了,receiveBufferSize还是4kb。
服务器与客户端之间每隔30s有个心跳交互。
我想不明白为什么会出现这种情况,还请大佬指教,谢了。还想问下,改成这么大有没有什么坏处呢?
tcpdump抓包试一下,应该是buf太小带来的频繁ack,在公网环境下每次ack耗时太多导致上层应用看起来像是卡住了似的,其实可能是底层频繁ack导致增加了不必要的RTT。
好,我试下,还没试过在docker中抓包呢。
但是说实话,客户端连接公司的测试环境,也是走的公网。
大佬,按照你的意思的话,是不是buf适当的调大一点好些呢?因为我这个服务必定为发送和接收图片资源
@骑着蚊子去太阳:
@blackheart: 好的,我还是抓包看下实际情况,谢了
@blackheart: 大佬,再请教一下呢,我抓包发现的确没有tcp的报文,而且还有个现象就是,Send调用成功了,但是抓包没有报文记录,我把这个pod直接发布在公网上都不行。然后我将我的程序直接跑在windows 服务器上有正常了。这种一般会是什么情况呢?集群版本过低?
@骑着蚊子去太阳: send并不一定就会直接发送数据,底层tcp协议栈也许在等更多的数据一块发送出去。如果你一个包都没抓到,那么多半是tcpdump命令使用有误。
@blackheart: 不,我是抓了很多包的,程序的心跳包都能看到,但是一发数据,服务的包就没有了
@骑着蚊子去太阳: 也就是说在send前这个pod的tcp建立连接的包都可以抓到,但是client send数据后,pod这边就抓不到了?
@blackheart: 是的,但是我这个服务是tcp server。然后我把这个服务改到windows server 2016上可以了,阿里云集群版本是1.12.6,程序的基础镜像是mcr.microsoft.com/dotnet/aspnet:5.0-focal,其他版本暂时还没试过。
@blackheart: 只是抓不到这个服务相关的包哦。
@骑着蚊子去太阳:
我有点搞不清你上面的两个回复是针对我哪个评论的。。。
@blackheart: 就是你最新的回复:
''''
也就是说在send前这个pod的tcp建立连接的包都可以抓到,但是client send数据后,pod这边就抓不到了?
''''
最新测试,发现16kb可以,8kb及其以下不行。
– 骑着蚊子去太阳 3年前