nginx大流量負載調優

lnmp已經成爲比較流行的網站服務器端技術配備。越來越多的人開始不滿足於能使用nginx,更多人開始關注如何能優化nginx的處理能力。

使用nginx的目的就是爲了提高併發處理能力,但是看到有部分人本機部署lanmp,在同一臺機器上使用nginx方向代理apache,就有種***子放屁的感覺。

在window下運行nginx,還要跑出好的效果,同樣是個僞命題,windows下的select模型註定nginx效率不會太高。

最近看了篇英文文章,結合自己理解,寫給大家看看吧。

優化nginx包括兩方面:

1.是自己重寫nginx代碼(比如tengine)、本身nginx的代碼已經足夠優秀,如果不是每秒幾千的請求,就忽略這個部分吧。

2.另一個就是和優化nginx的配置,這是中小型網站可以重點優化的部分。

nginx的配置文件是一種聲明式定義,控制nginx的每一個細節。

所謂負載調優,就是提高單臺機器處理效率,降低單臺機器的負載。

爲了提高單臺機器的處理效率,cpu的處理速度是足夠快的,我們能解決的就是降低磁盤I/O、網絡I/O,減少內存使用。

降低單臺機器的負載我們能做的就是負載均衡,把流量打到多臺機器處理。

nginx推薦優化內容:

1.open files數量優化
ulimit -a查看系統參數
其中
open files (-n) 1024
表示系統同時最多能打開的文件數,linux下的所有設備都可以認爲是文件,包括網絡連接,如果同時超過1024個連接,那麼nginx的日誌就會報“24: Too many open files”

多以優化的第一步就是設置open files爲ulimit

修改/etc/profile,增加
ulimit -n 65535

2.Worker Processes數量優化
通常來說設置一個cpu核心對應一個worker processer,最多不超過4個,提高worker process的值是爲了提高計算能力,但一般在越到cpu瓶頸前,你會遇到別的瓶頸(如網絡問題)。

只有當你要處理大量靜態文件的磁盤I/O時,worker進程是單線程的,所以這個讀取文件的阻塞IO會降低CPU的處理速度,這是可以增加worker進程數量,其它情況是不需要的。

3.worker進程連接數優化(Worker Connections)
默認情況下這個值是worker_connections 1024,也就是說考慮到keep-alive超時65秒,每個瀏覽器平均消耗兩個鏈接(chrome會同時打開多個連接來提到加載速度)。

那麼默認情況下nginx平均每秒能處理1024/65/2=8,那麼8*86440=64w,差不多相當於每天有60萬ip。

多以普通網站默認值就可以了,如果你的流量一直提升,可以考慮增加這個值爲2048或者更高。

3. CPU Affinity
用來設置worker進程使用哪個cpu核心處理請求並且一直使用這個cpu核心。如果你不知道cpu調度,最好別碰這個,操作系統比你更懂如何調度。

4. Keep Alive

Keep alive 沒有數據傳輸的情況下保持客戶端和服務端的連接,也就是保持空連接一段時間,避免重現建立鏈接的時間消耗。nginx處理空連接的效率非常高,1萬個空連 接大約消耗2.5M內存。如果流量非常大的網站,減少建立連接的時間開銷是非常客觀的。keep alive的值設置在10-20s之間比較合理。

5. tcp_nodelay 和 tcp_nopush優化
這兩個指令影響nginx的底層網絡,它們決定操作系統如何處理網絡層buffer和什麼時候把buffer內容刷新給終端用戶。如果你不懂,就可以保持這兩個指令默認不變,對nginx性能影響不明顯。

6. access日誌優化
默認情況下,access日誌會記錄所有請求到日誌文件,寫操作會增加IO操作,如果不需要統計信息,可以使用百度統計或者cnzz統計,完全可以關閉日誌,來減少磁盤寫,或者寫入內存文件,提高IO效率。

7. Error日誌優化
錯誤日誌會記錄運行中的錯誤,如果設置的太低,會記錄的信息太多,會產生大量IO,推薦設置爲warn,這樣可以記錄大部分信息,而不會有太多IO

8. Open File Cache
nginx會讀文件系統的許多文件,如果這些文件的描述符能夠緩存起來,那麼會提高處理效率。詳見http://wiki.nginx.org/HttpCoreModule#open_file_cache

9. Buffers size優化
buffer的大小是你需要調優最重要參數。如果buffer size太小就會到導致nginx使用臨時文件存儲response,這會引起磁盤讀寫IO,流量越大問題越明顯。

client_body_buffer_size 處理客戶端請求體buffer大小。用來處理POST提交數據,上傳文件等。client_body_buffer_size 需要足夠大以容納如果需要上傳POST數據。

fastcgi_buffers,proxy_buffers 處理後端(PHP, Apache)響應。如果這個buffer不夠大,同樣會引起磁盤都系IO。需要注意的是它們有一個上限值,這個上限值受 fastcgi_max_temp_file_size 、 proxy_max_temp_file_size控制。

10.磁盤IO
如果能把數據全放到內存,不使用磁盤就可以完全去掉磁盤IO。 默認情況下操作系統也會緩存頻繁訪問的數據以降低IO。所以預算足夠的情況加,加大內存。

11.網絡IO
假設我們沒有了磁盤IO,所有數據都在內存,那麼我們的讀IO大概有3-6gbps。這種情況下,如果你網絡差,一樣會很慢。所以儘可能提高網絡帶寬,壓縮傳輸數據。

網絡帶寬買你能買的起的最大帶寬,nginx的gzip模塊可以用來壓縮傳輸數據,通常gzip_comp_level 設爲 4-5,再高就是浪費cpu了。同時也可以採用css,js壓縮技術,當然這些技術就與nginx優化無關了。。

絕招
如果你還想提高nginx處理能力,只能祭出大殺器了。別優化了,加機器吧。一點點優化是沒有用的,不如擴展機器來的快些。

ps
說道系統的擴展性通常有scale、和extension,區別是前者是數量上擴展,後者是功能上擴展。


轉:http://my.oschina.net/vdroid/blog/270338


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章