Java Nio 部署調(diào)優(yōu) 50w 并發(fā)

備份轉(zhuǎn)載金總的Note

概述

本文描述了在 Linux 服務器上部署 example broker 上的相關過程及步驟, 為運維及開發(fā)人員提供參考濒募。

example broker

example broker 是一款使用 Java 編寫的 Mqtt 服務器。能夠為符合 Mqtt 規(guī)范的客戶端提供基于 Mqtt 的消息訂閱, 發(fā)送服務颁督。example broker 對于 Java 版本有著嚴格的要求单雾,只能運行在 Java 8 或是以上版本, 不提供向下兼容赚哗。

操作系統(tǒng)

example broker 并未在 Windows 平臺上進行過測試,因此建議生產(chǎn)環(huán)境部署在 Linux硅堆。以下相關的命令都是基于 Cent OS X86_64 版本, 部分命令可能需要 root 權限屿储。

內(nèi)核參數(shù)

為了保證 example broker 能夠達到要求的連接數(shù), 因此需要對內(nèi)核參數(shù)進行如下的修改, 來支撐大量的 tcp/ip 連接(大于等于 500,000)。

系統(tǒng)文件數(shù)

運行 cat /etc/security/limits.conf 查看操作系統(tǒng)當前允許打開的最大文件數(shù)硬萍,確認運行 example broker 的用戶能夠打開 500,000 以上的文件, (建議修改為 1,000,000) 以下的配置示例是允許所有用戶修改文件數(shù)的值為 1,048,576:

* soft nofile 1048576
* hard nofile 1048576

其中的 * 代表影響系統(tǒng)所有用戶, 可以根據(jù)實際需要修改為運行 example broker 的用戶扩所。soft 對應的為警告值, 而 hard 則是真正起作用的限制值。

運行 sysctl -a | grep file 查看 fs.file-max 的值應符合 1,000,000 左右的數(shù)值, 并小于上面提及的允許修改數(shù), 這個數(shù)字將會影響整個操作系統(tǒng)能夠打開的最大文件數(shù)朴乖。

啟動 example broker 之前, 在當前 shell 中執(zhí)行 ulimit -n 1000000 使當前會話中允許打開的最大文件數(shù)設置生效。具體會在啟動 example broker 部分進行介紹助赞。

TCP/IP 及網(wǎng)絡相關參數(shù)

執(zhí)行 lsmod | grep nf_conntrack_ipv4 查看系統(tǒng)是否啟用 firewalld service买羞。
由于 tcp/ip 連接數(shù)上升后會造成 防火墻的相關功能及日志寫入的工作量上升, 從而影響 tcp/ip 請求的正常連接, 因此現(xiàn)階段的臨時解決方案使關閉防火墻 服務。在實際生產(chǎn)環(huán)境的解決措施仍待考慮雹食。執(zhí)行 systemctl stop firewalld, 然后再次執(zhí)行 lsmod | grep nf_conntrack_ipv4 查看服務是否已經(jīng)關閉畜普。

tcp/ip 的 backlog 參數(shù)也會影響 tcp/ip 的連接速度及穩(wěn)定性, 因此可以執(zhí)行以下命令, 將參數(shù)設置為 4096(參考值)。
sysctl -w net.ipv4.tcp_max_syn_backlog=4096

所需軟件

在部署和使用 example broker 前群叶,請按照如下步驟安裝所需的軟件吃挑,并確認軟件安裝正確。

Java

請執(zhí)行 java -version 確認服務器上是否安裝 Java, 或是已經(jīng)安裝的 Java 版本街立。如前文所述, example broker 依賴 Java 8 或是以上版本, 如果服務器現(xiàn)有 Java 的版本較低舶衬,請更新至所需的高版本。

在同一個操作系統(tǒng)上存在多個版本 Java 時容易引起一些不必要的麻煩赎离,或是由于環(huán)境變量等因素額外增加不必要的工作, 因此我們推薦安裝 jEnv 來管理不同版本的 Java逛犹。具體的安裝過程請參考官方網(wǎng)站, 本文不再贅述。

Kafka

example broker 依賴 Kafka 消息中間件來完成 mqtt 消息的訂閱-發(fā)布功能, 因此請確認 kafka 服務器的聯(lián)通性和可用性正常。

Redis

Redis 負責 mqtt 相關消息的存儲功能, 因此在運行 example broker 時確認連接的 redis 能夠正常工作虽画。

安裝 example broker

example broker 本身為 jar 包, 且包含了運行所需的所有依賴類庫舞蔽。因此只需要上傳至用戶安裝所需的目錄即可,無需額外的特殊操作码撰。

運行

使用原生的 java 命令即可運行 example broker 服務渗柿。但是為了便捷, 我們建議編寫一個獨立的 shell 腳本來完成該項工作。以下是一個運行 example broker 的示例腳本脖岛。

