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

  • 相关阅读:
    8-4:Mysql数据库编程基础知识
    adb——Android的ADB工具使用
    BroadcastReceiver--Android广播机制
    怎样投篮更准
    《算法七》(深度寻路算法)
    《算法六》(有序二叉树)
    《算法五》(N叉树定义+增删改查)
    《算法四》(二分排序+汉诺塔问题)
    《算法三》(归并排序)
    《算法二》(希尔排序+基数排序+桶排序)
  • 原文地址:https://www.cnblogs.com/lewh/p/6245518.html
Copyright © 2011-2022 走看看