1. 程式人生 > >第一篇:如何生成每秒百萬級別的 HTTP 請求?

第一篇:如何生成每秒百萬級別的 HTTP 請求?



本文是構建能夠每秒處理 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 [[email protected] ~] 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 叢集軟體把它們整合起來。

相關推薦

第一如何生成百萬級別的 HTTP 請求

 本文是構建能夠每秒處理 3 百萬請求的高效能 Web 集群系列文章的第一篇。它記錄了我使用負載生成器工具的一些經歷,希望它能幫助每一個像我一樣不得不使用這些工具的人節省時間。 負載生成器是一些生成用於測試的流量的程式。它們可以向你展示伺服器在高負載的情況下的效能,以及

Facebook兆級別圖片存儲及百萬級別圖片查詢原理

避免 決定 volume 流程 mac 便是 blog 前言 HA 前言 Facebook(後面簡稱fb)是世界最大的社交平臺,需要存儲的數據時刻都在劇增(占比最大為圖片,每天存儲約20億張,大概是微信的三倍)。 那麽問題來了,fb是如何存儲兆級別的圖片?並且又是如何處理每

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

本文是構建能夠每秒處理 3 百萬請求的高效能 Web 集群系列文章的第一篇。它記錄了我使用負載生成器工具的一些經歷,希望它能幫助每一個像我一樣不得不使用這些工具的人節省時間。 負載生成器是一些生成用於測試的流量的程式。它們可以向你展示伺服器在高負載的情況下的效能

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

本文是構建能夠每秒處理 3 百萬請求的高效能 Web 集群系列文章的第一篇。它記錄了我使用負載生成器工具的一些經歷,希望它能幫助每一個像我一樣不得不使用這些工具的人節省時間。 負載生成器是一些生成用於測試的流量的程式。它們可以向你展示伺服器在高負載的情況

Facebook兆級別圖片儲存及百萬級別圖片查詢原理

前言 Facebook(後面簡稱fb)是世界最大的社交平臺,需要儲存的資料時刻都在劇增(佔比最大為圖片,每天儲存約20億張,大概

第一linux系統應用管理之用戶的切換

修改用戶、用戶切換、添加普通用戶、系統應用管理管理Linux系統運維之前,先來查看一下當前Linux系統的版本、內核等信息。命令如下:[[email protected]/* */ ~]# cat /etc/redhat-release CentOS release 6.8 (Final)

CodeIgniter 入門教程第一信息發布

per 所有 控制 知識點 image doc ref har 提交 一、MVC CodeIgniter 采用MVC架構即:控制層、模型層和視圖層。 對應Application下面的文件夾 (圖1): 所有新建文件以.php結尾 視圖層

第一查閱數據

如何使用 str 打印 chl sof 表示 cnblogs 命令 numeric 前言 本文講解如何使用 R 語言對數據集進行總體上的了解。 在進行數據挖掘之前,我們有必要對挖掘的數據集對象有一個總體的了解。本文采用具體實例講解的方式,詳細

第一你不一定了解的"推薦系統"

auto 目錄 主動 類目 好友 mage 放棄 百度 博文 前言 [推薦系統 - 基礎教程]可能是穆晨的所有博文裏,最有趣最好玩的一個系列了^ ^。 作為該系列的[入門篇],本文將輕松愉快地向讀者介紹推薦系統這項大數據領域中的熱門技術。

Linux實戰第一Centos6.9/RHEL6.9詳細安裝攻略(LVM)

linux個人筆記分享(在線閱讀):http://note.youdao.com/noteshare?id=bb2ad6216bff8cddaa3e360c76392c9b PDF版本下載http://down.51cto.com/data/2321269本文出自 “人才雞雞” 博客,請務必保留此出處http

第一白話tornado源碼之一個腳本引發的血案

之間 監聽 start 部分 soc 一場 cal client 創建服務 本系列博文計劃:   1、剖析基於Python的Web框架Tornado的源碼   2、為Python開發一個完善的MVC框架     首先將帶著大家一起來剖析基於python編寫的Web

第一Spark SQL源碼分析之核心流程

example 協議 bst copyto name 分詞 oop 不同 spl /** Spark SQL源碼分析系列文章*/ 自從去年Spark Submit 2013 Michael Armbrust分享了他的Catalyst,到至今1年多了,Spark SQ

自學運維第一Linux虛擬機基礎優化

linux虛擬機 基礎優化Linux虛擬機基礎優化1.系統環境查看命令cat /etc/redhat-release uname -runame -m說明:系統環境CentOS release 6.5 (Final) 2.6.32-431.el6.x86_642.關閉SELinux功能命令cat /etc/

第一Tomcat介紹、安裝、配置

分享圖片 訪問網站 esp ext .tar.gz resp less a20 關閉防火墻 一、Tomcat介紹 Tomcat是Apache軟件基金會(Apache Software Foundation)的Jakarta項目中的一個核心項目,有Apache 、Sun和其

Shell實戰第一自動批量創建用戶並配置保存自定義密碼

shell個人筆記分享(在線閱讀):http://note.youdao.com/noteshare?id=c4ee31bdcef0d28ec525bed113c93763&sub=CFE5180F8455421E9D5252FEC98AB1EDShell實戰第一篇:自動批量創建用戶並配置保存自定義密碼

Matlab高級教程_第一Matlab基礎知識提煉_04

訪問 str val 函數句柄 8.4 body tro mat AI 第八節:幾大MATLAB的數據類型 8.1 數值型 8.2 字符和字符串 創建用‘ ‘ 8.3 函數句柄 8.4 結構體 創建用. 語法:struct(‘field‘, var1,‘field2‘,

Matlab高級教程_第一Matlab基礎知識提煉_05

ron info ima image 數組 技術 gpo pos bsp 第九節:矩陣的操作 第十節:數組與矩陣 linspace函數 Matlab高級教程_第一篇:Matlab基礎知識提煉_05

SpringCloud 第一 服務的註冊與發現(Eureka)

plugin frame instance 完成 star wire clas snapshot IT 前言: 必需學會SpringBoot基礎知識 簡介: spring cloud 為開發人員提供了快速構建分布式系統的一些工具,包括配置管理、服務發現、斷路器、路由、

第一初識Python

簡潔 ica back 因此 spa 開發 ali family 動態 Python簡介 Python是一種動態解釋型的編程語言。Python簡單易學,功能強大,支持面向對象,函數式編程。Python可以在Windows,UNIX等多

ElasticSearch入門 第一Windows下安裝ElasticSearch

host 打開 分段 類型 安裝程序 tex EDA body 腳本 https://www.elastic.co/downloads/past-releases/elasticsearch-2-4-4 這是ElasticSearch 2.4 版本系列的第一篇: Ela