使用 cURL 對 HTTP Requests 進行性能測試

benchmarking.jpeg

在做 Web 開發(fā)的時候扎谎,經(jīng)常需要對 Web Page 或者 REST-ful API 做簡單的 Benchmark碳想。本文將介紹如何使用 cURL 進行簡單快速的 Benchmark。

本文內(nèi)容涉及:

  • 使用 curl 查看加載時間
  • 使用 curl -w 查看更多的網(wǎng)絡(luò)情況
  • 使用 Apache Benchmark(ab) 進行更高級的 Benchmark

當(dāng)然毁靶,最后還會涉及實戰(zhàn)應(yīng)用胧奔。

使用 curl 查看加載時間

?  blogs git:(curl) ? curl -s -w "%{time_total}\n" -o /dev/null http://www.github.com/
1.492

可以看到請求時間為 1.492 秒。此時:

  • -s, --silent: 讓 curl 保持靜默模式预吆,不會輸出進度條
  • -w "%{time_total\n}":輸出使用時間
  • -o /dev/null: 這個參數(shù)用來隱藏 response 的內(nèi)容

如果使用 time 可以看到 time_total 的細節(jié):

?  blogs git:(curl) ? time curl -s -o /dev/null http://www.github.com/
curl --silent -o /dev/null http://www.github.com/  1.04s user 0.04s system 61% cpu 1.760 total

通常情況 Benchmark 一次的數(shù)據(jù)并不可靠龙填,可以配合 for loop 發(fā)送多次請求:

# zsh shell
?  blogs git:(curl) ? for i in {1..3}; curl -s -w "%{time_total}\n" -o /dev/null http://www.github.com/
0.665
0.678
1.399

curl 默認發(fā)送 GET 請求,可以使用 TL;DR 查看發(fā)送 POST, DELETE, PUT 或者更多的使用方法拐叉。

使用 curl -w 查看更多的網(wǎng)絡(luò)情況

通常情況下一個 HTTP Request 會包含很多步驟岩遗,如果想知道 time_total 之外更詳細的信息,可以參考 man curl 文章中凤瘦, -w --write-out <format>宿礁。

curl -w <format> 可以支持格式模板,我們可以使用 @template-file-name 的方式對輸出格式進行自定義蔬芥。

比如將這個模板保存為 curl-format.txt

\n
            time_namelookup:  %{time_namelookup}\n
               time_connect:  %{time_connect}\n
            time_appconnect:  %{time_appconnect}\n
           time_pretransfer:  %{time_pretransfer}\n
              time_redirect:  %{time_redirect}\n
         time_starttransfer:  %{time_starttransfer}\n
                            ----------\n
                 time_total:  %{time_total}\n
\n
?  blogs git:(curl) ? curl -s -w "@curl-format.txt" -o /dev/null http://www.baidu.com/

            time_namelookup:  1.101
               time_connect:  1.130
            time_appconnect:  0.000
           time_pretransfer:  1.130
              time_redirect:  0.000
         time_starttransfer:  1.164
                            ----------
                 time_total:  1.165

此時可以看到 DNS lookup, TCP 鏈接梆靖,數(shù)據(jù)傳傳輸?shù)刃畔ⅰ?/p>

使用 Apache Benchmark(ab) 進行更高級的 Benchmark

以上使用 curl 進行的簡單的 Benchmark 都是基于單線程的訪問。如果需要更多詳細信息笔诵,或者希望進行并發(fā)測試返吻,推薦使用 Apache Benchmark

例如乎婿,我們希望對 github.com 做個 10 * Requests思喊,3 * concurrency 的 Benchmark。

?  blogs git:(curl) ? ab -n 10 -c 3 http://github.com/
This is ApacheBench, Version 2.3 <$Revision: 1748469 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking github.com (be patient).....done


Server Software:
Server Hostname:        github.com
Server Port:            80

Document Path:          /
Document Length:        0 bytes

