當前位置:首頁 » 操作系統 » netty5源碼

netty5源碼

發布時間: 2022-05-22 11:21:14

1. 100萬並發連接伺服器筆記之java Netty處理1M連接會怎麼樣

每一種該語言在某些極限情況下的表現一般都不太一樣,那麼我常用的Java語言,在達到100萬個並發連接情況下,會怎麼樣呢,有些好奇,更有些期盼。
這次使用經常使用的順手的netty NIO框架(netty-3.6.5.Final),封裝的很好,介面很全面,就像它現在的域名 netty.io,專注於網路IO。
整個過程沒有什麼技術含量,淺顯分析過就更顯得有些枯燥無聊,准備好,硬著頭皮吧。
測試伺服器配置
運行在VMWare Workstation 9中,64位Centos 6.2系統,分配14.9G內存左右,4核。
已安裝有Java7版本:
java version "1.7.0_21"
Java(TM) SE Runtime Environment (build 1.7.0_21-b11)
Java HotSpot(TM) 64-Bit Server VM (build 23.21-b01, mixed mode)

在/etc/sysctl.conf中添加如下配置:
fs.file-max = 1048576
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_mem = 786432 2097152 3145728
net.ipv4.tcp_rmem = 4096 4096 16777216
net.ipv4.tcp_wmem = 4096 4096 16777216

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

在/etc/security/limits.conf中添加如下配置:
* soft nofile 1048576
* hard nofile 1048576

測試端
測試端無論是配置還是程序和以前一樣,翻看前幾篇博客就可以看到client5.c的源碼,以及相關的配置信息等。
伺服器程序
這次也是很簡單吶,沒有業務功能,客戶端HTTP請求,服務端輸出chunked編碼內容。
入口HttpChunkedServer.java:
唯一的自定義處理器HttpChunkedServerHandler.java:
啟動腳本start.sh
達到100萬並發連接時的一些信息
每次伺服器端達到一百萬個並發持久連接之後,然後關掉測試端程序,斷開所有的連接,等到伺服器端日誌輸出在線用戶為0時,再次重復以上步驟。在這反反復復的情況下,觀察內存等信息的一些情況。以某次斷開所有測試端為例後,當前系統佔用為(設置為list_free_1):
total used free shared buffers cached
Mem: 15189 7736 7453 0 18 120
-/+ buffers/cache: 7597 7592
Swap: 4095 948 3147

通過top觀察,其進程相關信息
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4925 root 20 0 8206m 4.3g 2776 S 0.3 28.8 50:18.66 java

在啟動腳本start.sh中,我們設置堆內存為6G。
ps aux|grep java命令獲得信息:
root 4925 38.0 28.8 8403444 4484764 ? Sl 15:26 50:18 java -server...HttpChunkedServer 8000

RSS佔用內存為4484764K/1024K=4379M
然後再次啟動測試端,在伺服器接收到online user 1023749時,ps aux|grep java內容為:
root 4925 43.6 28.4 8403444 4422824 ? Sl 15:26 62:53 java -server...

查看當前網路信息統計
ss -s
Total: 1024050 (kernel 1024084)
TCP: 1023769 (estab 1023754, closed 2, orphaned 0, synrecv 0, timewait 0/0), ports 12

Transport Total IP IPv6
* 1024084 - -
RAW 0 0 0
UDP 7 6 1
TCP 1023767 12 1023755
INET 1023774 18 1023756
FRAG 0 0 0

通過top查看一下
top -p 4925
top - 17:51:30 up 3:02, 4 users, load average: 1.03, 1.80, 1.19
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
Cpu0 : 0.9%us, 2.6%sy, 0.0%ni, 52.9%id, 1.0%wa, 13.6%hi, 29.0%si, 0.0%st
Cpu1 : 1.4%us, 4.5%sy, 0.0%ni, 80.1%id, 1.9%wa, 0.0%hi, 12.0%si, 0.0%st
Cpu2 : 1.5%us, 4.4%sy, 0.0%ni, 80.5%id, 4.3%wa, 0.0%hi, 9.3%si, 0.0%st
Cpu3 : 1.9%us, 4.4%sy, 0.0%ni, 84.4%id, 3.2%wa, 0.0%hi, 6.2%si, 0.0%st
Mem: 15554336k total, 15268728k used, 285608k free, 3904k buffers
Swap: 4194296k total, 1082592k used, 3111704k free, 37968k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4925 root 20 0 8206m 4.2g 2220 S 3.3 28.4 62:53.66 java

四核都被佔用了,每一個核心不太平均。這是在虛擬機中得到結果,可能真實伺服器會更好一些。 因為不是CPU密集型應用,CPU不是問題,無須多加關注。
系統內存狀況
free -m
total used free shared buffers cached
Mem: 15189 14926 263 0 5 56
-/+ buffers/cache: 14864 324
Swap: 4095 1057 3038

