Nginx 性能改進一例

jopen 12年前發布 | 24K 次閱讀 Nginx Web服務器

本文研究的是在海量靜態文件下,如何提高nginx的處理能力。在靜態文件數量不是很多的情況下,nginx處理靜態文件的能力極快,但是在海量的 靜態文件下,nginx的處理能力就不那么樂觀,怎么提高nginx處理能力呢,當然從系統角度,可以mount時對文件系統加noatime,以及采用 目錄hash,再結合url rewrite等方式,可以適當的提高點性能,我這里介紹的是,通過將靜態文件存在leveldb的方式。

先說一下測試的環境,戴爾R710普通服務器,7200轉的普通硬盤,沒有做raid。拿了55萬張圖片,41G去盡可能模擬海量圖片的情形,當然這個量級與一般公司的量級還差的太遠,這里只測試,壓力工具用siege。

命令:siege -c 100 -b -i -r 100 -f /tmp/urlll

文件系統下nginx壓力測試:

Nginx 性能改進一例

這個能力會讓我們對nginx很失望,每秒約處理163個請求,平均每個請求耗時0.6s,吞吐不到12MB。問題不再于nginx,在于系統文件 系統的io瓶頸,linux文件系統基于樹狀設計,加上硬盤本身的缺陷,使得文件系統的隨機io不高,當文件數量不多,加上系統的cache,感覺不明 顯,但文件數量上一個量級,文件系統的io將迅速成為系統中最大的瓶頸。

怎樣去彌補文件系統自身的io不足,提高nginx的靜態處理能力,我一直在思考這個問題,現在nosql很火,我一直設想如是將數據全部存在 nosql里面,避免通過文件系統去查找文件,是否會提高nginx的處理能力呢,我把上面測試的41G的558397圖片全部存入google的 leveldb中,編寫一個nginx的leveldb模塊,讓nginx請求直接去查詢leveldb,再用上面同樣的方式去隨機測試,得到如下數據。

leveldb下nginx壓力測試:

Nginx 性能改進一例

與上面的性能數據相比,每秒的處理能力由163提高到了380,平均每個request耗時由0.6s降到了0.25s,吞吐由12MB提高到了27MB。總體至少提高了近2~3倍的處理能力。如果數據量級更大的話,我估計性能提升的倍數更高。

我把我編寫的nginx模塊的hander部分貼出來,沒有做任何優化和請求頭過濾。

Nginx 性能改進一例

Nginx 性能改進一例

編譯確保nginx正常鏈接到leveldb

Nginx 性能改進一例

轉自:http://my.oschina.net/beiyou/blog/79646

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!