- HikariCP數據庫連接池實戰
- 朱政科
- 769字
- 2019-09-02 17:55:01
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)的官網上發現了這么一段描述:“EMQ消息服務器1.x版本MQTT連接壓力測試到130萬,在一臺8核心、32G內存的CentOS服務器上。”經過梳理后我認為,它的服務端調優主要分為Linux操作系統參數調優和TCP協議棧網絡參數調優兩部分。
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從百級提升到萬級的全鏈路壓測與技術改造的那件往事。
- Git Version Control Cookbook
- OpenNI Cookbook
- Learn Swift by Building Applications
- Unity Shader入門精要
- Java應用開發技術實例教程
- 高級語言程序設計(C語言版):基于計算思維能力培養
- Mastering JavaScript Design Patterns(Second Edition)
- C# 8.0核心技術指南(原書第8版)
- Learning Unity 2D Game Development by Example
- Java程序設計入門
- Instant Debian:Build a Web Server
- Hands-On JavaScript for Python Developers
- Flask開發Web搜索引擎入門與實戰
- Building Clouds with Windows Azure Pack
- 城市信息模型平臺頂層設計與實踐