聶永的博客

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

          Tsung筆記之監(jiān)控數(shù)據(jù)收集篇

          前言

          壓力測試和監(jiān)控分不開,監(jiān)控能夠記錄壓測過程中狀態(tài),方便問題跟蹤、定位。本篇我們將討論對壓測客戶端tsung client的監(jiān)控,以及對被壓測服務(wù)器的資源占用監(jiān)控等。同時,也涉及到Tsung運(yùn)行時的實(shí)時診斷方式,這也是對Tsung一些運(yùn)行時狀態(tài)的主動監(jiān)控。

          壓測客戶端的監(jiān)控

          壓測端(指的是tsung client)會收集每一個具體模擬終端用戶(即ts_client模塊)行為數(shù)據(jù),發(fā)送給主節(jié)點(diǎn)(tsung_controller),供后面統(tǒng)計分析使用。

          tsung_monitor_client?

          1. ts_client模塊調(diào)用ts_mon,而ts_mon又直接調(diào)用ts_mon_cache,有些繞,不直觀(邏輯層面可忽略掉ts_mon)
          2. count為計數(shù)器,sum表示各項累加值,sample和sample_counter計算一次統(tǒng)計項的平均值&標(biāo)準(zhǔn)差
          3. tsung.dump文件一般不會創(chuàng)建&寫入,除非你在tsung.xml文件中指定需要dump屬性為true,壓測數(shù)據(jù)量大時這個會影響性能
          4. match.log僅僅針對HTTP請求,默認(rèn)不會寫入,除非在HTTP壓測指定

                <http url="/" method="GET" version="1.1"/> 
                <match do=’log’ when=’match’ name=’http_match_200ok’>200OK</match> 
            
          5. 從節(jié)點(diǎn)tsung client所記錄日志、需要dump的請求-響應(yīng)數(shù)據(jù),都會交由tsung_controller處理

          6. ts_mon_cache,接收到數(shù)據(jù)統(tǒng)計內(nèi)存計算,每500毫秒周期分發(fā)給后續(xù)模塊,起到緩沖作用

          7. ts_stats_mon模塊接收數(shù)據(jù)進(jìn)行內(nèi)存計算,結(jié)果寫入由ts_mon觸發(fā)

          8. ts_mon負(fù)責(zé)統(tǒng)計數(shù)據(jù)最每10秒定時寫入各項統(tǒng)計數(shù)據(jù)到tsung.log文件,非實(shí)時,可避免磁盤IO開銷過大問題

            • tsung/src/tsung_controller/tsung_controller.app.in 對應(yīng) {dumpstats_interval, 10000}
            • 可以在運(yùn)行時修改
          9. tsung.log文件匯集了客戶端連接、請求、完整會話、頁面以及每一項的sum操作統(tǒng)計的完整記錄,后續(xù)perl腳本報表分析基于此

          10. ts_mon模塊處理tsung.log的最核心模塊,全局唯一進(jìn)程,標(biāo)識為{global, ts_mon}

          比如某次單機(jī)50萬用戶壓測tsung.log日志片段:

          # stats: dump at 1467620663
          stats: users 7215 7215
          stats: {freemem,"os_mon@yhg162"} 1 11212.35546875 0.0 11406.32421875 11212.35546875 11346.37109375 2
          stats: {load,"tsung_controller@10.10.10.10"} 1 0.0 0.0 0.01171875 0.0 0.01171875 2                                                                                 17,1          Top
          stats: {load,"os_mon@yhg162"} 1 2.3203125 0.0 3.96875 0.9609375 2.7558736313868613 411
          stats: {recvpackets,"os_mon@yhg162"} 1 5874.0 0.0 604484 5874 319260.6024390246 410
          stats: {sentpackets,"os_mon@yhg162"} 1 8134.0 0.0 593421 8134 293347.0707317074 410
          stats: {cpu,"os_mon@yhg162"} 1 7.806645016237821 0.0 76.07377357701476 7.806645016237821 48.0447587419309 411
          stats: {recvpackets,"tsung_controller@10.10.10.10"} 1 4164.0 0.0 45938 4164 24914.798543689314 412
          stats: {sentpackets,"tsung_controller@10.10.10.10"} 1 4182.0 0.0 39888 4182 22939.191747572815 412
          stats: {cpu,"tsung_controller@10.10.10.10"} 1 0.575191730576859 0.0 6.217097016796189 0.575191730576859 2.436491628709831 413
          stats: session 137 2435928.551725737 197.4558174045777 2456320.3908691406 2435462.9838867188 2436053.875557659 499863
          stats: users_count 0 500000
          stats: finish_users_count 137 500000
          stats: connect 0 0 0 1004.4912109375 0.278076171875 1.480528250488281 500000
          stats: page 139 12.500138756182556 1.1243565417115737 2684.760009765625 0.43115234375 16.094989098940804 30499861
          stats: request 139 12.500138756182556 1.1243565417115737 2684.760009765625 0.43115234375 16.094989098940804 30499861
          stats: size_rcv 3336 3386044720
          stats: size_sent 26132 6544251843
          stats: connected -139 0
          stats: error_connect_timeout 0 11
          

          tsung.log日志文件可由tsung_stats.pl腳本提取、分析、整理成報表展示,其報表的一個摘要截圖:

          ?

          異常行為的收集

          當(dāng)模擬終端遇到網(wǎng)絡(luò)連接超時、地址不可達(dá)等異常事件時,最終也會發(fā)給主節(jié)點(diǎn)的ts_mon模塊,保存到tsung.log文件中。

          這種異常記錄,關(guān)鍵詞前綴為 **error_**

          • 比如ts_client模塊遇到連接超時會匯報error_connect_timeout錯誤
          • 系統(tǒng)的可用端口不夠用時(創(chuàng)建與壓測服務(wù)器連接數(shù)超出可用段限制)上報error_connect_eaddrinuse錯誤

          Errors報表好比客戶端出現(xiàn)問題晴雨表,再加上tsung輸出log日志文件,很清楚的呈現(xiàn)壓測過程中出現(xiàn)的問題匯集,方便問題快速定位。

          ?

          被壓測服務(wù)器的監(jiān)控

          當(dāng)前tsung提供了3種方式進(jìn)行監(jiān)控目標(biāo)服務(wù)器資源占用情況:

          • erlang
          • snmp
          • Munin

          大致交互功能,粗略使用一張圖表示:

          tsung_server_monito?

          • tsung_controller主節(jié)點(diǎn)會被強(qiáng)制啟用監(jiān)控
          • SNMP方式,客戶端作為代理主動注冊并連接開放SNMP的服務(wù)器,SNMP安裝針對新手來說比較復(fù)雜
          • Munin采用C/S模式,自身要作為客戶端連接被壓測服務(wù)器上能夠安裝Munin Server
          • erlang方式,本身代理形式監(jiān)控服務(wù)器資源占用,滿足條件很簡單:
            • 需要能夠自動登錄連接
            • 并且安裝有Erlang運(yùn)行時環(huán)境,tsung_controller方便啟動監(jiān)控節(jié)點(diǎn)
            • 采用遠(yuǎn)程加載方式業(yè)務(wù)代碼,省去被監(jiān)控端部署的麻煩
            • 現(xiàn)實(shí)情況下,我一般采用一個腳本搞定自動部署監(jiān)控部署客戶端,自動打包可移植的Erlang,簡單綠色,部署方便
          • 提供監(jiān)控采樣數(shù)據(jù)包括 CPU/Memory/Load/Socket Sent&Recv
          • 所有監(jiān)控數(shù)據(jù)都會被發(fā)送給ts_mon模塊,并定時寫入到tsung.log文件中

          看一個最終報表部分呈現(xiàn)吧:

          ?

          tsung對服務(wù)器監(jiān)控采樣手機(jī)數(shù)據(jù)不是很豐富,因?yàn)樗嫦虻母鼮橥ㄓ玫谋O(jiān)控需求。

          更深層次、更細(xì)粒度資源監(jiān)控,就需要自行采集、自行分析了,一般在商業(yè)產(chǎn)品在這方面會有更明確需求。

          日志收集

          和前面講到的終端行為數(shù)據(jù)采集和服務(wù)器端資源監(jiān)控行為類似,tsung運(yùn)行過程中所產(chǎn)生日志被存儲到主節(jié)點(diǎn)。

          tsung使用error_logger記錄日志,主節(jié)點(diǎn)tsung_controller啟動之后,會并發(fā)啟動tsung client從節(jié)點(diǎn),換句話來說tsung client從節(jié)點(diǎn)是由主節(jié)點(diǎn)tsung_controller創(chuàng)建,這個特性決定了tsung client從節(jié)點(diǎn)使用error_logger記錄的日志都會被重定向到主節(jié)點(diǎn)tsung_controller所在服務(wù)器上,這個是由Erlang自身獨(dú)特機(jī)制決定。

          因此,你在主節(jié)點(diǎn)log目錄下能夠看到具體的日志輸出文件,也就水到渠成了。因?yàn)镋rlang天生分布式基因,從節(jié)點(diǎn)error_logger日志輸出透明重定向到主節(jié)點(diǎn),不費(fèi)吹灰之力。這在其他語言看來,確實(shí)完全不可能輕易實(shí)現(xiàn)的。

          基于error_logger包裝日志記錄,需要一個步驟:

          1. 設(shè)置輸出到文件系統(tǒng)中 error_logger:tty(false)
          2. 設(shè)定輸出的文件目錄 error_logger:logfile({open, LogFile})
          3. 包裝日志輸出接口 ?DEBUG/?DEBUGF/?LOG/?LOGF/
          4. 最終調(diào)用包裝的error_logger接口
          debug(From, Message, Args, Level) ->
              Debug_level = ?config(debug_level),
              if
                  Level =< Debug_level ->
                      error_logger:info_msg("~20s:(~p:~p) "++ Message,
                                            [From, Level, self()] ++ Args);
                  true ->
                      nodebug
              end.
          

          和大部分日志框架設(shè)定的日志等級一致,emergency > critical > error > warning > notice (default) > info > debug,從左到右,依次遞減。

          需要注意事項,error_logger語義為記錄錯誤日志,只適用于真正的異常情況,并不期望過多的消息量的處理。

          若當(dāng)一般業(yè)務(wù)調(diào)試類型日志量過多時,不但耗費(fèi)了大量內(nèi)存,網(wǎng)絡(luò)/磁盤寫入速度跟不上生產(chǎn)速度時,會導(dǎo)致進(jìn)程堵塞,嚴(yán)重會拖累整個應(yīng)用僵死,因此需要在tsung.xml文件中設(shè)置至少info級別,至少默認(rèn)的notice就很合適。

          Tsung運(yùn)行時診斷/監(jiān)控

          Tsung在運(yùn)行時,我們可以remote shell方式連接登錄進(jìn)去。

          為了連接方便,我寫了一個腳本 connect_tsung.sh,只需要傳入tsung節(jié)點(diǎn)名稱即可:

          # !/bin/bash
          ## 訪問遠(yuǎn)程Tsung節(jié)點(diǎn) sh connect\_tsung.sh tsung\_controller@10.10.10.10
          
          HOST=`ifconfig | grep "inet " | grep -v "127.0.0.1" | head -1 | awk '{print $2}' | cut -d / -f 1`
          if [ -z $HOST ]; then
              HOST = "127.0.0.1"
          fi
          erl -name tmp\_$RANDOM@$HOST -setcookie tsung -remsh $1
          

          需要安裝有Erlang運(yùn)行時環(huán)境支持

          當(dāng)然,要向運(yùn)行腳本,你得知道Tsung所有節(jié)點(diǎn)名稱。

          如何獲得tsung節(jié)點(diǎn)名稱

          其實(shí)有兩種方式獲得Tsung節(jié)點(diǎn)名稱:

          • 直接連接tsung_controller節(jié)點(diǎn)獲得
            • 若是IP形式,sh connect_tsung.sh tsung_controller@10.10.10.10
            • 若是hostname形式,可以這樣:sh connect_tsung.sh tsung_controller@tsung_master_hostname
            • 成功進(jìn)入之后,輸入 nodes(). 可以獲得完整tsung client節(jié)點(diǎn)列表
          • 啟動tsung時生成日志所在目錄,可以看到類似日志文件:
            • tsung client端產(chǎn)生日志單獨(dú)存放,格式為節(jié)點(diǎn)名稱.log
            • eg: tsung15@10.10.10.113.log,那么節(jié)點(diǎn)名稱為tsung15@10.10.10.113
            • 可以直接連接:sh connect_tsung.sh tsung15@10.10.10.ll3

          如何診斷/監(jiān)控Tsung運(yùn)行時

          其實(shí),這里僅僅針對使用Erlang并且對Tsung感興趣的同學(xué),你都能夠進(jìn)來了,那么如何進(jìn)行查看、調(diào)試運(yùn)行時tsung系統(tǒng)運(yùn)行情況,那么就很簡單了。推薦使用 recon 庫,包括內(nèi)存占用,函數(shù)運(yùn)行堆棧,CPU資源分配等,一目了然。

          若問,tsung啟動時如何添加recon依賴,也不復(fù)雜:

          1. 每一個運(yùn)行tsung的服務(wù)器拷貝已經(jīng)編譯完成的recon項目到指定目錄
          2. tsung_controller主節(jié)點(diǎn)啟動時,指定recon依賴庫位置

            tsung -X /Your_Save_Path/recon/ebin/ ...

          說一個用例,修改監(jiān)控數(shù)據(jù)每10秒寫入tsung.log文件時間間隔值,10秒修改為5秒:

          application:set_env(tsung_controller, dumpstats_interval, 5000).
          

          執(zhí)行之后,會立刻生效。

          小結(jié)

          總結(jié)了Tsung主從監(jiān)控,以及服務(wù)器端監(jiān)控部分,以及運(yùn)行時監(jiān)控等。提供的被壓測服務(wù)器監(jiān)控功能很粗,僅收集CPU、內(nèi)存、負(fù)載、接收數(shù)據(jù)等類型峰值,具有一般參考意義。但基于Tsung構(gòu)建的、或類似商業(yè)產(chǎn)品,一般會有提供專門數(shù)據(jù)收集服務(wù)器,但對于開源的應(yīng)用而言,需要兼顧通用需求,也是能夠理解的。

          posted on 2016-07-29 08:49 nieyong 閱讀(4007) 評論(0)  編輯  收藏 所屬分類: 壓測

          公告

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

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

          導(dǎo)航

          <2016年7月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          統(tǒng)計

          常用鏈接

          留言簿(58)

          隨筆分類(130)

          隨筆檔案(151)

          個人收藏

          最新隨筆

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 新巴尔虎右旗| 安阳市| 双桥区| 嫩江县| 安平县| 廉江市| 乡宁县| 蓬安县| 苏州市| 田阳县| 清徐县| 湖南省| 忻城县| 前郭尔| 沙坪坝区| 泽州县| 漳浦县| 浦北县| 广元市| 台江县| 商南县| 油尖旺区| 鲜城| 香格里拉县| 忻州市| 杂多县| 邛崃市| 徐闻县| 兴化市| 睢宁县| 昭觉县| 会昌县| 香港| 田阳县| 新绛县| 自治县| 高邑县| 渝北区| 陇川县| 和平区| 霍山县|