zoukankan      html  css  js  c++  java
  • ActiveMQ之Mqtt的TCP丢包

    现象

    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下定位问题的要点

  • 相关阅读:
    字符串面试题:将句子的单词序倒置
    字符串面试题:将整型转换为字符串
    QML定时器
    QML按键事件处理
    QML鼠标事件实现变色矩形
    QML动态加载组件
    QML鼠标区域控制
    属性绑定与赋值
    设置虚拟机的本地端口映射
    关于修改banner信息;nginx反向代理apache应用
  • 原文地址:https://www.cnblogs.com/lewh/p/6245518.html
Copyright © 2011-2022 走看看