物理內存已經無法滿足要求了,佔用了1057M虛擬內存。
查看一下堆內存情況
jmap -heap 4925
Attaching to process ID 4925, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 23.21-b01

using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC

Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 6442450944 (6144.0MB)
NewSize = 629145600 (600.0MB)
MaxNewSize = 629145600 (600.0MB)
OldSize = 5439488 (5.1875MB)
NewRatio = 2
SurvivorRatio = 1
PermSize = 52428800 (50.0MB)
MaxPermSize = 52428800 (50.0MB)
G1HeapRegionSize = 0 (0.0MB)

Heap Usage:
New Generation (Eden + 1 Survivor Space):
capacity = 419430400 (400.0MB)
used = 308798864 (294.49354553222656MB)
free = 110631536 (105.50645446777344MB)
73.62338638305664% used
Eden Space:
capacity = 209715200 (200.0MB)
used = 103375232 (98.5863037109375MB)
free = 106339968 (101.4136962890625MB)
49.29315185546875% used
From Space:
capacity = 209715200 (200.0MB)
used = 205423632 (195.90724182128906MB)
free = 4291568 (4.0927581787109375MB)
97.95362091064453% used
To Space:
capacity = 209715200 (200.0MB)
used = 0 (0.0MB)
free = 209715200 (200.0MB)
0.0% used
concurrent mark-sweep generation:
capacity = 5813305344 (5544.0MB)
used = 4213515472 (4018.321487426758MB)
free = 1599789872 (1525.6785125732422MB)
72.48054631000646% used
Perm Generation:
capacity = 52428800 (50.0MB)
used = 5505696 (5.250640869140625MB)
free = 46923104 (44.749359130859375MB)
10.50128173828125% used

1439 interned Strings occupying 110936 bytes.

老生代佔用內存為72%,較為合理,畢竟系統已經處理100萬個連接。
再次斷開所有測試端,看看系統內存(free -m)
total used free shared buffers cached
Mem: 15189 7723 7466 0 13 120
-/+ buffers/cache: 7589 7599
Swap: 4095 950 3145

記為list_free_2。
list_free_1和list_free_2兩次都釋放後的內存比較結果,系統可用物理已經內存已經降到7589M,先前可是7597M物理內存。
總之,我們的JAVA測試程序在內存佔用方面已經,最低需要7589 + 950 = 8.6G內存為最低需求內存吧。
GC日誌
我們在啟動腳本處設置的一大串參數,到底是否達到目標,還得從gc日誌處獲得具體效果,推薦使用GCViewer。
GC事件概覽:

其它:

總之:
只進行了一次Full GC,代價太高,停頓了12秒。
PartNew成為了停頓大戶,導致整個系統停頓了41秒之久,不可接受。
當前JVM調優喜憂參半,還得繼續努力等
小結
Java與與Erlang、C相比,比較麻煩的事情,需要在程序一開始就得准備好它的堆棧到底需要多大空間,換個說法就是JVM啟動參數設置堆內存大小,設置合適的垃圾回收機制,若以後程序需要更多內存,需停止程序,編輯啟動參數,然後再次啟動。總之一句話,就是麻煩。單單JVM的調優,就得持續不斷的根據檢測、信息、日誌等進行適當微調。

2. netty與ES比較,哪個源碼容易學習

Maven項目的jar包不是應該在Maven的指定的目錄嗎? 為什麼要做這么多無用的工作,直接用mvn install 把所有的jar包下載完成後,在Eclipse中直接導入一個Maven項目不就可以了

3. Netty5客戶端怎麼主動給服務端發消息

建議客戶端發送心跳包較為合適,原因:
1、若用戶較多,服務端發送心跳包易使伺服器超負荷。
2、客戶端發送請求數據時可視為一次心跳包發送,節約處理速度。

4. NIO+Netty5 求視頻教程

推薦學途無憂 夜行俠老師的《NIO+Netty5各種RPC架構實戰演練課程》

5. 如何配置方便閱讀和記錄注釋Netty源碼文件的IDEA環境

一、找到文件和代碼的模板設置 Preferences->Editor->File and Code Templates,然後在Templates這個tab下,選擇你需要修改的文件類型的頭模板。 二、修改注釋 選中上一步的某一個類型以後,將#parse("File Header.java")這一行刪除。

6. 為啥netty 5.0 官網沒有了

java compiler compliance level:

build path的JDK版本是你開發的時候編譯器需要使用到的,例如,如果用的JDK1.4就不能使用泛型。而java compiler compliance level設置的是你寫好的JAVA代碼按照什麼JDK版本級別編譯,例如:設置的是1.4,編譯出來的class文件可以在1.4以上的JRE上運行,如果用的是5.0級別編譯,就不能運行在1.4的環境裡面,會提示版本過高。

