nginx 并發過十萬

一般來說nginx 配置文件中對優化比較有作用的為以下幾項:

worker_processes 8;

nginx 進程數,建議按照cpu 數目來指定,一般為它的倍數。

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

為每個進程分配cpu,上例中將8 個進程分配到8 個cpu,當然可以寫多個,或者將一
個進程分配到多個cpu。

worker_rlimit_nofile 102400;

這個指令是指當一個nginx 進程打開的最多文件描述符數目,理論值應該是最多打開文
件數(ulimit -n)與nginx 進程數相除,但是nginx 分配請求并不是那么均勻,所以最好與ulimit -n 的值保持一致。

use epoll;

使用epoll 的I/O 模型

worker_connections 102400;

每個進程允許的最多連接數, 理論上每臺nginx 服務器的最大連接數為worker_processes*worker_connections。

keepalive_timeout 60;

keepalive 超時時間。

client_header_buffer_size 4k;

客戶端請求頭部的緩沖區大小,這個可以根據你的系統分頁大小來設置,一般一個請求
頭的大小不會超過1k,不過由于一般系統分頁都要大于1k,所以這里設置為分頁大小。分頁大小可以用命令getconf PAGESIZE 取得。

open_file_cache max=102400 inactive=20s;

這個將為打開文件指定緩存,默認是沒有啟用的,max 指定緩存數量,建議和打開文件數一致,inactive 是指經過多長時間文件沒被請求后刪除緩存。

open_file_cache_valid 30s;

這個是指多長時間檢查一次緩存的有效信息。

open_file_cache_min_uses 1;

open_file_cache 指令中的inactive 參數時間內文件的最少使用次數,如果超過這個數字,文件描述符一直是在緩存中打開的,如上例,如果有一個文件在inactive 時間內一次沒被使用,它將被移除。

關于內核參數的優化:

net.ipv4.tcp_max_tw_buckets = 6000

timewait 的數量,默認是180000。

net.ipv4.ip_local_port_range = 1024 65000

允許系統打開的端口范圍。

net.ipv4.tcp_tw_recycle = 1

啟用timewait 快速回收。

net.ipv4.tcp_tw_reuse = 1

開啟重用。允許將TIME-WAIT sockets 重新用于新的TCP 連接。

net.ipv4.tcp_syncookies = 1

開啟SYN Cookies,當出現SYN 等待隊列溢出時,啟用cookies 來處理。

net.core.somaxconn = 262144

web 應用中listen 函數的backlog 默認會給我們內核參數的net.core.somaxconn 限制到128,而nginx 定義的NGX_LISTEN_BACKLOG 默認為511,所以有必要調整這個值。

net.core.netdev_max_backlog = 262144

每個網絡接口接收數據包的速率比內核處理這些包的速率快時,允許送到隊列的數據包的最大數目。

net.ipv4.tcp_max_orphans = 262144

系統中最多有多少個TCP 套接字不被關聯到任何一個用戶文件句柄上。如果超過這個數字,孤兒連接將即刻被復位并打印出警告信息。這個限制僅僅是為了防止簡單的DoS 攻擊,不能過分依靠它或者人為地減小這個值,更應該增加這個值(如果增加了內存之后)。

net.ipv4.tcp_max_syn_backlog = 262144

記錄的那些尚未收到客戶端確認信息的連接請求的最大值。對于有128M 內存的系統而言,缺省值是1024,小內存的系統則是128。

net.ipv4.tcp_timestamps = 0

時間戳可以避免序列號的卷繞。一個1Gbps 的鏈路肯定會遇到以前用過的序列號。時間戳能夠讓內核接受這種“異常”的數據包。這里需要將其關掉。

net.ipv4.tcp_synack_retries = 1

為了打開對端的連接,內核需要發送一個SYN 并附帶一個回應前面一個SYN 的ACK。也就是所謂三次握手中的第二次握手。這個設置決定了內核放棄連接之前發送SYN+ACK 包的數量。

net.ipv4.tcp_syn_retries = 1

在內核放棄建立連接之前發送SYN 包的數量。

net.ipv4.tcp_fin_timeout = 1

