亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

使用Node.js配合Nginx實現高負載網絡

2019-11-20 12:08:18
字體:
來源:轉載
供稿:網友

 在搭建高吞吐量web應用這個議題上,NginX和Node.js可謂是天生一對。他們都是基于事件驅動模型而設計,可以輕易突破Apache等傳統web服務器的C10K瓶頸。預設的配置已經可以獲得很高的并發,不過,要是大家想在廉價硬件上做到每秒數千以上的請求,還是有一些工作要做的。

這篇文章假定讀者們使用NginX的HttpProxyModule來為上游的node.js服務器充當反向代理。我們將介紹Ubuntu 10.04以上系統sysctl的調優,以及node.js應用與NginX的調優。當然,如果大家用的是Debian系統,也能達到同樣的目標,只不過調優的方法有所不同而已。

網絡調優

如果不先對Nginx和Node.js的底層傳輸機制有所了解,并進行針對性優化,可能對兩者再細致的調優也會徒勞無功。一般情況下,Nginx通過TCP socket來連接客戶端與上游應用。

我們的系統對TCP有許多門限值與限制,通過內核參數來設定。這些參數的默認值往往是為一般的用途而定的,并不能滿足web服務器所需的高流量、短生命的要求。


這里列出了調優TCP可供候選的一些參數。為使它們生效,可以將它們放在/etc/sysctl.conf文件里,或者放入一個新配置文件,比如/etc/sysctl.d/99-tuning.conf,然后運行sysctl -p,讓內核裝載它們。我們是用sysctl-cookbook來干這個體力活。

需要注意的是,這里列出來的值是可以安全使用的,但還是建議大家研究一下每個參數的含義,以便根據自己的負荷、硬件和使用情況選擇一個更加合適的值。

復制代碼 代碼如下:
net.ipv4.ip_local_port_range='1024 65000'
net.ipv4.tcp_tw_reuse='1'
net.ipv4.tcp_fin_timeout='15'
net.core.netdev_max_backlog='4096'
net.core.rmem_max='16777216'
net.core.somaxconn='4096'
net.core.wmem_max='16777216'
net.ipv4.tcp_max_syn_backlog='20480'
net.ipv4.tcp_max_tw_buckets='400000'
net.ipv4.tcp_no_metrics_save='1'
net.ipv4.tcp_rmem='4096 87380 16777216'
net.ipv4.tcp_syn_retries='2'
net.ipv4.tcp_synack_retries='2'
net.ipv4.tcp_wmem='4096 65536 16777216'
vm.min_free_kbytes='65536'

重點說明其中幾個重要的。

復制代碼 代碼如下:
net.ipv4.ip_local_port_range

為了替上游的應用服務下游的客戶端,NginX必須打開兩條TCP連接,一條連接客戶端,一條連接應用。在服務器收到很多連接時,系統的可用端口將很快被耗盡。通過修改net.ipv4.ip_local_port_range參數,可以將可用端口的范圍改大。如果在/var/log/syslog中發現有這樣的錯誤: “possible SYN flooding on port 80. Sending cookies”,即表明系統找不到可用端口。增大net.ipv4.ip_local_port_range參數可以減少這個錯誤。

復制代碼 代碼如下:
net.ipv4.tcp_tw_reuse

當服務器需要在大量TCP連接之間切換時,會產生大量處于TIME_WAIT狀態的連接。TIME_WAIT意味著連接本身是關閉的,但資源還沒有釋放。將net_ipv4_tcp_tw_reuse設置為1是讓內核在安全時盡量回收連接,這比重新建立新連接要便宜得多。

復制代碼 代碼如下:
net.ipv4.tcp_fin_timeout

這是處于TIME_WAIT狀態的連接在回收前必須等待的最小時間。改小它可以加快回收。
如何檢查連接狀態

使用netstat:

復制代碼 代碼如下:
netstat -tan | awk '{print $6}' | sort | uniq -c

或使用ss:

復制代碼 代碼如下:
ss -s

NginX

隨著web服務器的負載逐漸升高,我們就會開始遭遇NginX的某些奇怪限制。連接被丟棄,內核不停報SYN flood。而這時,平均負荷和CPU使用率都很小,服務器明明是可以處理更多連接的狀態,真令人沮喪。

經過調查,發現有非常多處于TIME_WAIT狀態的連接。這是其中一個服務器的輸出:

復制代碼 代碼如下:
ss -s
Total: 388 (kernel 541)
TCP:   47461 (estab 311, closed 47135, orphaned 4, synrecv 0, timewait 47135/0), ports 33938

Transport Total     IP        IPv6
*          541       -         -       
RAW        0         0         0       
UDP        13        10        3       
TCP        326       325       1       
INET       339       335       4       
FRAG       0         0         0


有47135個TIME_WAIT連接!而且,從ss可以看出,它們都是已經關閉的連接。這說明,服務器已經消耗了絕大部分可用端口,同時也暗示我們,服務器是為每個連接都分配了新端口。調優網絡對這個問題有一點幫助,但是端口仍然不夠用。

