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)計分析使用。
?
- ts_client模塊調(diào)用ts_mon,而ts_mon又直接調(diào)用ts_mon_cache,有些繞,不直觀(邏輯層面可忽略掉ts_mon)
- count為計數(shù)器,sum表示各項累加值,sample和sample_counter計算一次統(tǒng)計項的平均值&標(biāo)準(zhǔn)差
- tsung.dump文件一般不會創(chuàng)建&寫入,除非你在tsung.xml文件中指定需要dump屬性為true,壓測數(shù)據(jù)量大時這個會影響性能
match.log僅僅針對HTTP請求,默認(rèn)不會寫入,除非在HTTP壓測指定
<http url="/" method="GET" version="1.1"/> <match do=’log’ when=’match’ name=’http_match_200ok’>200OK</match>
從節(jié)點(diǎn)tsung client所記錄日志、需要dump的請求-響應(yīng)數(shù)據(jù),都會交由tsung_controller處理
ts_mon_cache,接收到數(shù)據(jù)統(tǒng)計內(nèi)存計算,每500毫秒周期分發(fā)給后續(xù)模塊,起到緩沖作用
ts_stats_mon模塊接收數(shù)據(jù)進(jìn)行內(nèi)存計算,結(jié)果寫入由ts_mon觸發(fā)
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)行時修改
tsung.log文件匯集了客戶端連接、請求、完整會話、頁面以及每一項的sum操作統(tǒng)計的完整記錄,后續(xù)perl腳本報表分析基于此
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_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包裝日志記錄,需要一個步驟:
- 設(shè)置輸出到文件系統(tǒng)中
error_logger:tty(false)
- 設(shè)定輸出的文件目錄
error_logger:logfile({open, LogFile})
- 包裝日志輸出接口
?DEBUG/?DEBUGF/?LOG/?LOGF/
- 最終調(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)列表
- 若是IP形式,
- 啟動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
- tsung client端產(chǎn)生日志單獨(dú)存放,格式為
如何診斷/監(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ù)雜:
- 每一個運(yùn)行tsung的服務(wù)器拷貝已經(jīng)編譯完成的recon項目到指定目錄
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) 編輯 收藏 所屬分類: 壓測