當前位置:商標查詢大全網 - 健康百科 - 如何生成每秒百萬級別的 HTTP 請求

如何生成每秒百萬級別的 HTTP 請求

在進行負責測試時要牢記壹件重要的事:妳能在 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 秒。

httperf --hog --server=192.168.122.10 --wsess=100000,5,2 --rate 1000 --timeout 5

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 個連接:

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),那麽請建立之。

yum -y install erlang perl perl-RRD-**.noarch perl-Log-Log4perl-RRDs.noarch gnuplot perl-Template-Toolkit firefox

從 Github 或者 Tsung 的官網上下載最新的 Tsung。

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

解壓並且編譯。

tar zxfv tsung-1.4.2.tar.gz

cd tsung-1.4.2

./configure && make && make install

把示例配置復制到 ~/.tsung 目錄裏。這是 Tsung 的配置文件和日誌文件的存放地方。

cp /usr/share/doc/tsung/examples/http_**.xml /root/.tsung/tsung.xml

妳可以根據妳的需求去編輯這個配置文件,或者使用我的配置文件。經過大量的嘗試以及失敗後,我目前的配置文件在使用 7 個分布式節點時可以每秒產生 5 百萬個 HTTP 請求。

<?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>