只要build path的JDK版本高於或等於java compiler compliance level裡面的級別都可以

所以,這個netty用了jdk7的語法所以需要jdk7build,但是確是在jdk5級別編譯的,所以可以在jre1.5以上運行

7. netty5 為什麼公網沒有了

修改IP永久生效按以下方法
vi /etc/sysconfig/network-scripts/ifcfg-eth0(eth0,第一塊網卡,如果是第二塊則為eth1)
按如下修改ip
DEVICE=eth0(如果是第二塊剛為eth1)
BOOTPROTO=static
IPADDR=192.168.0.11(改成要設置的IP)
NETMASK=255.255.255.0 (子網掩碼)
GATEWAY=192.168.0.1(網關)
ONBOO=yes
然後
service network restart
IP地址生效,重啟系統後不變
如果是臨時修改IP重啟系統後恢復原始IP則用以下命令
ifconfig IP地址 netmask 子網掩碼

8. netty5 怎麼傳輸大數據文件

在每次發包的時候,在包 頭的位置添加4個位元組的標志位,標志包的大小,然後在用ByteToMessageDecoder做分包處理,就OK了

9. 如何使用Netty實現心跳檢測

新建Java工程,並導入netty使用的jar包,最好將源碼包也放在本工程下,便於了解netty的源碼實現。

可以從netty自帶的example中復制一個例子過來,在此基礎上進行修改。

在此基礎上對代碼進行改造。打開EchoServer.java,添加空閑檢測類。

編寫心跳檢測處理類。並將此類添加到pinpline的handler裡面。

改造完了服務端,需要對客戶端內容改造一下。啟動客戶端後,先發一個「hello」消息,然後等候服務端心跳信息「ping」,收到心跳後,回復心跳響應「ok」。心跳消息可以根據需要進行定義。修改的類為EchoClientHandler。

為方便查看可以將netty的日誌打開。
即:將此句p.addLast(new LoggingHandler(LogLevel.INFO));前面的注釋去掉,執行測試一下。查看服務端,可以看到心跳包和心跳響應。

將客戶端回復心跳的內容刪除,再執行查看結果。此時可以看到服務端在30秒內沒有收到心跳,認為客戶端連接出現問題,將此連接關閉。

10. 如何編譯 netty 源碼並導入android studio

一、修改Android Studio(以下簡稱AS)的內存配置

因為在導入源碼時需要消耗大量內存,所以先修改IDEA_HOME/bin/studio.vmoptions中-Xms和-Xmx的值。文檔中使用的是748m, 可自行修改。

二、配置AS的JDK、SDK

在IDE中添加一個沒有classpath的JDK, 這樣可以確保使用源碼里的庫文件

並將其作為要使用的SDK的Java SDK。

三、生成導入AS所需配置文件(*.ipr)

①編譯源碼(為了確保生成了.java文件,如R.java;如果編譯過,則無需再次編譯)

②檢查out/host/linux-x86/framework/目錄下是否有idegen.jar

如果idegen.jar不存在,執行:

mmm development/tools/idegen/
在5.0.1的源碼中會生成res.java的文件夾,導致idegen.jar運行時拋FileNotFoundException,這是idegen的代碼不夠嚴謹造成的。

我的分享里有修改這個bug的patch,或者直接使用我分享的idegen.jar。

③執行

development/tools/idegen/idegen.sh
等待出現類似下面的結果:

Read excludes: 5ms
Traversed tree: 44078ms
這時會在源碼的根目錄下生成android.ipr和android.iml兩個IntelliJ IDEA(AS是基於IntelliJ IDEA社區版開發的)的配置文件

熱點內容
osg編譯max 發布:2024-06-14 23:11:00 瀏覽:937
15個鏡頭的腳本 發布:2024-06-14 22:38:08 瀏覽:509
如何打開伺服器的防火牆 發布:2024-06-14 22:36:36 瀏覽:811
安卓版的第5人格怎麼賣 發布:2024-06-14 22:36:28 瀏覽:903
50g硬碟雲伺服器 發布:2024-06-14 22:35:49 瀏覽:478
華為java編程規范 發布:2024-06-14 22:19:31 瀏覽:575
無線伺服器更換ip 發布:2024-06-14 22:05:56 瀏覽:943
網頁登陸腳本 發布:2024-06-14 22:05:55 瀏覽:26
dos命令進入d盤文件夾 發布:2024-06-14 21:52:58 瀏覽:117
蘋果6怎麼改4位密碼 發布:2024-06-14 21:52:19 瀏覽:440