HA架構關於應對高併發

前言:新項目上線,考驗高併發,預選使用LR錄製腳本跑腳本,考慮到搭建,使用簡便的jmeter工具,       來跑500、1000、1500、2000的併發並打出報告,中間經歷過tomcat與jmeter優化。

      高併發下考慮的層面  系統  +  nginx(理論3W左右)  +  tomcat--- 標籤(tcp)

實際操作:


      1、

    wKiom1kAawnyqjuvAABKH6KmS94188.png-wh_50


   方案:2000個線程,採取並大(可以選擇單個線程間隔),錯誤日誌實時打印

         當併發量達到1740時候,出現報錯,報錯日誌在附件jmeter.txt.

              此時服務器,cpu佔用量爲2.5%  高於平時1.5%-2%

                     Memcache大概多消耗1.4G-2G之間。

                     Tcp連接數監控 150左右飆升至2400左右,無影響

              此時:服務器情況良 好


          另:tcp連接超過3000時候(昨天測試接口4700併發)。出現cpu報警,開始優化架構


開始排查:


發現報錯,不是服務端報錯,是不是jmeter工具內存飆高,發現自己pc內存吃緊,關閉其他程序,並且調整jmeter內存,再跑。


2017/04/25 13:59:59 INFO  - jmeter.threads.JMeterThread: Thread finished: 線程組 1-484 

2017/04/25 13:59:59 ERROR - jmeter.threads.JMeterThread: Test failed! java.lang.OutOfMemoryError: unable to create new native thread

at java.lang.Thread.start0(Native Method)

at java.lang.Thread.start(Unknown Source)

at sun.net.www.http.KeepAliveCache$1.run(Unknown Source)

at sun.net.www.http.KeepAliveCache$1.run(Unknown Source)




           wKioL1kAbFrDu1qlAAEyWn28-tw503.png-wh_50



            調整之後再次跑併發測試,


     wKiom1kAbUfjuLUaAABKH6KmS94324.png-wh_50


      報錯結果爲後端服務端接收http請求後返回異常


   wKioL1kAbAuT8owOAAAc-KLstTI253.png-wh_50


           系統層面:


            tcp連接數超過5000,沒問題


             wKiom1kAaz7CvESOAAAM0c07Jtg208.png-wh_50


       連接中統計連接超時


         wKioL1kAa3eiHMjxAAA8wKXcno8893.png-wh_50


        死套接字超過1000,第一次是2200左右,第二次是1200,說明死套接字回收正常,速度還是可         以的

    再看一下。我的系統曾經做過的調優


       wKiom1kAbmHjA--yAABHoSyQ_ds956.png-wh_50


應用服務器優化:

          基本的+

【處理器子系統調優】:開啓超線程,處理器,重要性不言而喻,cpu性能經常是瓶頸,Hyper-Threading(超線程功能,基於SMP 內核),

Hyper-Threading 在操作系統裏將一顆處理器虛擬化爲兩顆使用,使得處理器,同一時刻,可以執行兩個線程或進程

TIME_WAIT相關sysctl參數及超時時間

[root@lvs ~]# sysctl -a | grep tw

net.ipv4.tcp_max_tw_buckets  //處於TIME_WAIT狀態的socket數目的最大值

net.ipv4.tcp_tw_recycle = 1 //打開TIME_WAIT快速回收機制

net.ipv4.tcp_tw_reuse //TIME_WAIT狀態socket複用

Sysctl –w net.ipv4.tcp_tw_len = 2   設置TIME_WAIT在2秒後超時


      果斷調整tomcat內存情況,(此時系統資源合理)


         wKiom1kAbZSC6J0jAAAnCCUi13o584.png-wh_50


       還是後端壓力過大,死套接字還是佔據tcp資源,返回

        Server returned HTTP response code: 502 for URL:                http://app.yunce56.cn/v10/message/test/list

       

     來看一下大嬸們關於這波測試給出的建議


       wKiom1kAbo_DV8ElAABpniS6XSo373.png-wh_50


假死有兩種情況,1種是time_wait過多,一種是close_wait過多,前者自行優化,後者開發程序問題

我幫你百度了一下,得出一條結論:這個錯誤是由於服務器壓力過大,不能及時處理client的請求導致服務器響應超時而拋出的錯誤


       wKioL1kAbumwPVv6AAHyCqr2RaM468.png-wh_50


基本上可以得出結論:

      即使做過死套接字回收機制+tomcat優化,應用服務器也無法支持瞬間大併發3000,單臺服務器理論65535.停留在涉及理論,(根據業務,有長連接或者是持續連接,做tcp連接回收機制,重點謹慎考慮)


之後採取措施:使用haproxy/lvs + nginx(s)+tomcat(s)。來因對併發,單臺服務器併發3000即有3%左               右連接數無法得到後端及時響應。

返回測試結果。調整架構方案。


架構方案(方案 + 回退機制)


方案

wKioL1kAcNmiSAjbAAAmtqk_TMM248.png-wh_50

   

    實施:1、停止148nginx,修改配置文件 

             80->1080

           2、啓用haproxy與2臺nginx,tcp觀測端口 

             啓動,觀察nginx日誌

             測試:聯繫開發與測試,boss與wap運行

    失敗回退:1、還原/etc/nginx

             2、停用haproxy

    備註:因阿里雲不支持VIP,故haproxy爲單點,

           後期部署ha節點,使用阿里雲負載均衡兩臺ha

            效果等同於keepalived+haproxy+nginx+tomcat


注重要的,關於80端口是誰提供的服務,根據架構決定,後來是haproxy+nginx


wKiom1kAcNmwXd53AAAOfCwuObA998.png-wh_50

    

User:

   此最重要,將使用原IP代理80端口,使用haproxy 80端口負載nginx集羣(1080端口),此時haproxy     提供web訪問,將奪取nginx 80端口,域名映射不變。


服務器採購


wKioL1kAcNqyZgZvAAB_vHe8O10282.png-wh_50

nginx書寫


wKiom1kAcPfiNPSpAAAVRp84OVo006.png-wh_50


haproxy書寫


wKioL1kAcPfgXRfKAAAaUffM2ug574.png-wh_50


上一篇文章書寫,關於tomcat優化,借鑑之前的經驗

http://chennailong.blog.51cto.com/10063928/1883671


方案提出,等待夜晚來臨,運維,are you ready ? 2017年4月26日  22:00-凌晨

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章