測試nignx php請求并發數,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 命令后的測試結果:

uid-25266990-id-2985541.html

使用netstat 過濾后的連接數:

uid-25266990-id-2985541.html

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

uid-25266990-id-2985541.html

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

uid-25266990-id-2985541.html

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

uid-25266990-id-2985541.html

此時打開php 頁面已經有些困難,需要進行多次刷新才能打開。上圖中cpu0 負載偏低

是因為測試時將網卡中斷請求全部分配到cpu0 上,并且在nginx 中開啟7 個進程分別制定到cpu1-7。

使用FastCGI 緩存之后:

uid-25266990-id-2985541.html

此時可以很輕松的打開php 頁面。

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

轉載自

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

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

相關文章

多米諾骨牌v.1MEL語言

// // //Script Name:多米諾骨牌v.1 //Author:瘋狂小豬 //Last Updated: 2011.10.5 //Email:wzybwj163.com // //---------------------------------------------------------------------------- //-----------------------------------------------------------------…

THINKPHP3.2視頻教程

http://edu.51cto.com/lesson/id-24504.html lunix視頻教程 http://bbs.lampbrother.net/read-htm-tid-161465.html TP資料http://pan.baidu.com/s/1dDCLFRr#path%252Fthink 微信開發,任務吧,留著記號了

mardown 標題帶數字_標題中帶有數字的故事更成功嗎?

mardown 標題帶數字統計 (Statistics) I have read a few stories on Medium about writing advice, and there were some of them which, along with other tips, suggested that putting numbers in your story’s title will increase the number of views, as people tend …

897. 遞增順序查找樹-未解決

897. 遞增順序查找樹 https://leetcode-cn.com/contest/weekly-contest-100/problems/increasing-order-search-tree/ package com.test;import java.util.ArrayList; import java.util.Collections; import java.util.List;/*** author stono* date 2018/9/2* 897. 遞增順序查…

Azure PowerShell (16) 并行開關機Azure ARM VM

《Windows Azure Platform 系列文章目錄》 并行開機腳本: https://github.com/leizhang1984/AzureChinaPowerShell/blob/master/ARM/2StartAzureARMVM/StartAzureRMVM.txt 并行關機腳本: https://github.com/leizhang1984/AzureChinaPowerShell/blob/mas…

使用Pandas 1.1.0進行穩健的2個DataFrames驗證

Pandas is one of the most used Python library for both data scientist and data engineers. Today, I want to share some Python tips to help us do qualification checks between 2 Dataframes.Pandas是數據科學家和數據工程師最常用的Python庫之一。 今天,我…

Maya開發

Maya開發(一)-- 緒論 (翻譯自Maya官方文檔)2008-05-09 15:33 緒論 Autodesk Maya 是一個開放的產品,就是說任何Autodesk以外的人都可以改變Maya現有的特征,或者 增加新的特性.你可以用兩個方法來修改MAYA: ME…

織夢在線報名平臺php,DedeCMSv5

DedeCMS v5國內專業的PHP網站內容管理系統-織夢內容管理系統v5.8 Roadmap狀態 ? 已完成 🔨 進行中 ? 未完成項目開發可以到織夢開發問題管理中進行交流反饋。🔨 調整DedeCMS目錄結構,將原有include中外部訪問的內容遷移出去;&am…

pom.xml文件詳解

<project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd "> <!-- 父項目的坐…

軟件工程第一次作業

&#xff08;1&#xff09;回想一下你初入大學時對計算機專業的暢想 當初你是如何做出選擇計算機專業的決定的&#xff1f; 當初選擇計算機專業是因為之前看大佬們參加信息競賽&#xff0c;覺得很厲害、很有意思&#xff0c;而且也希望能自己做一款游戲出來&#xff0c;所以就選…

置信區間的置信區間_什么是置信區間,為什么人們使用它們?

置信區間的置信區間I’m going to try something a little different today, in which I combine two (completely unrelated) topics I love talking about, and hopefully create something that is interesting and educational.今天&#xff0c;我將嘗試一些與眾不同的東西…

事實上著就是MAYA4.5完全手冊插件篇的內容

不過著好象侵權了&#xff0c;因為&#xff21;&#xff2c;&#xff29;&#xff21;&#xff33;聲明不得一任何方式傳播該手冊的部分或全部_炙墨追零 Maya不為插件提供二進制兼容性。每當發布新版本時&#xff0c;舊插件的源代碼要重新編譯。然而&#xff0c;我們的目標是保…

制作alipay-sdk-java包到本地倉庫

項目要用到支付寶的掃碼支付&#xff0c;后臺使用的maven 問了客服 官方目前沒有 maven 的地址只能手動安裝到本地了&#xff0c;如果建了maven 服務器也可以上傳到服務器上 從支付寶官網上下載sdk 制作本地安裝包 alipay-sdk-java.jar 放到D: 盤根目錄下 執行命令&#xff1a…

php中wlog是什么意思,d-log模式是什么意思

D-Log是一種高動態范圍的視頻素材記錄格式&#xff0c;總而言之這個色彩模式為后期調色提供了更大的空間。在相機和攝影機拍攝時&#xff0c;一顆高性能的傳感器通常支持11檔以上的動態范圍&#xff0c;而在8bit的照片或視頻上&#xff0c;以符合人眼感知的Gamma進行機內處理和…

PowerShell入門(三):如何快速地掌握PowerShell?

如何快速地掌握PowerShell呢&#xff1f;總的來說&#xff0c;就是要盡可能多的使用它&#xff0c;就像那句諺語說的&#xff1a;Practice makes perfect。當然這里還有一些原則和方法讓我們可以遵循。 有效利用交互式環境 一般來說&#xff0c;PowerShell有兩個主要的運行環境…

pca 主成分分析_通過主成分分析(PCA)了解您的數據并發現潛在模式

pca 主成分分析Save time, resources and stay healthy with data exploration that goes beyond means, distributions and correlations: Leverage PCA to see through the surface of variables. It saves time and resources, because it uncovers data issues before an h…

宏觀數據提取

http://219.235.129.58/fbk/checkSession.jsp http://219.235.129.58/indicatorYear.do?methodgetDczdsXml&bgqbDm1 大列表 http://219.235.129.58/indicatorYear.do?methodgetDczdsXml&bgqbDm1&FBZD_FJD0300&timeTypeyear 第二層 http://219.235.129.58/…

UML-- plantUML安裝

plantUML安裝 因為基于intellid idea,所以第一步自行安裝.setting->plugins 搜索plantUML安裝完成后&#xff0c;重啟idea 會有如下顯示安裝Graphviz 下載地址 https://graphviz.gitlab.io/_pages/Download/Download_windows.html配置Graphviz環境變量&#xff1a; dot -ver…

php不發送referer,php – 注意:未定義的索引:HTTP_REFERER

注意&#xff1a;未定義的索引&#xff1a;HTTP_REFERER$http_referer $_SERVER [‘HTTP_REFERER’]我使用這個從教程,它看起來不錯代碼也從包含文件中調用它我該怎么改&#xff1f;我添加了print_r($_ SERVER);現在頁面給了我這個Array ([UNIQUE_ID] > UoSxWa56310AAAwUck…

HDU 最大報銷額 (0 1 背包)

最大報銷額 Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 29 Accepted Submission(s) : 11 Problem Description現有一筆經費可以報銷一定額度的發票。允許報銷的發票類型包括買圖書&#xff08;A類&#xff09…