如果套接字由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2 狀態的時間。對端可以出錯并永遠不關閉連接,甚至意外當機。缺省值是60 秒。2.2 內核的通常值是180 秒,3你可以按這個設置,但要記住的是,即使你的機器是一個輕載的WEB 服務器,也有因為大量的死套接字而內存溢出的風險,FIN- WAIT-2 的危險性比FIN-WAIT-1 要小,因為它最多只能吃掉1.5K 內存,但是它們的生存期長些。

net.ipv4.tcp_keepalive_time = 30

當keepalive 起用的時候,TCP 發送keepalive 消息的頻度。缺省是2 小時。

下面貼一個完整的內核優化設置:

net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30
net.ipv4.ip_local_port_range = 1024 65000

下面是一個簡單的nginx 配置文件:

user www www;
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000
01000000;
error_log /www/log/nginx_error.log crit;
pid /usr/local/nginx/nginx.pid;
worker_rlimit_nofile 204800;
events
{
use epoll;
worker_connections 204800;
}
http
{
include mime.types;
default_type application/octet-stream;
charset utf-8;
server_names_hash_bucket_size 128;
client_header_buffer_size 2k;
large_client_header_buffers 4 4k;
client_max_body_size 8m;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2
keys_zone=TEST:10m
inactive=5m;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 4k;
fastcgi_buffers 8 4k;
fastcgi_busy_buffers_size 8k;
fastcgi_temp_file_write_size 8k;
fastcgi_cache TEST;
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
fastcgi_cache_min_uses 1;
fastcgi_cache_use_stale error timeout invalid_header http_500;
open_file_cache max=204800 inactive=20s;
open_file_cache_min_uses 1;
open_file_cache_valid 30s;
tcp_nodelay on;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
server
{
listen 8080;
server_name backup.aiju.com;
index index.php index.htm;
root /www/html/;
location /status
{
stub_status on;
}
location ~ .*\.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fcgi.conf;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$
{
expires 30d;
}
log_format access '$remote_addr -- $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
access_log /www/log/access.log access;
}
}

關于FastCGI 的幾個指令:

fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10minactive=5m;

這個指令為FastCGI 緩存指定一個路徑,目錄結構等級,關鍵字區域存儲時間和非活動刪除時間。

fastcgi_connect_timeout 300;

指定連接到后端FastCGI 的超時時間。

fastcgi_send_timeout 300;

向FastCGI 傳送請求的超時時間,這個值是指已經完成兩次握手后向FastCGI 傳送請求的超時時間。

fastcgi_read_timeout 300;

接收FastCGI 應答的超時時間,這個值是指已經完成兩次握手后接收FastCGI 應答的超時時間。

fastcgi_buffer_size 4k;

指定讀取FastCGI 應答第一部分需要用多大的緩沖區,一般第一部分應答不會超過1k,由于頁面大小為4k,所以這里設置為4k。

fastcgi_buffers 8 4k;

指定本地需要用多少和多大的緩沖區來緩沖FastCGI 的應答。

fastcgi_busy_buffers_size 8k;

這個指令我也不知道是做什么用,只知道默認值是fastcgi_buffers 的兩倍。

fastcgi_temp_file_write_size 8k;

在寫入fastcgi_temp_path 時將用多大的數據塊,默認值是fastcgi_buffers 的兩倍。

fastcgi_cache TEST

開啟FastCGI 緩存并且為其制定一個名稱。個人感覺開啟緩存非常有用,可以有效降低CPU 負載,并且防止502 錯誤。

fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;

為指定的應答代碼指定緩存時間,如上例中將200,302 應答緩存一小時,301 應答緩存1 天,其他為1 分鐘。

fastcgi_cache_min_uses 1;

緩存在fastcgi_cache_path 指令inactive 參數值時間內的最少使用次數,如上例,如果在5 分鐘內某文件1 次也沒有被使用,那么這個文件將被移除。

fastcgi_cache_use_stale error timeout invalid_header http_500;

不知道這個參數的作用,猜想應該是讓nginx 知道哪些類型的緩存是沒用的。以上為nginx 中FastCGI 相關參數,另外,FastCGI 自身也有一些配置需要進行優化,如果你使用php-fpm 來管理FastCGI,可以修改配置文件中的以下值:

60

同時處理的并發請求數,即它將開啟最多60 個子線程來處理并發連接。

102400

最多打開文件數。

204800

每個進程在重置之前能夠執行的最多請求數。

下面貼幾張測試結果圖。

