<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)滴滴。

    Tsung筆記之插件編寫篇

    前言

    Tsung對(duì)具體協(xié)議、通道的支持,一般以插件形式提供接口,接口不是很復(fù)雜,插件也很容易編寫,支持協(xié)議多,也就不足為怪了。

    下面首先梳理一下當(dāng)前Tsung 1.6.0所有內(nèi)置插件,然后為一個(gè)名稱為Qmsg的私有二進(jìn)制協(xié)議編寫插件, 運(yùn)行Qmsg服務(wù)器端程序,執(zhí)行壓力測(cè)試,最后查看測(cè)試報(bào)告。

    已支持插件梳理

    Tsung 1.6.0支持的協(xié)議很多,簡(jiǎn)單梳理一下:

    Tsung Controller  Support Plugins V2-1?

    • 壓測(cè)的協(xié)議首先需要支持xml形式配置,配置內(nèi)容需要 tsung_config_protocolname 模塊解析
      • 存放在tsung_controller目錄下
    • 其次是tsung client端也要插件 ts_protocolname 模塊支持?jǐn)?shù)據(jù)操作
      • 存放在tsung目錄下
    • 同時(shí)在tsung項(xiàng)目examples目錄下也給出了已支持協(xié)議配置簡(jiǎn)單示范xml文件

    已經(jīng)支持協(xié)議簡(jiǎn)單說明:

    1. amqp,Advanced Message Queuing Protocol縮寫,只要支持高級(jí)消息隊(duì)列協(xié)議的應(yīng)用,都可以用來做壓測(cè),比如RabbitMQ,ActiveMQ等
    2. http,基本協(xié)議,構(gòu)建于HTTP協(xié)議之上的,還有類似于BOSH,WebDav等上層業(yè)務(wù)協(xié)議
    3. jabber,也稱之為XMPP,支持的相當(dāng)豐富,除了TCP/SSl,還可以通過Websocekt進(jìn)行傳遞
    4. raw,針對(duì)原始類型消息,不做編解碼處理,直接在TCP / UDP / SSL等傳輸層中傳遞,這個(gè)對(duì)部分私有協(xié)議,比較友好,不用寫單獨(dú)的編解碼處理,直接透?jìng)骱昧?/li>
    5. shell,針對(duì)LInux/Unix終端命令調(diào)用進(jìn)行壓測(cè),這種場(chǎng)景比較小眾
    6. fs,filesystem縮寫,針對(duì)文件系統(tǒng)的讀寫性能進(jìn)行壓測(cè)
    7. job,針對(duì)任務(wù)調(diào)度程序進(jìn)行的壓測(cè),比如PBS/torqueLSF、OAR等

    Tsung插件工作機(jī)制

    粗一點(diǎn)來看Tsung插件的工作流程(點(diǎn)擊可以看大圖):

    tsung_qmsg_flo?

    放大一些(引用 hncscwc 博客圖片,相當(dāng)贊!):

    為什么要編寫插件

    Tsung針對(duì)通用協(xié)議有支持,若是私有或不那么通用的協(xié)議,就不會(huì)有專門的插件支持了,那么可選的有兩條路子:

    • 使用raw模式發(fā)送原始消息,需要自行組裝
    • 自己編寫插件,靈活處理編解碼

    既然談到了插件,我們也編寫一個(gè)插件也體驗(yàn)一下編寫插件的過程。

    Qmsg協(xié)議定義

    假設(shè)一個(gè)虛擬場(chǎng)景,打造一個(gè)新的協(xié)議Qmsg,二進(jìn)制格式組成:

    qmsg_protoco?

    這種隨意假象出來的格式,不妨稱作為qmsg(Q可愛形式的message)協(xié)議,僅作為Demo演示而存在。簡(jiǎn)單場(chǎng)景:

    • 用戶發(fā)言,包含用戶id和發(fā)言內(nèi)容
      • User ID,32位自然數(shù)類型
      • 發(fā)言為文字內(nèi)容,字符串形式,長度不固定
      • 組裝后的請(qǐng)求體為二進(jìn)制協(xié)議格式
      • PocketLen:**##UserId + UserComment##**
    • 服務(wù)器端返回用戶ID和一個(gè)幸運(yùn)數(shù)字(32位表示)
      • PocketLen:**##UserId + RandomCode##**

    為了卡哇伊一些,多了一些點(diǎn)綴的“**####**”符號(hào)。

    編寫一個(gè)完整插件

    這里基于Tsung 1.6.0版本構(gòu)建一個(gè)Qmsg插件,假定你懂一些Erlang代碼,以及熟悉Tsung一些基本概念。

    0. 創(chuàng)建一個(gè)項(xiàng)目

    要?jiǎng)?chuàng)建Tsung的一個(gè)Qmsg插件項(xiàng)目,雖沒有固定規(guī)范,但按照已有格式組織好代碼層級(jí)也是有必要的。

    ├── include
    │?? └── ts_qmsg.hrl
    ├── src
    │?? ├── tsung
    │?? │?? └── ts_qmsg.erl
    │?? └── tsung_controller
    │??     └── ts_config_qmsg.erl
    └── tsung-1.0.dtd
    

    1. 創(chuàng)建配置文件

    Tsung的壓測(cè)以xml文件驅(qū)動(dòng),因此需要界定一個(gè)Qmsg插件形式的完整會(huì)話的XML呈現(xiàn),比如:

    <session probability="100" name="qmsg-demo" type="ts_qmsg">
        <request>
          <qmsg uid="1001">Hello Tsung Plugin</qmsg>
        </request>
    
        <request>
          <qmsg uid="1002">This is a Tsung Plugin</qmsg>
        </request>
    </session>
    
    • ts_qmsg,會(huì)話類型所依賴協(xié)議模擬客戶端實(shí)現(xiàn)
    • <qmsg uid="Number">Text</qmsg> 定義了qmsg會(huì)話可配置形式,內(nèi)嵌在request元素內(nèi)
    • uid為屬性

    此時(shí),你若直接在xml文件中編輯,會(huì)遇到校驗(yàn)錯(cuò)誤。

    2. 更新DTD文件

    Tsung的xml文件依賴tsung-1.0.dtd文件進(jìn)行校驗(yàn)配置是否有誤,需要做對(duì)DTD文件做修改,以支持所添加新的協(xié)議。

    tsung-1.0.dtd項(xiàng)目中,最小支持:

    1. session元素type屬性中添加上 ts_qmsg
    2. request元素處添加 qmsg : <!ELEMENT request ( match*, dyn_variable*, ( http | jabber | raw | pgsql | ldap | mysql |fs | shell | job | websocket | amqp | mqtt | qmsg) )>
    3. 添加qmsg元素定義:
    <!ELEMENT qmsg (#PCDATA) >
    <!ATTLIST qmsg
        uid         CDATA   "0"
        ack         (local | no_ack | parse) #REQUIRED
        >
    

    完整內(nèi)容,可參考tsung_plugin_demo/tsung-1.0.dtd文件。

    3. 頭文件 include/ts_qmsg.hrl

    頭文件include/ts_qmsg.hrl定義數(shù)據(jù)保存的結(jié)構(gòu)(也稱之為記錄/record):

    -record(qmsg_request, {
              uid,
              data
             }).
    
    -record(qmsg_dyndata, {
              none
             }
           ).
    
    1. qmsg_request: 存儲(chǔ)從xml文件解析的qmsg請(qǐng)求數(shù)據(jù),用于生成壓力請(qǐng)求
    2. qmsg_dyndata: 存儲(chǔ)動(dòng)態(tài)參數(shù)(當(dāng)前暫未使用到)

    4. XML文件解析

    ts_config_qmsg.erl文件,用于解析和協(xié)議Qmsg關(guān)聯(lián)的配置:
    - 只需要實(shí)現(xiàn)parse_config/2唯一方法
    - 解析xml文件中所配置Qmsg協(xié)議請(qǐng)求相關(guān)配置
    - 被ts_config:parse/1在遇到Qmsg協(xié)議配置時(shí)調(diào)用

    備注:

    1. 若要支持動(dòng)態(tài)替換,需要的字段以字符串形式讀和存儲(chǔ)

    5. ts_qmsg.erl

    ts_qmsg.erl模塊主要提供Qmsg協(xié)議的編解碼的完整動(dòng)作, 以及當(dāng)前協(xié)議界定下的用戶會(huì)話屬性設(shè)定。

    首先需要實(shí)現(xiàn)接口ts_plugin規(guī)范定義的所有需要函數(shù),定義了參數(shù)值和返回值。

    -behavior(ts_plugin).
    
    ...
    
    -export([add_dynparams/4,
             get_message/2,
             session_defaults/0,
             subst/2,
             parse/2,
             parse_bidi/2,
             dump/2,
             parse_config/2,
             decode_buffer/2,
             new_session/0]).
    

    相對(duì)來說,核心為協(xié)議的編解碼功能:

    • get_message/2,構(gòu)造請(qǐng)求數(shù)據(jù),編碼成二進(jìn)制,上層ts_client模塊通過Socket連接發(fā)送給目標(biāo)服務(wù)器
    • parse/2,(當(dāng)對(duì)響應(yīng)作出校驗(yàn)時(shí))從原始Socket上返回的數(shù)據(jù)進(jìn)行解碼,取出協(xié)議定義業(yè)務(wù)內(nèi)容

    這部分代碼可以參考 tsung_plugin_demo/src/tsung/ts_client.erl 文件。

    6. 如何編譯

    雖然理論上可以單獨(dú)編,生成的beam文件直接拷貝到已經(jīng)安裝的tsung對(duì)應(yīng)目錄下面,但實(shí)際上插件編寫過程中要依賴多個(gè)tsung的hrl文件,這造成了依賴路徑問題。采用直接和tsung打包一起部署,實(shí)際操作上有些麻煩,

    為了節(jié)省體力,使用一個(gè)shell腳本 - build_plugin.sh,方便快速編譯、部署:

    # !/bin/bash
    
    cp tsung-1.0.dtd $1/
    cp include/ts_qmsg.hrl $1/include/
    cp src/tsung_controller/ts_config_qmsg.erl $1/src/tsung_controller/
    cp src/tsung/ts_qmsg.erl $1/src/tsung/
    
    cd $1/
    make uninstall
    ./configure --prefix=/usr/local
    make install
    

    這里指定安裝Tsung的指定目錄為/usr/local,可以根據(jù)需要修改

    需要提前準(zhǔn)備好tsung-1.6.0目錄:

    wget http://tsung.erlang-projects.org/dist/tsung-1.6.0.tar.gz
    tar xf tsung-1.6.0.tar.gz
    

    在編譯Qmsg插件腳本時(shí), 指定一下tsung-1.6.0解壓后的路徑即可:

    sh build_plugin.sh /your_path/tsung-1.6.0
    

    后面嘛,就等著自動(dòng)編譯和安裝唄。

    啟動(dòng)Qmsg協(xié)議的壓測(cè)

    1. 首先啟動(dòng)Qmsg服務(wù)器端程序

    既然有壓測(cè)端,就需要一個(gè)Qmsg協(xié)議處理的后端程序qmsg_server.erl,用于接收客戶端請(qǐng)求,獲得用戶ID值之后,生成一個(gè)隨機(jī)數(shù)字,組裝成二進(jìn)制協(xié)議,然后發(fā)給客戶端,這就是全部功能。

    這個(gè)程序,簡(jiǎn)單一個(gè)文件,在 tsung_plugin_demo目錄下面,編譯運(yùn)行, 默認(rèn)監(jiān)聽5678端口:

    erlc qmsg_server.erl && erl -s qmsg_server start
    

    另外,還提供了一個(gè)手動(dòng)調(diào)用接口,方便在Erlang Shell端調(diào)試:

    %% 下面為
    qmsg_server:sendmsg(1001, "這里是用戶發(fā)言").
    
    

    啟動(dòng)之后,監(jiān)聽地址 *: 5678

    源碼見:tsung_plugin_demo/qmsg_server.erl

    2. 編寫Qmsg壓測(cè)XML配置文件

    因?yàn)槭茄菔臼痉叮慌_(tái)Linxu主機(jī)上就可以進(jìn)行了:

    • 連接本機(jī)的 127.0.0.1:5678
    • 最多產(chǎn)生10個(gè)用戶,每秒產(chǎn)生1個(gè),壓力負(fù)載設(shè)置的很低
    • 兩個(gè)不同類型會(huì)話,比重10% + 90% = 100%
    • qmsg-subst-example會(huì)話使用了用戶ID個(gè)和用戶發(fā)言內(nèi)容自動(dòng)生成機(jī)制
    <tsung loglevel="debug" dumptraffic="false" version="1.0">
      <clients>
        <client host="localhost" use_controller_vm="true"/>
      </clients>
    
      <servers>
        <server host="127.0.0.1" port="5678" type="tcp"/>
      </servers>
    
      <load>
        <arrivalphase phase="1" duration="1" unit="minute">
          <users maxnumber="10" interarrival="1" unit="second"/>
        </arrivalphase>
      </load>
    
      <sessions>
        <session probability="10" name="qmsg-example" type="ts_qmsg">
          <request>
            <qmsg uid="1001" ack="parse">Hello Tsung Plugin Qmsg!</qmsg>
          </request>
        </session>
        <session probability="90" name="qmsg-subst-example" type="ts_qmsg">
          <setdynvars sourcetype="random_number" start="3" end="32">
            <var name="random_uid"/>
          </setdynvars>
          <setdynvars sourcetype="random_string" length="13">
            <var name="random_txt"/>
          </setdynvars>
          <request subst="true">
            <qmsg uid="%%_random_uid%%" ack="parse">Haha : %%_random_txt%%</qmsg>
          </request>
          <thinktime value="6"/>
          <request subst="true">
            <qmsg uid="%%_random_uid%%" ack="parse">This is a Tsung Plugin</qmsg>
          </request>
        </session>
      </sessions>
    </tsung>
    

    這部分內(nèi)容,請(qǐng)參考 tsung_plugin_demo/tsung_qmsg.xml 文件。

    3. 執(zhí)行壓力測(cè)試

    當(dāng)Qmsg的壓力測(cè)試配置文件寫好之后,可以開始執(zhí)行壓力測(cè)試了:

    tsung -f tsung_qmsg.xml start
    

    其輸出:

    tarting Tsung
    Log directory is: /root/.tsung/log/20160621-1334
    [os_mon] memory supervisor port (memsup): Erlang has closed
    [os_mon] cpu supervisor port (cpu_sup): Erlang has closed
    

    其中, 其日志為:/root/.tsung/log/20160621-1334

    4. 查看壓測(cè)報(bào)告

    進(jìn)入其生成壓測(cè)日志目錄,然后生成報(bào)表,查看壓測(cè)結(jié)果哈:

    cd /root/.tsung/log/20160621-1334
    
    /usr/local/lib/tsung/bin/tsung_stats.pl
    
    echo "open your browser (URL: http://IP:8000/report.html) and vist the report now :))"
    /usr/bin/python -m SimpleHTTPServer
    

    嗯,打開你的瀏覽器,輸出所在服務(wù)器的IP地址,就可以看到壓測(cè)結(jié)果了。

    小結(jié)

    以上代碼已經(jīng)放入github倉庫:https://github.com/weibomobile/tsung_plugin_demo

    實(shí)際業(yè)務(wù)的私有協(xié)議內(nèi)容要比上面Demo出來的Qmsg復(fù)雜的多,但其私有協(xié)議插件編寫,如上面所述幾個(gè)步驟,按照規(guī)范編寫,單機(jī)測(cè)試,然后延伸到分布式集群,完整流程都是一致的。

    嗯,搞定了插件,就可以對(duì)系統(tǒng)愉快地進(jìn)行壓測(cè)了 :))

    posted on 2016-07-30 19:37 nieyong 閱讀(5146) 評(píng)論(0)  編輯  收藏 所屬分類: 壓測(cè)

    公告

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

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

    導(dǎo)航

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

    統(tǒng)計(jì)

    常用鏈接

    留言簿(58)

    隨筆分類(130)

    隨筆檔案(151)

    個(gè)人收藏

    最新隨筆

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲AV本道一区二区三区四区| 亚洲人成在线中文字幕| 99久在线国内在线播放免费观看| 亚洲制服在线观看| 免费中文字幕在线观看| 久久精品视频免费播放| 亚洲欧美日韩综合久久久久| 亚洲综合熟女久久久30p| ww亚洲ww在线观看国产| 亚洲成a人在线看天堂无码| 5555在线播放免费播放| 特级aaaaaaaaa毛片免费视频| 久久夜色精品国产噜噜亚洲AV| 国产男女猛烈无遮档免费视频网站| 精品视频一区二区三区免费| 亚洲性无码AV中文字幕| 亚洲av日韩av无码| 亚洲国产精品尤物YW在线观看| 亚洲国产精品免费在线观看| 无遮挡国产高潮视频免费观看 | 亚洲中文字幕日本无线码| 亚洲日韩精品无码专区网址| 国产成人免费网站| 国产精品免费观看调教网| 黄人成a动漫片免费网站| 91亚洲自偷在线观看国产馆| 亚洲精品午夜国产VA久久成人| 日韩免费无砖专区2020狼| 国产四虎免费精品视频| a毛片全部免费播放| MM1313亚洲精品无码久久| 亚洲人成黄网在线观看 | 国产亚洲人成在线影院| 亚洲国产日韩在线一区| 亚洲AV无码成人网站久久精品大 | 亚洲校园春色另类激情| 亚洲AV区无码字幕中文色 | 亚洲色大成网站www永久网站| 亚洲欧洲在线观看| 亚洲午夜久久久久妓女影院| 免费在线视频一区|