一条很有用的命令解决tcp数据发送积压问题netstat -anpt|grep 2181|awk ‘{if($2!=0||$3!=0) print $0}’
以kafka为例:开源kafka默认配置的据传输端口是2181,kafka server会监听2181端口,等待客户端连接,
netstat -anpt的输出所有的tcp连接信息
netstat -anpt|grep 2181输出和2181有关的端口的连接信息
man netstat一下如下图:
第二列recv-q 代表此连接,内核已把数据接收到的tcp的缓冲区,但还未被应用程序调用read读走
第三列send-q代表此连接,应用程序已调用write写进tcp缓冲区并且已经发送到接收端但接收端还未确认的数据
情况1
如果接收端recv-q有大量积压代表本机应用程序有问题,可能存在性能问题,数据已从网卡拷贝到tcp内核接收缓冲区就待应用程序调用read拷贝到用户空间了,此时增加多个线程处理即可,如果应用要把数据落盘,或再通过网络转发走,还要关注是否,是磁盘和下一环节的网络问题导致
例如:如果发现kafka broker节点2181端口recv-q积压比较多,在cpu充足的情况下适当增加网络io和磁盘io线程,同时查看iowait
情况2
如果发送端send-q有大量积压,
1:接收端的recv-q没有积压则代表,发送端与接收端的网络,或网卡有问题,可用traceroute查看具体是网络链路的那一环节出现了问题,如果链路的每一环节都没问题那就是网卡的问题了
2:接收端的recv-q有积压则代表,同 情况1