现象

Mqtt Consumer应该收到的消息少于预期,登录ActiveMQ的管理页面里的Topics,查看Messages Enqueued发现同样少于理应接收的数量。

定位问题

  1. 怀疑是TCP丢包,通过netstat -s命令观察发送消息前后Tcp信息的输出
  2. 对比两次Tcp信息的输出,发现packets pruned from receive queue because of socket buffer overrunpackets collapsed in receive queue due to low socket buffer等含有prunedcollapsed字样的数值在增多。

解决方案

  • 首先调整系统级tcp的缓冲区,修改/etc/sysctl.conf如下
net.core.rmem_max = 8388608
net.core.wmem_max = 8388608
net.core.rmem_default = 655360
net.core.wmem_default = 655360
net.ipv4.tcp_rmem = 4096 655360 8388608 # Tcp接收缓冲区,分别是最小、默认、最大
net.ipv4.tcp_wmem = 4096 655360 8388608 # Tcp发送缓冲区,分别是最小、默认、最大
net.ipv4.tcp_mem = 8388608 8388608 8388608
<transportConnector name="mqtt"
uri="mqtt+nio://0.0.0.0:1883?maximumConnections=1000&amp;
wireFormat.maxFrameSize=104857600&amp;transport.ioBufferSize=1048576&amp;
transport.socketBufferSize=4194304"/>
- 其中**+nio**表示启用**nio**方式的socket通信。Java里**nio**方式的socket比**bio**方式的更高效。mqtt默认采用**bio**。
- **socketBufferSize**调整缓冲区大小为4m,默认为64k,防止socket接收缓冲过小引发系统扔包
- **ioBufferSize**调整程序内部使用的缓冲区大小为1m,默认为8k,提高缓冲可以增加处理性能

代码分析

  • MQTTTransportFactory继承自TcpTransportFactory

    • org.apache.activemq.transport.tcp.TcpTransportFactory#doBind时解析URI带入的参数
  • org.apache.activemq.transport.mqtt.MQTTNIOTransportFactory#createTcpTransportServer创建TcpTransportServer
  • org.apache.activemq.transport.tcp.TcpTransportServer#doRunWithServerSocketChannel创建与客户端通信的Transport
    • 默认的socketBufferSize = 65536
    • 默认的ioBufferSize = 8192
  • Transportorg.apache.activemq.transport.TransportAcceptListener#onAccept处理
    • Transport被扔给org.apache.activemq.thread.TaskRunnerFactory线程池
    • 在线程池中创建org.apache.activemq.broker.Connection
  • Connection中的org.apache.activemq.broker.TransportConnection#start启动整个TCP的链路

Windows下定位问题的要点