Concurrency Level:      3
Time taken for tests:   3.293 seconds
Complete requests:      10
Failed requests:        0
Non-2xx responses:      10
Total transferred:      1030 bytes
HTML transferred:       0 bytes
Requests per second:    3.04 [#/sec] (mean)
Time per request:       987.954 [ms] (mean)
Time per request:       329.318 [ms] (mean, across all concurrent requests)
Transfer rate:          0.31 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:      255  488 419.1    270    1282
Processing:   257  485 354.1    277    1179
Waiting:      257  485 354.1    277    1179
Total:        512  973 616.2    556    2196

Percentage of the requests served within a certain time (ms)
  50%    556
  66%   1125
  75%   1537
  80%   1640
  90%   2196
  95%   2196
  98%   2196
  99%   2196
 100%   2196 (longest request)

此時我們可以得到更詳細的 Benchmark 信息次酌。

實戰(zhàn)應(yīng)用

最近項目的 Tech Leader 對一段代碼提出了 Performance 的 issue。這段代碼在 map 操作時做了大量的同步網(wǎng)絡(luò)請求舆乔。代碼大致如下:

data_set.map do |item|
  # request 1 with item.property
  # request 2 with item.property
  # request 3 with item.property
end

Tead Leader 使用 curl 給出了簡單的 Benchmark岳服。

time curl -X "GET" URL
0.03s user 0.01s system 0% cpu 4.220 total

這段代碼 data_set 大小至少為 20,每一個 map 參考至少會發(fā)送 3 個網(wǎng)絡(luò)請求希俩〉跛危總網(wǎng)絡(luò)請求數(shù)會達到 20 * 3 = 60 次,并且這些 HTTP Request 都以同步的方式進行颜武。
因此希望采用異步的方式優(yōu)化 map 操作璃搜。方案采用 Ruby 中的 parallel gem拖吼。

Parallel.map(data_set, in_threads: {thread_number}) do |item|
  # request 1 with item.property
  # request 2 with item.property
  # request 3 with item.property
end

此時如何給出合理的 thread_number,需要參考 Benchmark 結(jié)果这吻。之后采用 Apache Benchmarkthread_number 進行挑選吊档。

  1. 對 API 進行單次請求,確定 Benchmark baseline唾糯,之后的有話都必須比這個 baseline 快怠硼。

    ab -n 1 URL
    
  2. 調(diào)整 thread_number,分別對 API 進行多次同步請求移怯,選出最佳 thread_number香璃。

    ab -n 5 URL
    
  3. 調(diào)整 thread_number,再對 API 進行 concurrency benchmark舟误,選出最佳 thread_number葡秒。

    ab -n 15 -c 3 URL
    

分享一組數(shù)據(jù):

Base line 為進行優(yōu)化的時間:

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing: 13076 13076   0.0  13076   13076
Waiting:    13075 13075   0.0  13075   13075
Total:      13076 13076   0.0  13076   13076

6 * Thread 優(yōu)化之后的時間(Win):

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:  2492 2492   0.0   2492    2492
Waiting:     2492 2492   0.0   2492    2492
Total:       2492 2492   0.0   2492    2492

10 * Thread 優(yōu)化之后的時間:

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:  6098 6098   0.0   6098    6098
Waiting:     6098 6098   0.0   6098    6098
Total:       6098 6098   0.0   6098    6098

由此數(shù)據(jù)可見, 6 * Thread 是最合適并行數(shù)嵌溢。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末眯牧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子堵腹,更是在濱河造成了極大的恐慌炸站,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疚顷,死亡現(xiàn)場離奇詭異旱易,居然都是意外死亡,警方通過查閱死者的電腦和手機腿堤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門阀坏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人笆檀,你說我怎么就攤上這事忌堂。” “怎么了酗洒?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵士修,是天一觀的道長。 經(jīng)常有香客問我樱衷,道長棋嘲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任矩桂,我火速辦了婚禮沸移,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己雹锣,他們只是感情好网沾,可當(dāng)我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蕊爵,像睡著了一般辉哥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上在辆,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天证薇,我揣著相機與錄音,去河邊找鬼匆篓。 笑死浑度,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鸦概。 我是一名探鬼主播箩张,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼窗市!你這毒婦竟也來了先慷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤咨察,失蹤者是張志新(化名)和其女友劉穎论熙,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體摄狱,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡脓诡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了媒役。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祝谚。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖酣衷,靈堂內(nèi)的尸體忽然破棺而出交惯,到底是詐尸還是另有隱情,我是刑警寧澤穿仪,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布席爽,位于F島的核電站,受9級特大地震影響啊片,放射性物質(zhì)發(fā)生泄漏拳昌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一钠龙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦碴里、人聲如沸沈矿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽羹膳。三九已至,卻和暖如春根竿,著一層夾襖步出監(jiān)牢的瞬間陵像,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工寇壳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留醒颖,地道東北人。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓壳炎,卻偏偏與公主長得像泞歉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子匿辩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,747評論 2 361

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理腰耙,服務(wù)發(fā)現(xiàn),斷路器铲球,智...
    卡卡羅2017閱讀 134,714評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法挺庞,類相關(guān)的語法,內(nèi)部類的語法稼病,繼承相關(guān)的語法选侨,異常的語法,線程的語...
    子非魚_t_閱讀 31,664評論 18 399
  • 轉(zhuǎn)載自:http://www.cnblogs.com/txw1958/archive/2013/01/19/286...
    php_bruce閱讀 2,278評論 1 5
  • 風(fēng)雨三十年,真情依然鮮丰刊,武全定和鄧雪倩結(jié)婚三十周年紀念隘谣。
    小橡皮樹閱讀 333評論 0 1
  • 從小在部隊大院長大,對大院的記憶卻是斷斷續(xù)續(xù)啄巧,很多的人和事都已模糊寻歧,仿佛沉淀在記憶深處,或許某年某月某天某件事會突...
    好風(fēng)如水yt閱讀 294評論 0 1