官术网_书友最值得收藏!

1.1 物聯網MQTT單機壓測130萬參數調優

2019年1月,我的一項工作就是為公司搭建一套獨立于阿里云之外的自己的物聯網MQTT集群。MQTT是非常適合物聯網場景的,它可以保持設備與服務器的長連接,避免反復輪詢,并支持推送。和數據庫連接池一樣,它同樣運行于TCP協議之上,MQTT相比HTTP具有協議開銷低、容忍弱網絡、低功耗、百萬并發等優點。但是由于當前的阿里云MQTT不支持will、retain msg、QOS2,并且存在限流、斷連等不穩定因素,自建MQTT集群這件事就顯得格外重要。

在調研了Eclipse Mosquitto后,我又在EMQ(Erlang/Enterprise/Elastic MQTT Broker)的官網http://www.emqtt.com,2019年1月25日已經更新到3.0.1版本,EMQ X R3.0完整支持MQTT V3.1/V3.1.1/V5.0版本協議規范,并擴展支持MQTT-SN、WebSocket、CoAP、Stomp或私有TCP/UDP協議。EMQ X 3.0消息服務器支持單節點100萬連接與多節點分布式集群。上發現了這么一段描述:“EMQ消息服務器1.x版本MQTT連接壓力測試到130萬,在一臺8核心、32G內存的CentOS服務器上。”經過梳理后我認為,它的服務端調優主要分為Linux操作系統參數調優和TCP協議棧網絡參數調優兩部分。100萬連接測試所需參數包含Linux內核參數、網絡協議棧參數、Erlang虛擬機參數,本書由于主要介紹數據庫連接池Linux內核參數、網絡協議棧參數的共通部分,Erlang虛擬機參數調優及EMQX消息服務器參數調優部分略去。

Linux操作系統參數調優如下:

1)系統全局允許分配的最大文件句柄數。

        sysctl -w fs.file-max=2097152
        sysctl -w fs.nr_open=2097152
        echo 2097152 > /proc/sys/fs/nr_open

2)允許當前會話或進程打開文件句柄數。

        ulimit -n 1048576

TCP協議棧網絡參數調優如下:

1)并發連接backlog設置。

        sysctl -w net.core.somaxconn=32768
        sysctl -w net.ipv4.tcp_max_syn_backlog=16384
        sysctl -w net.core.netdev_max_backlog=16384

2)TCP Socket讀寫Buffer設置。

        sysctl -w net.core.rmem_default=262144
        sysctl -w net.core.wmem_default=262144
        sysctl -w net.core.rmem_max=16777216
        sysctl -w net.core.wmem_max=16777216
        sysctl -w net.core.optmem_max=16777216
        #sysctl -w net.ipv4.tcp_mem='167772161677721616777216'
        sysctl -w net.ipv4.tcp_rmem='1024409616777216'
        sysctl -w net.ipv4.tcp_wmem='1024409616777216'

3)TCP連接追蹤設置。

        sysctl -w net.nf_conntrack_max=1000000
        sysctl -w net.netfilter.nf_conntrack_max=1000000
        sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=30

4)TIME-WAITSocket最大數量、回收與重用設置。

        net.ipv4.tcp_max_tw_buckets=1048576
        # 注意: 不建議開啟該設置,NAT模式下可能引起連接RST
        # net.ipv4.tcp_tw_recycle = 1
        # net.ipv4.tcp_tw_reuse = 1

5)FIN-WAIT-2 Socket超時設置。

        net.ipv4.tcp_fin_timeout = 15

TCP/IP參考模型可以分為應用層、傳輸層、網絡層、鏈路層。TCP和UDP在傳輸層,應用層除了剛才我們介紹的MQTT,還有HTTP、FTP等。因為MQTT運行于TCP協議之上,所以它的調優也離不開TCP的參數調優,數據庫連接池的出現也是為了解決應用與數據庫之間TCP的性能問題,當前很多應用,比如服務端和算法服務的交互也離不開TCP的傳輸。所以了解TCP的調優方式可以夯實這個技術領域調優的基礎,一通百通。

光陰荏苒,日月如梭,MQTT的這段調優配置不禁讓我回想起了4年前在阿里巴巴公司做的將TCP中間件服務的QPS從百級提升到萬級的全鏈路壓測與技術改造的那件往事。

主站蜘蛛池模板: 读书| 临夏市| 美姑县| 芜湖县| 紫阳县| 海原县| 宁蒗| 常山县| 尚志市| 长岛县| 卢氏县| 万安县| 焦作市| 遂平县| 屏南县| 同江市| 历史| 南郑县| 逊克县| 赤峰市| 葵青区| 梁平县| 吉首市| 尉氏县| 上栗县| 丽江市| 龙口市| 武强县| 阿图什市| 牟定县| 渑池县| 西藏| 县级市| 永安市| 新竹县| 舟山市| 凤凰县| 蒲城县| 五河县| 平舆县| 伊宁市|