A. 100萬並發連接伺服器筆記之java Netty處理1M連接會怎麼樣
100萬並發連接伺服器筆記之Java Netty處理1M連接的預測如下:
1、不說Netty會如何,伺服器都有可能直接崩潰掉。
2、按平均每鏈接傳輸數據1K,100W鏈接大概數據量會在1G左右,G級伺服器網卡也受不了的。
3、在網路編程中對單機來講,成功解決了C10K的問題,這種M級別的鏈接,可能暫時解決不了。
4、對於如此大的並發,一般都是通過負載均衡的方式進行處理,如新浪微博,同時在線100W以上,通過約100多個節點處理,每個節點也就才10000並發左右。
總結如下:
1、JVM需要提前指定堆大小,相比Erlang/C,這可能是個麻煩。
2、GC(垃圾回收),需要持續不斷的根據日誌、JVM堆棧信息、運行時情況進行JVM參數微調。
3、設置一個最大連接目標,多次測試達到頂峰,然後釋放所有連接,反復觀察內存佔用,獲得一個較為合適的系統運行內存值。
4、Eclipse Memory Analyzer結合jmap導出堆棧DUMP文件,分析內存泄漏,還是很方便的。
5、想修改運行時內容,或者稱之為熱載入,默認不可能。
B. netty 和 java nio 的區別
netty的本質還是java nio只不來過做了很多的源封裝,讓你更容易用,也更容易寫出優質的代碼,因為JAVA NIO貌似由於歷史原因會有不少的問題,沒有足夠的經驗很容易出問題,但是網路層編程又往往是很多服務的基礎,如果出了問題,往往波及面會比較廣。
C. java Netty NIO 如何突破 65536 個埠的限制如何做到 10萬~50萬 長連接
首先說一下 伺服器是只監聽一個埠,所有的客戶端連接,都是連接到伺服器的同一個埠上的。也就是說伺服器只是用了一個埠。就比如Http伺服器。默認只用了80埠。
這是解答一些人的這個疑惑。
下面來回答你的問題
nio 在linux上使用的是epoll ,epoll支持在一個進程中打開的FD是操作系統最大文件句柄數,而不是你所說的16位short表示的文件句柄。 而 select模型 單進程打開的FD是受限的 select模型默認FD是1024 。操作系統最大文件句柄數跟內存有關,1GB內存的機器上,大概是10萬個句柄左右。可以通過cat /proc/sys/fs/file-max 查看
這個可以在Netty權威指南第二版的第七頁看到。
我ubuntu虛擬機,2G內存。結果是 200496
2019/05/09 修正一下上面讓人誤會的地方
「伺服器是只監聽一個埠」 這句話 請參照這一段的最後一行 「就比如Http伺服器默認只用了80埠」 我這一段話里說的伺服器並不是指伺服器主機 硬體, 而是說 服務程序。 一個伺服器主機操作系統上 可以運行很多服務程序, 而通常都會說 Netty伺服器、Apache伺服器、tomcat伺服器、Mysql伺服器 , 這里是指 Netty服務端 Apache服務端 tomcat服務端 Mysql服務端 。 再比如 一個游戲的登錄伺服器 沒人會叫他 游戲Netty服務程序 或者Netty登錄服務程序 , 而會稱呼它是 Netty伺服器或者登錄伺服器 或者xxx游戲登錄伺服器之類的。 只是依照行業術語來說的 被誤會了很抱歉 這里解釋一下 。
再次回答一下這個問題 Netty NIO不用突破65536個埠限制 因為根本沒有這個埠限制問題 只有主動發起一個請求 才會佔用一個本地埠 主動發起10個請求 會佔用10個本地埠 我這里說的是長連接 Netty NIO是屬於服務程序 他只需要監聽一個埠 比如8000埠 這時候有10個客戶端 連接到這個Netty伺服器 都是10個客戶端全都連接到伺服器的8000埠 服務端只會佔用8000埠這一個埠 所以不需要突破65536埠限制