ActiveMQ_Mqtt的TCP丢包的更多相关文章

  1. 发生tcp丢包(拥堵、超时)重传

    可以根据wireshark的Seq序列号和Ack序列号来进行详细分析. 可见,网络丢包(可能是网络拥堵.也有可能是骨干网上有"防火墙"故意随机丢包,因为这个服务器的IP放在国外)对 ...

  2. TCP通信丢包原因总结

    今天在公司问老大,公司的项目底层,是使用的TCP,因为可靠,自动断线重连,在底层都实现了,但是我记得TCP也会有掉包的问题,所以这文章就诞生了——关于TCP掉包的问题,TCP是基于不可靠的网络实现可靠 ...

  3. tcp粘包,udp丢包

    TCP是面向流的, 流, 要说明就像河水一样, 只要有水, 就会一直流向低处, 不会间断. TCP为了提高传输效率, 发送数据的时候, 并不是直接发送数据到网路, 而是先暂存到系统缓冲, 超过时间或者 ...

  4. 略解TCP乱序和丢包

    在使用基于TCP实现的各种组件的时候,我们经常会处理数据包.这数据包说来奇怪,从来不会丢失,也不会乱序,只会产生粘包.底层的机制是如何实现的呢?进来我们就来用简洁易懂的文字描述清楚. 在TCP数据包设 ...

  5. day34 基于TCP和UDP的套接字方法 粘包问题 丢包问题

    TCP 基于流的协议 又叫可靠性传输协议 通过三次握手 四次挥手 来保证数据传输完毕 缺点效率低 正因为是基于流的协议 所以会出现粘包问题粘包问题:原因一:是应为数据是先发送给操作系统,在操作系统中有 ...

  6. 一个RTSP/RTP over TCP 的丢包引起的问题

    背景知识:可以查看https://www.cnblogs.com/lidabo/p/4483497.html RTSP/RTP over TCP TCP承载RTSP/RTP   When you us ...

  7. 【转】使用TCP协议连续传输大量数据时,是否会丢包,应如何避免?

    使用TCP协议连续传输大量数据时,是否会丢包,应如何避免? 比如发送文件.记得有人提过可能会发生什么堆栈溢出.怎样避免呢?是不是可以收到数据后发送确认包,收到确认包后再继续发送.或是发送方发送了一些数 ...

  8. tcp/udp只发不接,会丢包还是send失败?

    这篇文章源于我看libevent的源码时想到的问题,对于libevent的buffer机制,如果接受端一直不取数据的话,会怎样?如果丢包,不现实,因为会导致数据丢失,如果不丢包,就会导致占用内存一直扩 ...

  9. TCP粘包, UDP丢包, nagle算法

    一.TCP粘包 1. 什么时候考虑粘包 如果利用tcp每次发送数据,就与对方建立连接,然后双方发送完一段数据后,就关闭连接,这样就不会出现粘包问题(因为只有一种包结构,类似于http协议,UDP不会出 ...

随机推荐

  1. 中国式商业智能报表ActiveReports免费公开课,10月20日开讲

    ActiveReports公开课全方位报表解决方案,满足商业报表五大需求 [开课时间]10月20日[主讲老师]葡萄城报表产品经理[开课形式]网络在线公开课[活动费用]前50名免费 适合人群:报表开发人 ...

  2. dyld 加载 Mach-O

    ➠更多技术干货请戳:听云博客 前言 最近看 ObjC的runtime 是怎么实现 +load 钩子函数的实现.进而引申分析了 dyld 处理 Mach-O 的这部分机制. 1.简单分析 Mach-O ...

  3. iOS网络3—UIWebView与WKWebView使用详解

    一.整体介绍 UIWebView自iOS2就有,WKWebView从iOS8才有,毫无疑问WKWebView将逐步取代笨重的UIWebView.通过简单的测试即可发现UIWebView占用过多内存,且 ...

  4. Laravel大型项目系列教程(二)之用户管理

    Laravel大型项目系列教程(二) 一.前言 本节教程将大概实现用户的注册.修改个人信息.管理用户功能. 二.Let's go 1.创建用户注册视图 $ php artisan generate:v ...

  5. 01背包问题python 2.7实现

    版权声明:本文为博主原创文章,转载请注明转自 http://www.cnblogs.com/kdxb/p/6140625.html #!/usr/bin/env python # -*- coding ...

  6. C# List 排序各种用法与比较

    下面介绍各种List的sort的用法与比较 首先,我们建一个People的实体,有name.age.sex的属性,我们要排序的字段是年龄age 新建一个实体类 public class People ...

  7. Web.xml配置详解之context-param

    <context-param> <param-name></param-name> <param-value>></param-value& ...

  8. Hibernate 系列 06 - 对象在JVM中的生命周期

    引导目录: Hibernate 系列教程 目录 Java对象通过new命令进行创建,Java虚拟机(Java Virtual Machine,JVM)会为新的Java对象在内存中开辟一个新空间以存放次 ...

  9. favicon.ico 404

    favicon.ico是一个图标文件.就是浏览网站时显示在地址栏的那个图标. 类似是百度的 显示在网站地址最前面的一张图片 可以在网站根目录(TOMCAT_HOME/webapps/ROOT/favi ...

  10. war 文件打包技巧

    1.首先是工具比如Eclipse很方便了. 2.用winrar之类的工具,把web-info目录,及跟它同级的所有目录及文件,打包成 zip文件就行了,然后把扩展名改成war! 3 Jar命令: 假定 ...