下圖為同時在6 臺機器運行webbench -c 30000 -t 600?http://backup.aiju.com:8080/index.html?命令后的測試結果:

使用netstat 過濾后的連接數:

php 頁面在status 中的結果(php 頁面為調用phpinfo):

php 頁面在netstat 過濾后的連接數:

未使用FastCGI 緩存之前的服務器負載:

此時打開php 頁面已經有些困難,需要進行多次刷新才能打開。上圖中cpu0 負載偏低
是因為測試時將網卡中斷請求全部分配到cpu0 上,并且在nginx 中開啟7 個進程分別制定到cpu1-7。

使用FastCGI 緩存之后:

此時可以很輕松的打開php 頁面。
這個測試并沒有連接到任何數據庫,所以并沒有什么參考價值,不過不知道上述測試是否已經到達極限,根據內存和cpu 的使用情況來看似乎沒有,但是已經沒有多余的機子來讓我運行webbench 了。囧

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387877.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387877.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387877.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

貝葉斯網絡建模

I am feeling sick. Fever. Cough. Stuffy nose. And it’s wintertime. Do I have the flu? Likely. Plus I have muscle pain. More likely.我感到惡心。 發熱。 咳嗽。 鼻塞。 現在是冬天。 我有流感嗎? 可能吧 另外我有肌肉疼痛。 更傾向于。 Bayesian networ…

長春南關區凈月大街附近都有哪些課后班?

長春南關區凈月大街附近都有哪些課后班?在學校的教育不能滿足廣大學生的需求的時候,一對一輔導、文化課輔導、高考輔導等越來越多的家長和孩子的選擇。相對于學校的大課教育,一對一輔導有著自身獨特的優勢,一對一輔導有著學校教學…

dev中文本框等獲取焦點事件

<ClientSideEvents GotFocus"GotFocus" /> editContract.SetFocus()//設置文本框等的焦點 function GotFocus(s, e) { window.top.DLG.show(700, 600, "PrePayment/ContractSelect.aspx", "選擇", null ); }…

數據科學家數據分析師_使您的分析師和數據科學家在數據處理方面保持一致

數據科學家數據分析師According to a recent survey conducted by Dimensional Research, only 50 percent of data analysts’ time is actually spent analyzing data. What’s the other half spent on? Data cleanup — that tedious and repetitive work that must be do…

神經網絡使用情景

神經網絡使用情景 人臉&#xff0f;圖像識別語音搜索文本到語音&#xff08;轉錄&#xff09;垃圾郵件篩選&#xff08;異常情況探測&#xff09;欺詐探測推薦系統&#xff08;客戶關系管理、廣告技術、避免用戶流失&#xff09;回歸分析 為何選擇Deeplearning4j&#xff1f; …

BZOJ4890 Tjoi2017城市

顯然刪掉的邊肯定是直徑上的邊。考慮枚舉刪哪一條。然后考慮怎么連。顯然新邊應該滿足其兩端點在各自樹中作為根能使樹深度最小。只要線性求出這個東西就可以了&#xff0c;這與求樹的重心的過程類似。 #include<iostream> #include<cstdio> #include<cmath>…

【國際專場】laravel多用戶平臺(SaaS, 如淘寶多用戶商城)的搭建策略

想不想用Laravel來搭建一個多用戶、或多租戶平臺&#xff1f;比如像淘寶那樣的多商戶平臺呢&#xff1f;聽上去很復雜&#xff0c;不是嗎&#xff1f;怎么能一個程序&#xff0c;給那么多的機構用戶來用呢&#xff1f;如何協調管理它們呢&#xff1f;數據庫怎么搭建呢&#xff…

GitHub常用命令及使用

GitHub使用介紹 摘要&#xff1a; 常用命令&#xff1a; git init 新建一個空的倉庫git status 查看狀態git add . 添加文件git commit -m 注釋 提交添加的文件并備注說明git remote add origin gitgithub.com:jinzhaogit/git.git 連接遠程倉庫git push -u origin master 將本地…

神經網絡的類型

KNN DNN SVM DL BP DBN RBF CNN RNN ANN 概述 本文主要介紹了當前常用的神經網絡&#xff0c;這些神經網絡主要有哪些用途&#xff0c;以及各種神經網絡的優點和局限性。 1 BP神經網絡 BP (Back Propagation)神經網絡是一種神經網絡學習算法。其由輸入層、中間層、輸出層組成的…