#!/bin/bash
ulimit -n 1000000
JAVA_OPTS="-server -Xms4048M -Xmx4048M -Xmn400M -XX:+HeapDumpOnOutOfMemoryError -Dcom.sun.management.jmxremote.port=9988 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.1.1"
nohup java $JAVA_OPTS -jar example-broker-0.0.1-SNAPSHOT-uber.jar server config.yaml&

首先腳本使用 ulimit -n 1000000 來設置本次 shell session 運行的進程允許最多打開 1,000,000 個文件句柄做祝。

腳本中的 JAVA_OPTS 參數(shù)定義了啟動 Java 虛擬機所需的相關參數(shù)。在示例中我們定義了以 server 模式啟動 JVM, 同時定義了Java Heap 部分的最大, 最小內(nèi)存都為 4048MB, 且最小內(nèi)存為 400MB鸡岗。其余的 JVM 參數(shù)請參考對應的用戶手冊, 并根據(jù)實際要求要添加或是修改混槐。

其中需要特別指出的是 JMX 相關的參數(shù)設置, 啟用了 JMX 的監(jiān)測服務, 允許用戶在系統(tǒng)運行階段使用 JMX 客戶端進行連接, 從而實時監(jiān)控系統(tǒng)的運行參數(shù)。

腳本中的剩余部分即為使用后臺運行模式來運行 example broker 程序轩性。

驗證

在運行 example broker 后, 請使用以下的方式來驗證 example broker 是否正常運行声登。

使用 tail 命令查看 example broker 的日志輸出, 查看是否正常啟動, 或在啟動過程中是否出現(xiàn)異常信息。

使用 jps 命令查看是否存在 example broker 對應的進程揣苏。

在條件允許的情況下, 可以使用第三方的 mqtt 客戶端對 example broker 進行簡單的功能性測試悯嗓。

Trouble Shooting

按照本文的上述配置, 在內(nèi)網(wǎng)環(huán)境的同一個網(wǎng)段上, 部署單個 example broker 在雙核 8G 內(nèi)存的服務器, 可以輕松的達到 500,000 的長連接數(shù)。如果在部署過程中遇到問題, 或是無法達到預期的性能請參考以下的流程進行排查卸察。

  1. 確認操作系統(tǒng)的文件句柄數(shù)已經(jīng)調(diào)整, 且大于需要承載的連接數(shù)脯厨。
  2. 確認 Linux 的 iptables 服務已經(jīng)關閉。
  3. example broker 依賴的 Kafka 和 Redis 服務能夠正常工作坑质。
  4. Linux 上安裝的 Java 版本正確合武。
  5. 啟動 example broker 的命令正確。
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涡扼,一起剝皮案震驚了整個濱河市稼跳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吃沪,老刑警劉巖汤善,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異票彪,居然都是意外死亡红淡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門降铸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來在旱,“玉大人,你說我怎么就攤上這事垮耳【痹ǎ” “怎么了遂黍?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長俊嗽。 經(jīng)常有香客問我雾家,道長,這世上最難降的妖魔是什么绍豁? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任芯咧,我火速辦了婚禮,結(jié)果婚禮上竹揍,老公的妹妹穿的比我還像新娘敬飒。我一直安慰自己,他們只是感情好芬位,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布无拗。 她就那樣靜靜地躺著,像睡著了一般昧碉。 火紅的嫁衣襯著肌膚如雪英染。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天被饿,我揣著相機與錄音四康,去河邊找鬼。 笑死狭握,一個胖子當著我的面吹牛闪金,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播论颅,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼哎垦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了嗅辣?” 一聲冷哼從身側(cè)響起撼泛,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎澡谭,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體损俭,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡蛙奖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了杆兵。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雁仲。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖琐脏,靈堂內(nèi)的尸體忽然破棺而出攒砖,到底是詐尸還是另有隱情缸兔,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布吹艇,位于F島的核電站惰蜜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏受神。R本人自食惡果不足惜抛猖,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鼻听。 院中可真熱鬧财著,春花似錦、人聲如沸撑碴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽醉拓。三九已至伟姐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間廉嚼,已是汗流浹背玫镐。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留怠噪,地道東北人恐似。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像傍念,于是被迫代替她去往敵國和親矫夷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理憋槐,服務發(fā)現(xiàn)双藕,斷路器,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,815評論 6 342
  • 備份轉(zhuǎn)載金總的Note 概述 本文描述了對 example broker 進行性能測試時, 客戶端所需進行配置的相...
    Shaman閱讀 4,969評論 0 1
  • 從三月份找實習到現(xiàn)在阳仔,面了一些公司忧陪,掛了不少,但最終還是拿到小米近范、百度嘶摊、阿里、京東评矩、新浪叶堆、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,248評論 11 349
  • 文學會勾勒出人世生活中的各種真實與理想斥杜。 無論生活怎樣的黑暗虱颗,復雜沥匈,那些人們內(nèi)心閃耀的東西依然會存在著。文學就是一...
    登峰方可睥睨四海閱讀 237評論 0 5