摘要:每個請求來的時候都會先去看看中有沒有,即使使用的是的方式也不免會讓我對它的性能產(chǎn)生一些擔(dān)憂,所以性能測試就必須要來一發(fā)了。注也在阿里云執(zhí)行只要是為了在一個數(shù)據(jù)中心降低網(wǎng)絡(luò)延遲。測試因為考慮到服務(wù)器比較穩(wěn)定,減少壓測總數(shù)。
背景
最近我操刀了leetcode的論壇遷移,整個過程持續(xù)了幾周的時間,總算暫時告了一個段落。常使用leetcode論壇的用戶應(yīng)該已經(jīng)發(fā)現(xiàn)論壇已經(jīng)大變樣了吧~
期間遇到了不少坑坑洼洼,將來也還會有好多問題等待去一一解決。關(guān)于這個遷移過程中的收貨,這篇文章中就不細(xì)說了,有時間再另開一篇博文。這篇文章主要關(guān)注在url-mapping以及它的性能問題。
問:url-mapping的問題從何而來呢?
舊的論壇和新的論壇是兩個不同的discuss框架。前者是phpbb,現(xiàn)在是nodebb。兩者的 url routing 完全不一樣,比如說同一個topic,在原來的url是 http://hostname/discuss/
而在廣袤的互聯(lián)網(wǎng)海洋中,舊論壇的url可能到處都存在。我們不希望在論壇遷移后,用戶點那些鏈接就失效了。我們希望的是用戶訪問舊的url可以被重定向到新論壇的某個地址。所以就產(chǎn)生了url-mapping的問題。
方法 生成url-mapping感謝nodebb-plugin-import提供了數(shù)據(jù)遷移以后自動生成url-mapping的方式,省了我自己寫腳本生成這些mapping的時間。每一條mapping大致是這樣的:
~^/discuss/questions/oj/add-two-numbers(?[^/]*)*/?$ /category/10/add-two-numbers;
其中的slug和id的mapping是由插件生成的。regular expression是為了匹配url中如果有param添加的。
Nginx Map官方文檔的demo可能對于剛想上手的同學(xué)來說不是那么友好,還是直接看現(xiàn)成的配置學(xué)得快:
http { ... map_hash_max_size 204800; map_hash_bucket_size 204800; map $request_uri $new { include /path/of/your/map/file; } include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; ... }
server { ... if ($new) { rewrite ^ https://discuss.leetcode.com$new redirect; } location / { ... } ... }
在server規(guī)則匹配中,$new值不為空,說明當(dāng)前要訪問的url已經(jīng)在http模塊的mapping文件中匹配到了,這個時候就不走各種location模塊了,直接rewrite成新的地址。注:這里要是做成proxy_pass也行,后面的測試中就采用了proxy_pass。但線上的環(huán)境,擔(dān)心nginx的壓力太大了,就采用了rewrite方式給它減減壓。
測試考慮到mapping的條目有點多,幾萬量級,又都是正則匹配。每個請求來的時候都會先去看看mapping中有沒有,即使mapping使用的是hash的方式也不免會讓我對它的性能產(chǎn)生一些擔(dān)憂,所以性能測試就必須要來一發(fā)了。
測試方案:
在新機(jī)器上跑helloworld
自動生成隨機(jī)100個url-mapping,都重定向到helloworld
使用abtest分別對helloworld和隨機(jī)url作壓測
增大url-mapping的條目,重復(fù)1,2
壓測機(jī)器臨時租了兩臺阿里云服務(wù)器(因為是臨時的,所以我也就不在意在后文暴露ip了),配置都是:1核,2048M內(nèi)存,40G硬盤。一臺用作nginx和helloworld程序,一臺專門做abtest。
注:abtest也在阿里云執(zhí)行只要是為了在一個數(shù)據(jù)中心降低網(wǎng)絡(luò)延遲。最后發(fā)現(xiàn)效果真不錯,rps從100多直接飆升到2700多。
helloworld采用了nodejs的helloworld:
var http = require("http"); var i = 0; http.createServer(function (req, res) { console.log(i++); res.writeHead(200, {"Content-Type": "text/plain"}); res.end("Hello World "); }).listen(1337, "0.0.0.0"); console.log("Server running at http://0.0.0.0:1337/");url-mapping
生成urlmapping寫了一個python腳本:
import hashlib m2 = hashlib.md5() current = "hello world" f = open("./url.map", "w") for i in range(100): m2.update(current) current = m2.hexdigest() f.write("~^/hello/world/" + current + "(?[^/]*)*/?$ /; ") f.close()
nginx配置:
server { listen 80; server_name 120.26.138.197; location ^~ /{ if ($new) { proxy_pass http://120.26.138.197:1337$new; break; } return 404; } }abtest
rps測試(request per second):并發(fā)壓測使用100000次請求,并發(fā)100個用戶的方式。
# 不走nginx ab -n100000 -c100 120.26.138.197:1337/ # 走nginx ab -n100000 -c100 120.26.138.197/hello/world/5eb63bbbe01eeed093cb22bb8f5acdc3/
mapping條目 | 直接訪問(rps) | map第一條url(rps) | map最后一條url(rps) | 不存在的url(rps) |
---|---|---|---|---|
100 | 2829.44 | 1819.63 | 1765.25 | 9740.53 |
1000 | - | 1816.00 | 1509.52 | 4094.68 |
10000 | - | 1813.22 | 514.24 | 658.32 |
100000 | - | 1836.02 | 62.40 | 65.80 |
跟預(yù)想的一樣,mapping的條目確實會對請求效率產(chǎn)生影響。而且?guī)兹f條的映射在較高并發(fā)的情況下已經(jīng)到了勉強(qiáng)能用的臨界了。還好以后mapping的條目不會再增加了,并且論壇的并發(fā)很難到100的量級。
tpr測試(time per request):因為考慮到服務(wù)器比較穩(wěn)定,減少壓測總數(shù)。同時把并發(fā)用戶減為1個。
# 不走nginx ab -n1000 -c1 120.26.138.197:1337/ # 走nginx ab -n1000 -c1 120.26.138.197/hello/world/5eb63bbbe01eeed093cb22bb8f5acdc3/
mapping條目 | 直接訪問(ms) | map第一條url(ms) | map最后一條url(ms) | 不存在的url(ms) |
---|---|---|---|---|
100 | 0.690 | 0.922 | 0.933 | 0.507 |
1000 | - | 0.925 | 1.043 | 0.648 |
10000 | - | 0.921 | 2.340 | 1.915 |
100000 | - | 0.926 | 16.321 | 15.469 |
在并發(fā)不是很高的時候mapping的條目可以更多。100000個條目大概只會影響整個請求15ms左右,可以忽略不計。如果說150ms的延遲是可以接受的,那么在一個并發(fā)不是很高的情況下,mapping最多可以有100w條,還是很多的。
測試中的不足壓測的url請求并不隨機(jī)
所有的url都被重定向到一個地方。不過從結(jié)果來看,nginx確實是根據(jù)條目一個個請求的。這點倒沒有什么影響
沒有測試http://hostname/path?param=xxx這樣類型的url
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/38057.html
摘要:每個請求來的時候都會先去看看中有沒有,即使使用的是的方式也不免會讓我對它的性能產(chǎn)生一些擔(dān)憂,所以性能測試就必須要來一發(fā)了。注也在阿里云執(zhí)行只要是為了在一個數(shù)據(jù)中心降低網(wǎng)絡(luò)延遲。測試因為考慮到服務(wù)器比較穩(wěn)定,減少壓測總數(shù)。 背景 最近我操刀了leetcode的論壇遷移,整個過程持續(xù)了幾周的時間,總算暫時告了一個段落。常使用leetcode論壇的用戶應(yīng)該已經(jīng)發(fā)現(xiàn)論壇已經(jīng)大變樣了吧~ 期間遇...
摘要:指令正則匹配指令使用模塊提供的,模塊可以創(chuàng)建變量,這些變量的值與另外的變量值相關(guān)聯(lián)。根據(jù)不同的設(shè)置網(wǎng)站根目錄通過指令獲取到自定義值后,可以做如下設(shè)置,讓不同的測試人員對應(yīng)不同的網(wǎng)站根目錄這里行,網(wǎng)站目錄可以用變量來表示。 原文鏈接:https://blog.tanteng.me/2016/... ,原文內(nèi)容會不斷完善,以原文為準(zhǔn)。 本文介紹有關(guān) User-Agent 的知識,以及使用 ...
摘要:本文同步在個人博客上,歡迎關(guān)注這篇文章整理了在前端開發(fā)中,在開發(fā)環(huán)境下使用重寫及代理功能的方法。表示該規(guī)則是使用正則定義的,區(qū)分大小寫。因此牢記在上下文中使用,而在上下文中使用。 本文同步在個人博客shymean.com上,歡迎關(guān)注 這篇文章整理了在前端開發(fā)中,在開發(fā)環(huán)境下使用nginx重寫uri及代理功能的方法。 參考 nginx中文文檔 前端開發(fā)者必備的 Nginx 知識 Ngin...
摘要:切圖仔的小書本文陸續(xù)介紹的功能配置及一些實用場景待完善。更可貴的是配置簡單文檔豐富大大降低了學(xué)習(xí)的門檻。為什么選擇自年發(fā)布以來,一直是服務(wù)器市場的霸主。雖然發(fā)布較晚,但是卻因為在高并發(fā)下卓越的表現(xiàn)而迅速嶄露頭角。 切圖仔的 Nginx 小書 本文陸續(xù)介紹 Nginx 的功能、配置、及一些實用場景(待完善...)。 一、介紹 Nginx 1. Nginx 是什么? Nginx,很多工程師...
閱讀 1062·2021-11-24 10:27
閱讀 3337·2021-11-18 10:02
閱讀 2396·2021-11-16 11:45
閱讀 3161·2021-11-15 18:10
閱讀 821·2021-09-22 15:23
閱讀 1529·2019-08-30 15:53
閱讀 3021·2019-08-30 13:20
閱讀 1666·2019-08-30 12:53