<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    聶永的博客

    記錄工作/學(xué)習(xí)的點(diǎn)點(diǎn)滴滴。

    100萬并發(fā)連接服務(wù)器筆記之Java Netty處理1M連接會怎么樣

    前言

    每一種該語言在某些極限情況下的表現(xiàn)一般都不太一樣,那么我常用的Java語言,在達(dá)到100萬個并發(fā)連接情況下,會怎么樣呢,有些好奇,更有些期盼。
    這次使用經(jīng)常使用的順手的netty NIO框架(netty-3.6.5.Final),封裝的很好,接口很全面,就像它現(xiàn)在的域名 netty.io,專注于網(wǎng)絡(luò)IO。
    整個過程沒有什么技術(shù)含量,淺顯分析過就更顯得有些枯燥無聊,準(zhǔn)備好,硬著頭皮吧。

    測試服務(wù)器配置

    運(yùn)行在VMWare Workstation 9中,64位Centos 6.2系統(tǒng),分配14.9G內(nèi)存左右,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的源碼,以及相關(guān)的配置信息等。

    服務(wù)器程序

    這次也是很簡單吶,沒有業(yè)務(wù)功能,客戶端HTTP請求,服務(wù)端輸出chunked編碼內(nèi)容。

    入口HttpChunkedServer.java:

    唯一的自定義處理器HttpChunkedServerHandler.java:

    啟動腳本start.sh

    達(dá)到100萬并發(fā)連接時的一些信息

    每次服務(wù)器端達(dá)到一百萬個并發(fā)持久連接之后,然后關(guān)掉測試端程序,斷開所有的連接,等到服務(wù)器端日志輸出在線用戶為0時,再次重復(fù)以上步驟。在這反反復(fù)復(fù)的情況下,觀察內(nèi)存等信息的一些情況。以某次斷開所有測試端為例后,當(dāng)前系統(tǒng)占用為(設(shè)置為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觀察,其進(jìn)程相關(guān)信息

        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中,我們設(shè)置堆內(nèi)存為6G。

    ps aux|grep java命令獲得信息:

      root      4925 38.0 28.8 8403444 4484764 ?     Sl   15:26  50:18 java -server...HttpChunkedServer 8000
    

    RSS占用內(nèi)存為4484764K/1024K=4379M

    然后再次啟動測試端,在服務(wù)器接收到online user 1023749時,ps aux|grep java內(nèi)容為:

      root      4925 43.6 28.4 8403444 4422824 ?     Sl   15:26  62:53 java -server...
    

    查看當(dāng)前網(wǎng)絡(luò)信息統(tǒng)計(jì)

      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
    

    四核都被占用了,每一個核心不太平均。這是在虛擬機(jī)中得到結(jié)果,可能真實(shí)服務(wù)器會更好一些。 因?yàn)椴皇荂PU密集型應(yīng)用,CPU不是問題,無須多加關(guān)注。

    系統(tǒng)內(nèi)存狀況

      free -m
                   total       used       free     shared    buffers     cached
      Mem:         15189      14926        263          0          5         56
      -/+ buffers/cache:      14864        324
      Swap:         4095       1057       3038
    

    物理內(nèi)存已經(jīng)無法滿足要求了,占用了1057M虛擬內(nèi)存。

    查看一下堆內(nèi)存情況

      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.
    

    老生代占用內(nèi)存為72%,較為合理,畢竟系統(tǒng)已經(jīng)處理100萬個連接。

    再次斷開所有測試端,看看系統(tǒng)內(nèi)存(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_1list_free_2兩次都釋放后的內(nèi)存比較結(jié)果,系統(tǒng)可用物理已經(jīng)內(nèi)存已經(jīng)降到7589M,先前可是7597M物理內(nèi)存。
    總之,我們的JAVA測試程序在內(nèi)存占用方面已經(jīng),最低需要7589 + 950 = 8.6G內(nèi)存為最低需求內(nèi)存吧。

    GC日志

    我們在啟動腳本處設(shè)置的一大串參數(shù),到底是否達(dá)到目標(biāo),還得從gc日志處獲得具體效果,推薦使用GCViewer

    GC事件概覽:
    gc_eventdetails

    其它:
    gc_total_1 gc_total_2 gc_total_3

    總之:

    • 只進(jìn)行了一次Full GC,代價太高,停頓了12秒。
    • PartNew成為了停頓大戶,導(dǎo)致整個系統(tǒng)停頓了41秒之久,不可接受。
    • 當(dāng)前JVM調(diào)優(yōu)喜憂參半,還得繼續(xù)努力等

    小結(jié)

    Java與與Erlang、C相比,比較麻煩的事情,需要在程序一開始就得準(zhǔn)備好它的堆棧到底需要多大空間,換個說法就是JVM啟動參數(shù)設(shè)置堆內(nèi)存大小,設(shè)置合適的垃圾回收機(jī)制,若以后程序需要更多內(nèi)存,需停止程序,編輯啟動參數(shù),然后再次啟動。總之一句話,就是麻煩。單單JVM的調(diào)優(yōu),就得持續(xù)不斷的根據(jù)檢測、信息、日志等進(jìn)行適當(dāng)微調(diào)。

    • JVM需要提前指定堆大小,相比Erlang/C,這可能是個麻煩
    • GC(垃圾回收),相對比麻煩,需要持續(xù)不斷的根據(jù)日志、JVM堆棧信息、運(yùn)行時情況進(jìn)行JVM參數(shù)微調(diào)
    • 設(shè)置一個最大連接目標(biāo),多次測試達(dá)到頂峰,然后釋放所有連接,反復(fù)觀察內(nèi)存占用,獲得一個較為合適的系統(tǒng)運(yùn)行內(nèi)存值
    • Eclipse Memory Analyzer結(jié)合jmap導(dǎo)出堆棧DUMP文件,分析內(nèi)存泄漏,還是很方便的
    • 想修改運(yùn)行時內(nèi)容,或者稱之為熱加載,默認(rèn)不可能
    • 真實(shí)機(jī)器上會有更好的反映

    吐槽一下:
    JAVA OSGI,相對比Erlang來說,需要人轉(zhuǎn)換思路,不是那么原生的東西,總是有些別扭,社區(qū)或商業(yè)公司對此的修修補(bǔ)補(bǔ),不過是實(shí)現(xiàn)一些面向?qū)ο笏痪邆涞臒峒虞d的企業(yè)特性。

    測試源代碼,下載just_test

    posted on 2013-05-13 11:16 nieyong 閱讀(62661) 評論(9)  編輯  收藏 所屬分類: C1M

    評論

    # re: 100萬并發(fā)連接服務(wù)器筆記之Java Netty處理1M連接會怎么樣 2013-05-17 16:17 小孟

    LZ你好,按照你的程序及配置,部署到linux機(jī)子上測試,發(fā)現(xiàn)online user 大概到300就上不去了,能否指點(diǎn)下問題在哪里,甚是苦惱啊 系統(tǒng)信息為 虛擬機(jī)centos6.5 內(nèi)存8G Cpu 4核  回復(fù)  更多評論   

    # re: 100萬并發(fā)連接服務(wù)器筆記之Java Netty處理1M連接會怎么樣 2013-05-19 16:23 nieyong

    @小孟
    問題太模糊,很難清晰定位。服務(wù)器端,需要修改兩處:
    1. 編輯/etc/security/limits.conf文件,添加如下內(nèi)容
    * soft nofile 1048576
    * hard nofile 1048576

    2. 在/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

    在測試端,也需要執(zhí)行兩處:
    1. 編輯/etc/security/limits.conf文件,添加如下內(nèi)容

    * soft nofile 1048576
    * hard nofile 1048576
    2. 在/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

    測試端最重要配置也就是
    fs.file-max = 1048576
    net.ipv4.ip_local_port_range = 1024 65535

    具體問題,請具體定位。  回復(fù)  更多評論   

    # re: 100萬并發(fā)連接服務(wù)器筆記之Java Netty處理1M連接會怎么樣 2013-05-20 17:32 小孟

    @nieyong
    謝謝你的回復(fù) 我今天重新安裝了系統(tǒng) 換成64位centos 發(fā)現(xiàn)連接數(shù)上去了 看來服務(wù)器系統(tǒng)還是非常關(guān)鍵的  回復(fù)  更多評論   

    # re: 100萬并發(fā)連接服務(wù)器筆記之Java Netty處理1M連接會怎么樣 2013-07-12 10:58 we

    Java與C,erlang的玩法都不一樣,有些比較是片面的  回復(fù)  更多評論   

    # re: 100萬并發(fā)連接服務(wù)器筆記之Java Netty處理1M連接會怎么樣 2013-10-02 15:35 daquan

    請問100萬的并發(fā)是用什么工具產(chǎn)生的?一共用了幾臺壓力機(jī)?
    我的壓力機(jī)在win平臺使用loadrunner模擬1w并發(fā)就已經(jīng)卡的不行了,根本沒法跑到100w  回復(fù)  更多評論   

    # re: 100萬并發(fā)連接服務(wù)器筆記之Java Netty處理1M連接會怎么樣 2013-11-21 11:58 Ronrey

    請問100萬的并發(fā)是用什么工具產(chǎn)生的?一共用了幾臺壓力機(jī)?您這個壓力測試工具是什么?  回復(fù)  更多評論   

    # re: 100萬并發(fā)連接服務(wù)器筆記之Java Netty處理1M連接會怎么樣[未登錄] 2013-12-17 13:04 HEDY

    100萬并發(fā)連接至少要16臺客戶機(jī)才能完全實(shí)現(xiàn)!!  回復(fù)  更多評論   

    # re: 100萬并發(fā)連接服務(wù)器筆記之Java Netty處理1M連接會怎么樣[未登錄] 2013-12-17 13:09 HEDY

    準(zhǔn)確的來說是16塊網(wǎng)卡  回復(fù)  更多評論   

    # re: 100萬并發(fā)連接服務(wù)器筆記之Java Netty處理1M連接會怎么樣 2014-03-07 21:42 海邊沫沫

    開啟一個Java虛擬機(jī),無法避免的問題就是一次Full GC時間太長。
    如果分成10個Java虛擬機(jī),每個只配置1G內(nèi)存,就不會有Full GC太占時間的問題了。  回復(fù)  更多評論   

    公告

    所有文章皆為原創(chuàng),若轉(zhuǎn)載請標(biāo)明出處,謝謝~

    新浪微博,歡迎關(guān)注:

    導(dǎo)航

    <2013年5月>
    2829301234
    567891011
    12131415161718
    19202122232425
    2627282930311
    2345678

    統(tǒng)計(jì)

    常用鏈接

    留言簿(58)

    隨筆分類(130)

    隨筆檔案(151)

    個人收藏

    最新隨筆

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 男男黄GAY片免费网站WWW| 亚洲av一本岛在线播放| 无遮挡国产高潮视频免费观看| 青娱乐免费视频在线观看| 亚洲国产成人精品青青草原| 最近2019年免费中文字幕高清| 久久久亚洲欧洲日产国码是AV| 1000部禁片黄的免费看| 亚洲国产综合在线| 我想看一级毛片免费的| 亚洲色欲啪啪久久WWW综合网| 日本免费一区二区三区最新vr| 久久精品国产亚洲AV电影网| 亚洲成a人片在线观看老师| 国产无遮挡色视频免费观看性色| 亚洲色欲久久久综合网东京热| 免费观看男人吊女人视频| 久久亚洲精品国产精品| 黄色网址免费观看| 亚洲乱亚洲乱妇24p| 亚洲乱码国产一区网址| 97无码人妻福利免费公开在线视频 | 亚洲国产av无码精品| 99re6在线视频精品免费| 亚洲天堂一区二区| 97在线观免费视频观看| 污网站在线观看免费| 国产成人亚洲综合色影视| 4虎永免费最新永久免费地址| 亚洲αⅴ无码乱码在线观看性色| 亚洲偷自拍拍综合网| 久艹视频在线免费观看| 亚洲一区AV无码少妇电影| 久久影院亚洲一区| 免费不卡视频一卡二卡| 免费精品久久久久久中文字幕 | 国产一卡二卡四卡免费| 国产综合成人亚洲区| 亚洲一区二区三区夜色 | 91麻豆精品国产自产在线观看亚洲| 污污网站18禁在线永久免费观看|