FW 每秒百万级别的 HTTP 请求 sung: 重型的(heavy-duty)、分布式的、多协议测试工具...
本文是構建能夠每秒處理 3 百萬請求的高性能 Web?集群系列文章的第一篇。它記錄了我使用負載生成器工具的一些經歷,希望它能幫助每一個像我一樣不得不使用這些工具的人節省時間。
負載生成器是一些生成用于測試的流量的程序。它們可以向你展示服務器在高負載的情況下的性能,以及讓你能夠找出服務器可能存在的問題。通過負載測試了解服務器的缺點,是測試服務器彈性以及未雨綢繆的好方法。
負載生成工具(Load-Generating Tools)
在進行負責測試時要牢記一件重要的事:你能在 Linux 上建立多少個 socket 連接。這個限制是硬編碼在內核里的,最典型的就是臨時 W 端口的限制。(在某種程度上)你可以在 /etc/sysctl.conf 里擴展它。但是基本上,一臺 Linux 機器只能同時打開大約 64,000 個 socket 。因此在負載測試時,我們不得不通過在單一的連接上盡可能多地發出請求來充分利用 socket 。 除此之外,我們還需要不止一臺的機器來產生負載。否則,負載生成器會把可用的 socket 占用導致不能產生足夠的負載。
我一開始用的是‘ab’,Apache Bench 。它是我所知道的 http 基準測試工具中最簡單、最通用的。并且它是 Apache 附帶的產品,因此它可能已經存在于你的系統中。不幸的是,我在使用它的時候每秒大約只能生成 900 個請求。雖然我見過其他人使用它每秒能達到 2,000 個請求,但我可以立即告訴你,‘ab’并不適合我們的基準測試。
Httperf
接著,我嘗試了 ‘httperf’。這個工具更強大,但是它依然相對簡單并且功能有限。要算出每秒生產了多少個請求并不是僅傳遞參數那么簡單。經過我的多次嘗試,獲取了每秒超過幾百請求的結果。例如:
它以每秒 1,000 個的速率創建了 100,000 個會話(session)。每次會話發起 5 次請求,時間間隔為 2 秒。
| 1 | httperf --hog --server=192.168.122.10 --wsess=100000,5,2 --rate 1000 --timeout 5 |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | Total: connections 117557 requests 219121 replies 116697 test-duration 111.423 s Connection rate: 1055.0 conn/s (0.9 ms/conn, <=1022 concurrent connections) Connection time [ms]: min 0.3 avg 865.9 max 7912.5 median 459.5 stddev 993.1 Connection time [ms]: connect 31.1 Connection length [replies/conn]: 1.000 Request rate: 1966.6 req/s (0.5 ms/req) Request size [B]: 91.0 Reply rate [replies/s]: min 59.4 avg 1060.3 max 1639.7 stddev 475.2 (22 samples) Reply time [ms]: response 56.3 transfer 0.0 Reply size [B]: header 267.0 content 18.0 footer 0.0 (total 285.0) Reply status: 1xx=0 2xx=116697 3xx=0 4xx=0 5xx=0 CPU time [s]: user 9.68 system 101.72 (user 8.7% system 91.3% total 100.0%) Net I/O: 467.5 KB/s (3.8*10^6 bps) |
最終,我使用這些設置達到了每秒 6,622 個連接:
| 1 | httperf --hog --server 192.168.122.10 --num-conn 100000 --ra 20000 --timeout 5 |
(總共創建了 100,000 個連接,并且以每秒 20,000 個連接的固定速率創建)
它還有一些潛在的優勢,并且擁有比‘ab‘更多的特性。但它不是我要用在這個項目里的重量級工具。我需要的是能夠支持分布式多負載測試節點的工具。因此,我的下一個嘗試是:Jmeter。
Apache Jmeter
這是一個功能齊全的 web 應用測試套件,它可以模擬真實用戶的所有行為。你可以使用 Jmeter 的代理去訪問你的網站,進行點擊、登陸、模仿用戶可以做的所有行為。Jemeter 會把這些行為記錄下來作為測試用例。然后 Jmeter 會反復執行這些動作來模擬你想要的用戶數量。盡管配置?Jmeter 比 ‘ab‘ 和 ’httperf‘ 復雜得多,但它是一個很有趣的工具!
根據我的測試,它每秒可以產生 14,000 個請求!這絕對是一個好的進展。
我使用了?Googlle Code project?上的一些插件,并且使用它們的“Stepping Threads”和“HTTP RAW”請求,最終每秒大約可以產生 30,000 個請求!但這已經達到極限了,所以還要尋找另一個工具。這里有一個我之前的?Jmeter 配置,希望可以幫助到其他人。雖然這個配置離完美相差甚遠,但有時它可以滿足你的要求。
Tsung: 重型的(heavy-duty)、分布式的、多協議測試工具
它每秒基本可以產生 40,000 個請求,這絕對是我們想要的工具。類似于 Jmeter,你可以把一些行為記錄下來在測試時運行,并且可以測試大多數的協議。比如 SSL、HHTP、WebDAV、SOAP、PostgreSQL、MySQL、LDAP 和 Jabber/XMPP。與 Jmeter 不同的是,它沒有讓人感到迷茫的 GUI 設置,它僅有一個 XML 配置文件,和一些你選擇的分布式節點的 SSH 密鑰。它的簡潔和效率對我的吸引力,完全不亞于它的健壯性和可擴展性。我發現它是一個很強大的工具,在正確的配置下它可以每秒產生百萬級的 HTTP 請求。
除此之外,Tsung 還可以在 html 上產生圖表以及輸入你的測試的詳細報告。測試的結果通俗易懂,并且你甚至可以把這些圖片展示給你的 boss 看!
在這個系列文章的剩余部分,我還會講解這個工具。現在你可以繼續瀏覽下面的配置說明,或者直接跳到下一頁。
在 CentOS 6.2 上安裝 Tsung
首先,你要安裝(Erlang 需要的) EPEL 源。因此,在進行下一步之前要把它安裝好。安裝完后,繼續安裝你用來產生負載的每個節點需要的包。如果你還沒有在節點之間建立無密碼 SSH 密鑰(passwordless SSH key),那么請建立之。
| 1 | yum -y install erlang perl perl-RRD-Simple.noarch perl-Log-Log4perl-RRDs.noarch gnuplot perl-Template-Toolkit firefox |
從 Github 或者 Tsung 的官網上下載最新的 Tsung。
| 1 | wget http://tsung.erlang-projects.org/dist/tsung-1.4.2.tar.gz |
解壓并且編譯。
| 1 2 3 | tar zxfv? tsung-1.4.2.tar.gz cd tsung-1.4.2 ./configure && make && make install |
把示例配置復制到 ~/.tsung 目錄里。這是 Tsung 的配置文件和日志文件的存放地方。
| 1 | cp? /usr/share/doc/tsung/examples/http_simple.xml /root/.tsung/tsung.xml |
你可以根據你的需求去編輯這個配置文件,或者使用我的配置文件。經過大量的嘗試以及失敗后,我目前的配置文件在使用 7 個分布式節點時可以每秒產生 5 百萬個 HTTP 請求。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | <?xml version="1.0"?> <!DOCTYPE tsung SYSTEM "/usr/share/tsung/tsung-1.0.dtd"> <tsung loglevel="notice" version="1.0"> <clients> <client host="localhost" weight="1" cpu="10" maxusers="40000"> <ip value="192.168.122.2"/> </client> <client host="loadnode1" weight="1" cpu="9" maxusers="40000"> <ip value="192.168.122.2"/> </client> <client host="loadnode2" weight="1" maxusers="40000" cpu="8"> <ip value="192.168.122.3"/> </client> <client host="loadnode3" weight="1" maxusers="40000" cpu="9"> <ip value="192.168.122.21"/> </client> <client host="loadnode4" weight="1" maxusers="40000" cpu="9"> <ip value="192.168.122.11"/> </client> <client host="loadnode5" weight="1" maxusers="40000" cpu="9"> <ip value="192.168.122.12"/> </client> <client host="loadnode6" weight="1" maxusers="40000" cpu="9"> <ip value="192.168.122.13"/> </client> <client host="loadnode7" weight="1" maxusers="40000" cpu="9"> <ip value="192.168.122.14"/> </client> </clients> <servers> <server host="192.168.122.10" port="80" type="tcp"/> </servers> <load> <arrivalphase phase="1" duration="10" unit="minute"> <users maxnumber="15000" arrivalrate="8" unit="second"/> </arrivalphase> <arrivalphase phase="2" duration="10" unit="minute"> <users maxnumber="15000" arrivalrate="8" unit="second"/> </arrivalphase> <arrivalphase phase="3" duration="30" unit="minute"> <users maxnumber="20000" arrivalrate="3" unit="second"/> </arrivalphase> </load> <sessions> <session probability="100" name="ab" type="ts_http"> <for from="1" to="10000000" var="i"> <request> <http url="/test.txt" method="GET" version="1.1"/> </request> </for> </session> </sessions> </tsung> |
剛開始的時候有很多東西要理解,但你一旦理解了它們后就會變得很簡單。
- <client> 只是簡單地指定了運行 Tsung 的主機。你可以指定 Tsung 使用的 IP 和 CPU 的最大數。你可以使用 maxusers 設置節點能夠模擬的用戶數量上限。每一個用戶都會執行我們之后定義的操作。
- <servers> 指定了你要測試的 HTTP 服務器。我們可以使用這個選項去測試一個 IP 集群,或者一個單一的服務器。
- <load> 定義了我們的模擬用戶將會在什么時候“到達”我們的網站。以及它們達到的有多快。
- ?<arrivalphase> 在持續了 10 分鐘的第一個階段里,以 每秒 8 個用戶的速率到達了 15,000 個用戶。
- <arrivalphase phase=”1″ duration=”10″ unit=”minute”>
- <users maxnumber=”15000″ arrivalrate=”8″ unit=”second”/>
- ?這里還有兩個 arrivalphases,它們的用戶都以同樣的方式達到。
- ?這些 arrivalphases 一起組成了一個 <load>,它控制了我們可以每秒產生多少個請求。
- <session> 這部分定義了一旦這些用戶達到了你的網站,它們將會執行什么動作。
- probability 允許你定義用戶可能會做的隨機事件。有時他們可能點擊這里,有時他們可能點擊那里。所有的Probability 加起來一定要等于 100% 。
- 在上面的配置里,用戶只做一件事,所以它的 probability 等于 100% 。
- <for from=”1″ to=”10000000″ var=”i”> 這就是用戶在 100% 的時間里做的事情。它們循環遍歷 10,000,000 次并且 <request> 一個網頁:/test.txt 。
- 這個循環結構允許我們使用少量的用戶連接去獲取比較大的每秒請求數量。
一旦你已經很好地理解了它們,你就可以創建一個便利的別名,去快速觀察 Tsung 報告。
| 1 2 | vim ~/.bashrc alias treport="/usr/lib/tsung/bin/tsung_stats.pl; firefox report.html" |
| 1 | source ~/.bashrc |
然后啟動 Tsung
| 1 2 3 | [root@loadnode1 ~] tsung start Starting Tsung "Log directory is: /root/.tsung/log/20120421-1004" |
結束后觀察報告
| 1 2 | cd /root/.tsung/log/20120421-1004 treport |
使用 Tsung 去規劃你的集群構造
現在我們擁有了一個足夠強大的負載測試工具,我們可以規劃余下的集群構造了:
1. 使用 Tsung 去測試一個單一的 HTTP 服務器。獲取一個基本的基準。
2. 對 web 服務器進行調優,定期使用 Tsung 進行測試提高性能。
3. 對這些系統的 TCP 套接字進行調優,獲取最佳的網絡性能。再來一次,測試,測試,不停地測試。
4. 構造 LVS 集群,它包含了這些充分調優過的 web 服務器。
5. 使用 Tsung IP 集群對 LVS 進行壓力測試。
在之后的兩篇文章里,我將會向你展示如何使你的 web 服務器獲取最高性能,以及怎樣用 LVS 集群軟件把它們整合起來。
轉載于:https://www.cnblogs.com/SZLLQ2000/p/4580239.html
總結
以上是生活随笔為你收集整理的FW 每秒百万级别的 HTTP 请求 sung: 重型的(heavy-duty)、分布式的、多协议测试工具...的全部內容,希望文章能夠幫你解決所遇到的問題。