摘要: ### 前言在前面幾篇本文中我們其他的標題了從代碼到發佈的持續傳遞的程序,但是在很多複雜的系統上線前都得會進行效能測試,通過效能測試來進行容量規劃,系統的瓶頸檢測,強固檢查,高負載的強度測試,從而更好的許諾商務的持續傳遞流程。還記得第一次聽說效能測試這個詞是在大學二年
前言
在前面幾篇本文中我們其他的標題了從代碼到發佈的持續傳遞的程序,但是在很多複雜的系統上線前都得會進行效能測試,通過效能測試來進行容量規劃,系統的瓶頸檢測,強固檢查,高負載的強度測試,從而更好的許諾商務的持續傳遞流程。
還記得第一次聽說效能測試這個詞是在大學二年級,剛剛進入實驗室,老師將一本LoadRunner的書籍放在桌子上,告訴我用這個工具測試下學校課程網站的效能。相當長的時間內,對效能測試的理解就是用一個類似LoadRunner的工具,然後通過工具得出一些指標,就可以交工了。但是實際上效能測試是一類測試的統稱,而壓力測試是最常見的效能測試的一種,效能測試(廣義)還包括負載測試、並行測試、強固測試等等。
在本文中,今天主要討論的是壓力測試、負載測試與並行測試,對於大部分的套用來講,這三種測試已經可以滿足基本的需求了。
效能測試的分類
負載測試
負載測試的目標是確定並確保系統在超出最大預期投入量的情況下仍能正常執行。此外,負載測試還要評定效能特徵。例如,回應時間、交易處理速率和其他與時間相關的方面。在一些高並行的場景中,負載測試是測試在極限情況下系統的容量的最常見的做法,通過不斷對系統新增壓力,直到系統出現某些資源耗盡,例如CPU或者網路頻寬。通常情況下要求被測系統與線上系統的環境保留一致,如果不能保留一致,那麼可以通過模擬擬合的方式進行估算。舉一個簡單的例子,如果線上的設定64C64G的ECS,但是我們目前只能找到2C2G、4C4G、8C8G的ECS,那麼我們可以在不同的線性設定上面進行負載測試,並通過得出的負載曲線進行估算。
壓力測試
壓力測試也叫強度測試,是指系統在預設的負載範圍內,例如CPU滿載、記憶體飽和等情況下,系統對於測試場景的反應能力,和負載測試不同的是,壓力測試並不是傾向於探尋超出預期的極限上限,其他的是在容量規劃內,去許諾系統的可用工時。所以通常情況下會先進行負載測試,再根據負載測試的結果,指定壓力測試的方案。
並行測試
並行測試是通過模擬用戶的並行存取,測試多個用戶並行存取同一個套用、同一個模組甚至同一條記錄等等場景下,商務邏輯鎖是否有洩漏、記憶體是否有洩漏、資源是否有互鎖等等。這種測試方式更傾向於發現實際執行中系統隱藏的問題。
微服務場景下的效能測試
微服務架構成為了越來越多開發人員進行系統分割與系統重構的第一選擇,雖然微服務在開發圖樣、反覆運算速度等方面有非常大的優勢,但是微服務也帶來了很多的挑戰。當微服務遇到效能測試的時候,會有哪些不同呢。
在一個單體的套用中,效能測試非常簡單,只需要設定測試規則以及相應的測試端點,剩下大部分只需要通過測試載入器即可完成效能測試。但是當一個單體套用分割成了多個微服務的時候,如果我們依舊只用黑箱的方式進行效能測試,從系統的最外側的端點進行測試,那麼就會像一個有短板的木桶一樣,這個系統中,裝載能力最低的微服務就會成為系統的測試結果的基準。面對微服務架構的挑戰,效能測試也應該是更細細微性的,應該是既有自頂向下的類黑箱測試,也應該有對每一個微服務的效能測試。而且還可以通過類似zipkin這種分散式追蹤的工具實現微服務系統中瓶頸的子服務,具體的實現在本文中就不過多的贅述了。
在阿裡雲容器服務上進行效能測試
效能測試工具有非常多的選擇,比如大名鼎鼎的apacheab、Jmeter、gatling等等。在本文中我們的選擇是Tsung,Tsung是基於Erlang構建一個分散式的效能測試工具,支援HTTP/HTTPS、UDP、MQTT、WebSocket等合約,支援分散式的壓力測試,支援生成報表與結果,是非常適合容器場景的一個壓力測試的選擇。
Tsung本身是一個基於ErlangOTP的主從結構的系統,主節點可以產生壓力並分發任務,從節點可以接收任務,並產生壓力。Tsung的使用方式非常簡單,只需要一個XML的設定檔,即可執行。下面我們來看一個簡單的設定檔:
大家只需要記住幾個關鍵的欄位的含義即可
欄位 |
含義 |
client |
是執行任務產生壓力的執行者,通常設定hostname或者IP |
servers |
設定壓測的位址 |
load |
負載相關的設定 |
options |
設定壓測內容相關的選項,例如session或者user agent等 |
簡單的效能測試
下面我們做一個最簡單的負載測試,只跑一個Tsung的master節點,對一個特定的URL進行負載測試。
compose檔案如下:
tsung-single:
image: "registry.cn-hangzhou.aliyuncs.com/ringtail/tsung:v1.0"
volumes:
- '/root/sample.xml:/root/.tsung/tsung.xml'
- '/var/lib/docker/tsung:/root/.tsung/log'
labels:
aliyun.routing.port_8091: tsung
command: single
sample.xml的設定如下:
<tsung loglevel="notice" version="1.0">
<clients>
<client host="localhost" use_controller_vm="true"/>
</clients>
<servers>
<server host="測試的網域名稱與位址" port="80" type="tcp"/>
</servers>
<load duration="5" unit="minute">
<arrivalphase phase="1" duration="5" unit="minute">
<users interarrival="0.1" unit="second"/>
</arrivalphase>
</load>
<options>
<option type="ts_http" name="user_agent">
<user_agent probability="80">
Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050513 Galeon/1.3.21
</user_agent>
<user_agent probability="20">
Mozilla/5.0 (Windows; U; Windows NT 5.2; fr-FR; rv:1.7.8) Gecko/20050511 Firefox/1.0.4
</user_agent>
</option>
</options>
<sessions>
<session name="http-example" probability="100" type="ts_http">
<request>
<http url="/" method="GET" version="1.1"/>
</request>
</session>
</sessions>
</tsung>
套用部署完成,點選暴漏的路由位址
存取Tsung提供的web主控台,其中Active nodes的數目為1,目前只有master一個節點。
點選右上方的功能表列,可以查看更詳細的圖表與資料
分散式效能測試
只使用Master一個節點進行壓力可能對於某些場景來講是不夠用的,我們可能需要分散式的效能測試來開啟洪荒之力。對於Tsung來講,分散式壓力測試是非常簡單的一件事情。只需要讓從節點可以從主節點進行SSH免登,並且從節點上面安裝Tsung即可,主節點只需要新增一行代碼即可完成一個分散式的設定就是在clients的下面加上從節點的設定即可。
<clients>
<client host="localhost" use_controller_vm="true"/>
<client host="tsung-client" use_controller_vm="true"/>
</clients>
要做到主節點與從節點SSH免登打通,需要生成一對SSHkey pair。
//在本地執行,兩個引號表示無需輸入密碼
ssh-keygen -t rsa -P""
指令執行完了可以發現生成了一對ssh秘鑰對,id_rsa與id_rsa.pub,我們將生成的私密金鑰通過volume的方式掛載到主節點中,將公開金鑰通過環境變數的方式傳遞到從節點中,compose檔案如下:
tsung-master:
image: "registry.cn-hangzhou.aliyuncs.com/ringtail/tsung:v1.0"
volumes:
- '/mnt/acs_mnt/ossfs/cs-volume/sample.xml:/root/.tsung/tsung.xml'
- '/var/lib/docker/tsung:/root/.tsung/log'
- '/mnt/acs_mnt/ossfs/cs-volume/id_rsa:/root/.ssh/id_rsa'
environment:
- DISABLE_HOST_CHECK= true#免用戶輸入yes
labels:
aliyun.routing.port_8091: tsung
command: "master"
links:
- "tsung-slave:tsung-slave"#可不適用link,直接使用hostname
tsung-slave:
image: "registry.cn-hangzhou.aliyuncs.com/ringtail/tsung:v1.0"
command: "slave"
environment:
- AUTHORIZED_KEYS=<公開金鑰內容> #cat ~/.ssh/id_rsa.pub
最後將從節點的HOSTNAME設定到sample.xml中。
<tsung loglevel="notice" version="1.0">
<clients>
<client host="localhost" use_controller_vm="true"/>
<client host="tsung-client" use_controller_vm="true"/>
</clients>
<servers>
<server host="hiluo.cn" port="80" type="tcp"/>
</servers>
<load duration="5" unit="minute">
<arrivalphase phase="1" duration="5" unit="minute">
<users interarrival="0.1" unit="second"/>
</arrivalphase>
</load>
<options>
<option type="ts_http" name="user_agent">A
<user_agent probability="80">
Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050513 Galeon/1.3.21
</user_agent>
<user_agent probability="20">
Mozilla/5.0 (Windows; U; Windows NT 5.2; fr-FR; rv:1.7.8) Gecko/20050511 Firefox/1.0.4
</user_agent>
</option>
</options>
<sessions>
<session name="http-example" probability="100" type="ts_http">
<request>
<http url="/" method="GET" version="1.1"/>
</request>
</session>
</sessions>
</tsung>
進行部署,開始測試,可以發現Activenodes的數目變成了2個,也提供了更強大的壓力。
最後
效能測試不是目的,其他的是為了在上線前進行問題的發現與效能的調優。常見的一個標準流程是先進行負載測試,然後根據負責測試的結果,進行壓力測試的場景指定,進行容量假設與容量規劃。有的系統還會進行並行測試。常見的系統調優方式有USE方法、推測變動訛方法、AdHoc核對清單法等等。具體的內容在本文中就不過與贅述了,只需要記住效能測試的目的是為發現問題、調優系統、容量規劃,而不是單純的使用一個工具,用盡洪荒之力得到一個沒有商務場景與支援的資料,其他的是要用效能測試提供資料,並根據特定場景下的資料進行決策。
在本文中我們只是討論了Tsung的最基本的用法,包括單點負載測試與分散式負載測試,阿裡雲容器服務針對微服務的場景提供了非常多的能力,在下一篇本文中,我們會針對微服務場景下效能測試進行剖析,提供更有針對性的效能測試與調優的方案。
參考本文與資料
<在做效能測試前需要知道什麼>位址
<在做效能測試之後需要知道什麼>位址
<效能之巔洞悉系統、企業與雲端運算>Brendan Gregg
SSH免登github位址
Tsung的Dockerfilegithub位址
相關產品:
- 容器服務(Docker)
- 巨量資料計算服務(MaxCompute)
- 企業級分散式套用服務
- 雲端服務器ECS