python db2查詢_如何將DB2查詢轉換為python腳本

python db2查詢Many companies are running common data analytics tasks using python scripts. They are asking employees to convert scripts that may currently exist in SAS or other toolsets to python. One step of this process is being able to pull in the same …

Dapper基礎知識三

在下剛畢業工作&#xff0c;之前實習有用到Dapper&#xff1f;這幾天新項目想用上Dapper&#xff0c;在下比較菜鳥&#xff0c;這塊只是個人對Dapper的一種總結。 Dapper&#xff0c;當項目在開發的時候&#xff0c;在沒有必要使用依賴注入的時候&#xff0c;如何做到對項目的快…

deeplearning4j

deeplearning4j 是基于java的深度學習庫&#xff0c;當然&#xff0c;它有許多特點&#xff0c;但暫時還沒學那么深入&#xff0c;所以就不做介紹了 需要學習dl4j&#xff0c;無從下手&#xff0c;就想著先看看官網的examples&#xff0c;于是&#xff0c;下載了examples程序&a…

PostgreSQL 11 1Kw TPCC , 1億 TPCB 7*24 強壓耐久測試

標簽 PostgreSQL , tpcc , tpcb 背景 TPCC, TPCB是工業標準的OLTP類型業務的數據庫測試&#xff0c;包含大量的讀、寫、更新、刪除操作。 7*24小時強壓耐久測試&#xff0c;主要看數據庫在長時間最大壓力下的 性能、穩定性、可靠性。 測試CASE &#xff1a; 1、1000萬 tpcc 2、…

推理編程_答案集編程的知識表示和推理

推理編程Read about the difference between declarative and imperative programming and learn from code examples (Answer Set Programming, Python and C).了解聲明式和命令式編程之間的區別&#xff0c;并從代碼示例(答案集編程&#xff0c;Python和C)中學習。 介紹 (In…

給Hadoop初學者的一些建議

我們介紹了新手學習hadoop的入門注意事項。這篇來談談hadoop核心知識學習。 hadoop核心知識學習: hadoop分為hadoop1.X和hadoop2.X&#xff0c;并且還有hadoop生態系統。這里只能慢慢介紹了。一口也吃不成胖子。 那么下面我們以hadoop2.x為例進行詳細介紹&#xff1a; Hadoop…

Guide AHOI2017 洛谷P3720

Description 農場主John最近在網上買了一輛新車&#xff0c;在購買汽車配件時&#xff0c;John不小心點了兩次“提交”按鈕。導致汽車上安裝了兩套GPS系統&#xff0c;更糟糕的是John在使用GPS導航時&#xff0c;兩套系統常常給出不同的路線。從地圖上看&#xff0c;John居住的…

穩坐視頻云行業第一,阿里云將用邊緣計算開辟新賽道

“CDN競爭的上半場已結束&#xff0c;中國視頻云市場格局已定&#xff0c;邊緣計算將成為下半場發展的新賽道。” 4月10日&#xff0c;阿里云視頻云總經理、邊緣計算負責人朱照遠在第七屆“亞太內容分發大會”暨CDN峰會表示。朱照遠認為&#xff0c;阿里云依靠齊全的產品矩陣、…

愛因斯坦提出的邏輯性問題_提出正確問題的重要性

愛因斯坦提出的邏輯性問題We live in a world that values answers. We were taught in school to learn how to answer questions in exams, we were conditioned to go to work knowing that we need to have the answers and our society, by and large, focuses on finding…

python安裝包

由于Google、YouTube等大型公司的推廣&#xff0c;Python編程語言越來越受歡迎&#xff0c;很多編程愛好者&#xff0c;也將Python做為了首先的編程語言。 今天我們就來講一下&#xff0c;學習的第一步&#xff0c;安裝Python IDLE編輯器&#xff0c;也它的調試和使用。 第一步…

104 權限 sudo 解壓縮

主要內容:https://www.cnblogs.com/pyyu/articles/9355477.html 1 查看系統版本信息: #查看系統版本信息 cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) #查看內核版本號 uname -r 3.10.0-693.el7.x86_64 #查看系統多少位 uname -m x86_64 #查看內核所有信息…