經過繼續研究,我找到了一個關于上行連接keepalive指令的文檔,它寫道:

  •     設置通往上游服務器的最大空閑?;钸B接數,這些連接會被保留在工作進程的緩存中。

有趣。理論上,這個設置是通過在緩存的連接上傳遞請求來盡可能減少連接的浪費。文檔中還提到,我們應該把proxy_http_version設為"1.1",并清除"Connection"頭部。經過進一步的研究,我發現這是一種很好的想法,因為HTTP/1.1相比HTTP1.0,大大優化了TCP連接的使用率,而Nginx默認用的是HTTP/1.0。

按文檔的建議修改后,我們的上行配置文件變成這樣:

復制代碼 代碼如下:
upstream backend_nodejs {
  server nodejs-3:5016 max_fails=0 fail_timeout=10s;
  server nodejs-4:5016 max_fails=0 fail_timeout=10s;
  server nodejs-5:5016 max_fails=0 fail_timeout=10s;
  server nodejs-6:5016 max_fails=0 fail_timeout=10s;
  keepalive 512;
}

我還按它的建議修改了server一節的proxy設置。同時,加了一個 p roxy_next_upstream來跳過故障的服務器,調整了客戶端的 keepalive_timeout,并關閉訪問日志。配置變成這樣:

復制代碼 代碼如下:
server {
  listen 80;
  server_name fast.gosquared.com;

  client_max_body_size 16M;
  keepalive_timeout 10;

  location / {
    proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
    proxy_set_header   Connection "";
    proxy_http_version 1.1;
    proxy_pass http://backend_nodejs;
  }

  access_log off;
  error_log /dev/null crit;
}

采用新的配置后,我發現服務器們占用的socket 降低了90%?,F在可以用少得多的連接來傳輸請求了。新的輸出如下:

復制代碼 代碼如下:
ss -s

Total: 558 (kernel 604)
TCP:   4675 (estab 485, closed 4183, orphaned 0, synrecv 0, timewait 4183/0), ports 2768

Transport Total     IP        IPv6
*          604       -         -       
RAW        0         0         0       
UDP        13        10        3       
TCP        492       491       1       
INET       505       501       4

Node.js

得益于事件驅動式設計可以異步處理I/O,Node.js開箱即可處理大量的連接和請求。雖然有其它一些調優手段,但這篇文章將主要關注node.js的進程方面。

Node是單線程的,不會自動使用多核。也就是說,應用不能自動獲得服務器的全部能力。

實現Node進程的集群化

我們可以修改應用,讓它fork多個線程,在同一個端口上接收數據,從而實現負載的跨越多核。Node有一個cluster模塊,提供了實現這個目標所必需的所有工具,但要將它們加入應用中還需要很多體力活。如果你用的是express,eBay有一個叫cluster2的模塊可以用。

防止上下文切換

當運行多個進程時,應該確保每個CPU核同一時間只忙于一個進程。一般來說,如果CPU有N個核,我們應該生成N-1個應用進程。這樣可以確保每個進程都能得到合理的時間片,而剩下的一個核留給內核調度程序運行其它任務。我們還要確保服務器上基本不執行除Node.js外的其它任務,防止出現CPU的爭用。

我們曾經犯過一個錯誤,在服務器上部署了兩個node.js應用,然后每個應用都開了N-1個進程。結果,它們互相之間搶奪CPU,導致系統的負荷急升。雖然我們的服務器都是8核的機器,但仍然可以明顯地感覺到由上下文切換引起的性能開銷。上下文切換是指CPU為了執行其它任務而掛起當前任務的現象。在切換時,內核必須掛起當前進程的所有狀態,然后裝載和執行另一個進程。為了解決這個問題,我們減少了每個應用開啟的進程數,讓它們公平地分享CPU,結果系統負荷就降了下來:

2015628112206774.png (802×404)

請注意上圖,看系統負荷(藍線)是如何降到CPU核數(紅線)以下的。在其它服務器上,我們也看到了同樣的情況。既然總的工作量保持不變,那么上圖中的性能改善只能歸功于上下文切換的減少。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
zzijzzij亚洲日本成熟少妇| 日韩精品久久久久久福利| 69国产精品成人在线播放| 精品亚洲男同gayvideo网站| 麻豆国产va免费精品高清在线| 国产欧美最新羞羞视频在线观看| 九九精品在线播放| 国产精品偷伦一区二区| 国产日韩换脸av一区在线观看| 国产视频在线一区二区| 中文字幕日韩av综合精品| 国产精品视频区1| 狠狠操狠狠色综合网| 精品久久久香蕉免费精品视频| 成人乱人伦精品视频在线观看| 69久久夜色精品国产69乱青草| www.99久久热国产日韩欧美.com| 97精品视频在线播放| 国产精品高精视频免费| 深夜精品寂寞黄网站在线观看| 久久精品国产91精品亚洲| 日韩欧美成人网| 日韩欧美综合在线视频| 久久乐国产精品| 日韩中文字幕在线观看| 国产色婷婷国产综合在线理论片a| 国产亚洲精品美女| 国产精品久久久久久久久久久久| 成人在线中文字幕| 欧美一级淫片播放口| 亚洲国产成人久久综合| 中文字幕亚洲欧美一区二区三区| 久久久国产精品x99av| 精品成人在线视频| 久久国产一区二区三区| 一本色道久久88亚洲综合88| 亚洲免费一在线| 国产精品va在线播放| 国产精品久久久久久久久久久久久久| 亚洲精品国产拍免费91在线| 成人在线免费观看视视频| 黄网动漫久久久| 亚洲欧洲一区二区三区久久| 91情侣偷在线精品国产| 国产主播精品在线| 国产精品永久免费观看| 久久韩剧网电视剧| 98精品在线视频| 国产精品久久久久久久电影| 欧美性猛交xxxx久久久| 亚洲成人久久久久| 91九色国产社区在线观看| 亚洲精品永久免费精品| 国产精品亚洲欧美导航| 91免费观看网站| 欧美激情按摩在线| 欧美精品国产精品日韩精品| 久久久国产精品视频| 亚洲色图校园春色| 欧美另类高清videos| 久久久免费精品| 一区二区三区日韩在线| 欧美激情亚洲另类| 中文字幕亚洲欧美一区二区三区| 茄子视频成人在线| 久久精品亚洲94久久精品| 欧美激情欧美激情在线五月| 久久久久久国产精品三级玉女聊斋| 日韩欧美在线视频日韩欧美在线视频| 欧美极品在线播放| 动漫精品一区二区| 久久精品亚洲精品| 中文日韩电影网站| 亚洲欧美激情在线视频| 亚洲欧美精品suv| 欧美精品videosex性欧美| 亚洲专区在线视频| 91色在线观看| 动漫精品一区二区| 日韩电影在线观看免费| 日韩精品极品视频| 久久综合久久八八| 亚洲天堂免费视频| 国产91精品视频在线观看| 精品日本美女福利在线观看| 亚洲精品ady| 欧美日韩一区二区免费在线观看| 亚洲区bt下载| 亚洲理论片在线观看| 69av在线视频| 国产成人avxxxxx在线看| 亚洲欧美日韩高清| 欧美中文在线视频| 在线观看中文字幕亚洲| 国产成人高清激情视频在线观看| 成人国产精品色哟哟| 国产精品丝袜白浆摸在线| 中日韩美女免费视频网址在线观看| 亚洲欧美日韩精品久久奇米色影视| 久久久久免费精品国产| 日本精品性网站在线观看| 97国产在线视频| 国产日韩av高清| 日韩a**中文字幕| 亚洲一级片在线看| 亚洲美女性生活视频| 91精品国产综合久久香蕉的用户体验| 欧美日韩国内自拍| 青青青国产精品一区二区| 97国产精品人人爽人人做| 日韩av影视在线| **欧美日韩vr在线| 久久久国产视频91| 欧洲精品在线视频| 久久久亚洲国产| 久久频这里精品99香蕉| 欧美激情亚洲另类| 97**国产露脸精品国产| 亚洲视频自拍偷拍| 日韩精品欧美国产精品忘忧草| 国产精品久久久久久久久久东京| 亚洲xxxx18| 精品亚洲国产成av人片传媒| 91精品久久久久久| 日韩av毛片网| 日韩视频中文字幕| 亚洲人成电影网站色…| 亚州欧美日韩中文视频| 国产精品一区二区三区毛片淫片| 亚洲一区二区三区毛片| 国产精品一区二区三区毛片淫片| 日韩成人久久久| 亚洲精品99久久久久| 国产精品情侣自拍| 国产精品美女在线观看| 一本一道久久a久久精品逆3p| 国产视频精品久久久| 性欧美在线看片a免费观看| 欧美日韩在线看| 国产一区二区日韩精品欧美精品| 欧美日韩一二三四五区| 欧美高清电影在线看| 在线观看欧美日韩| 日本精品久久中文字幕佐佐木| 欧美成人免费va影院高清| 欧美视频免费在线观看| 91高潮精品免费porn| 色悠悠久久88| 91在线视频精品| 欧美成人一区二区三区电影| 久久综合九色九九| www.亚洲成人| 美女扒开尿口让男人操亚洲视频网站| 国产精品久久久久久超碰| 亚洲国产精品一区二区三区| 国产精选久久久久久| 国产欧美日韩综合精品| 欧美成人精品一区| 中文字幕欧美亚洲| 欧美精品做受xxx性少妇| 国产精品日韩电影| 国产美女久久精品香蕉69| 国产精品久久久久久久久久久新郎| 国产美女精彩久久|