服務(wù)近2000家企業(yè),依托一系列實踐中打磨過的技術(shù)和產(chǎn)品,根據(jù)企業(yè)的具體業(yè)務(wù)問題和需求,針對性的提供各行業(yè)大數(shù)據(jù)解決方案。
單機Linux+TOMCAT+NGINX性能優(yōu)化
來源:未知 時間:2018-38-12 瀏覽次數(shù):167次
單機Linux+TOMCAT+NGINX性能優(yōu)化,受資源限制一般的web應(yīng)用都部署在Linux單機上運行,如果沒有提供多臺服務(wù)器資源,無法實現(xiàn)分布式和負(fù)載均衡那么就只能通過優(yōu)化和提高單機運行效率以達到最優(yōu)負(fù)載能力,本文從三個方面講解優(yōu)化配置,Linux操作系統(tǒng)優(yōu)化,Nginx配置優(yōu)化,tomcat配置優(yōu)化一、linux系統(tǒng)配置優(yōu)化(以centos7為例)
Linux最大連接數(shù)優(yōu)化配置:Linux對于每個用戶,系統(tǒng)限制其最大進程數(shù)。為提高性能,可以根據(jù)設(shè)備資源情況,設(shè)置各linux 用戶的最大進程數(shù)
- 1.解除 Linux 系統(tǒng)的最大進程數(shù)和最大文件打開數(shù)限制
vi /etc/security/limits.conf
# 添加如下的行
* soft noproc 11000
* hard noproc 11000
上邊兩行可以用一行代替 * - noproc 11000 -的意思為soft 和hard 全部限制 。
* soft nofile 4100
* hard nofile 4100
說明:* 代表針對所有用戶,noproc 是代表最大進程數(shù),nofile 是代表最大文件打開數(shù)
- 2.讓 SSH 接受 Login 程式的登入,方便在 ssh 客戶端查看 ulimit -a 資源限制:
把 UserLogin 的值改為 yes,并把 # 注釋去掉
b、重啟 sshd 服務(wù): /etc/init.d/sshd restart
3.優(yōu)化jvm配置- 3.修改所有 linux 用戶的環(huán)境變量文件:
vi /etc/profile
ulimit -u 10000
ulimit -n 4096
ulimit -d unlimited
ulimit -m unlimited
ulimit -s unlimited
ulimit -t unlimited
ulimit -v unlimited
保存后運行#source /etc/profile 使其生效
Linux內(nèi)核tcp調(diào)優(yōu)方案,sysctl.conf的設(shè)置
二、tomcat優(yōu)化配置
配置tomcat鏈接池增加并能力
參數(shù)講解:
Linux內(nèi)核tcp調(diào)優(yōu)方案,sysctl.conf的設(shè)置
#sudo vi /etc/sysctl.conf
$ /proc/sys/net/core/wmem_max
該文件指定了發(fā)送套接字緩沖區(qū)大小的最大值(以字節(jié)為單位),可參考的優(yōu)化值:873200
$ /proc/sys/net/core/rmem_max
該文件指定了接收套接字緩沖區(qū)大小的最大值(以字節(jié)為單位),可參考的優(yōu)化值:873200
$ /proc/sys/net/core/netdev_max_backlog
進入包的最大設(shè)備隊列.默認(rèn)是1000,對重負(fù)載服務(wù)器而言,該值太低,可調(diào)整到16384.
$ /proc/sys/net/core/somaxconn
listen()的默認(rèn)參數(shù),掛起請求的最大數(shù)量.默認(rèn)是128.對繁忙的服務(wù)器,增加該值有助于網(wǎng)絡(luò)性能.可調(diào)整到8192.
$ /proc/sys/net/core/optmem_max
socket buffer的最大初始化值,默認(rèn)10K(10240).也可調(diào)整到20k(20480).但建議保留不變
$ /proc/sys/net/ipv4/tcp_max_syn_backlog
進入SYN包的最大請求隊列.默認(rèn)1024.對重負(fù)載服務(wù)器,增加該值顯然有好處.可調(diào)整到16384.
$ /proc/sys/net/ipv4/tcp_retries2
TCP失敗重傳次數(shù),默認(rèn)值15,意味著重傳15次才徹底放棄.可減少到5,以盡早釋放內(nèi)核資源.
$ /proc/sys/net/ipv4/tcp_keepalive_time
$ /proc/sys/net/ipv4/tcp_keepalive_intvl
$ /proc/sys/net/ipv4/tcp_keepalive_probes
這3個參數(shù)與TCP KeepAlive有關(guān).默認(rèn)值是:
tcp_keepalive_time = 7200 seconds (2 hours)
tcp_keepalive_probes = 9
tcp_keepalive_intvl = 75 seconds
意思是如果某個TCP連接在idle 2個小時后,內(nèi)核才發(fā)起probe.如果probe 9次(每次75秒)不成功,內(nèi)核才徹底放棄,認(rèn)為該連接已失效.對服務(wù)器而言,顯然上述值太大. 可調(diào)整到:
/proc/sys/net/ipv4/tcp_keepalive_time 1800
/proc/sys/net/ipv4/tcp_keepalive_probes 3
/proc/sys/net/ipv4/tcp_keepalive_intvl 30
$ proc/sys/net/ipv4/ip_local_port_range
指定端口范圍的一個配置,默認(rèn)是32768 61000.可調(diào)整為1024 65535.
net.ipv4.tcp_syncookies = 1
表示開啟SYN Cookies。當(dāng)出現(xiàn)SYN等待隊列溢出時,啟用cookies來處理,可防范少量SYN攻擊,默認(rèn)為0,表示關(guān)閉。
net.ipv4.tcp_tw_reuse = 1
表示開啟重用。允許將TIME-WAIT sockets重新用于新的TCP連接,默認(rèn)為0,表示關(guān)閉。
net.ipv4.tcp_tw_recycle = 1
表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認(rèn)為0,表示關(guān)閉。
?。?!開啟快速回收后,可以很大程度的減少TIME_WAIT狀態(tài),及時回收資源,之前我發(fā)過一篇文章,這里會導(dǎo)致app移動設(shè)備無法同時訪問網(wǎng)站,這個問題應(yīng)該是曾經(jīng)阿里云的bug,目前應(yīng)該是修復(fù)了。
net.ipv4.tcp_fin_timeout = 30
表示如果套接字由本端要求關(guān)閉,這個參數(shù)決定了它保持在FIN-WAIT-2狀態(tài)的時間。
net.ipv4.tcp_keepalive_time = 1200
表示當(dāng)keepalive起用的時候,TCP發(fā)送keepalive消息的頻度。缺省是2小時,改為20分鐘。
net.ipv4.ip_local_port_range = 1024 65535
表示用于向外連接的端口范圍。缺省情況下過窄:32768到61000,改為1024到65535。
net.ipv4.tcp_max_syn_backlog = 16384
表示SYN隊列的長度,默認(rèn)為1024,加大隊列長度為8192,可以容納更多等待連接的網(wǎng)絡(luò)連接數(shù)。
net.ipv4.tcp_max_tw_buckets = 1000
表示系統(tǒng)同時保持TIME_WAIT套接字的最大數(shù)量,如果超過這個數(shù)字,TIME_WAIT套接字將立刻被清除并打印警告信息。默認(rèn)為180000,建議減小,避免TIME_WAIT狀態(tài)過多消耗整個服務(wù)器的資源,但也不能太小,跟你后端的處理速度有關(guān),如果速度快可以小,速度慢則適當(dāng)加大,否則高負(fù)載會有請求無法響應(yīng)或非常慢。
#缺省socket寫buffer,可參考的優(yōu)化值:873200/1746400/3492800
net.core.wmem_default = 1746400
#最大socket寫buffer,可參考的優(yōu)化值:1746400/3492800/6985600
net.core.wmem_max = 3492800
#缺省socket讀buffer,可參考的優(yōu)化值:873200/1746400/3492800
net.core.rmem_default = 1746400
#最大socket讀buffer,可參考的優(yōu)化值:1746400/3492800/6985600
net.core.rmem_max = 3492800
#進入包的最大設(shè)備隊列.默認(rèn)是1000,對重負(fù)載服務(wù)器而言,該值太低,可調(diào)整到16384/32768/65535
net.core.netdev_max_backlog = 32768
#listen()的默認(rèn)參數(shù),掛起請求的最大數(shù)量.默認(rèn)是128.對繁忙的服務(wù)器,增加該值有助于網(wǎng)絡(luò)性能.可調(diào)整到8192/16384/32768
net.core.somaxconn = 16384
#每個socket buffer的最大補助緩存大小,默認(rèn)10K(10240),也可調(diào)整到20k(20480),但建議保留
net.core.optmem_max = 10240
#表示用于向外連接的端口范圍.缺省情況下過窄:32768到61000,改為1024到65535
net.ipv4.ip_local_port_range = 1024 65535
#TCP寫buffer,可參考的優(yōu)化值:873200/1746400/3492800/6985600
net.ipv4.tcp_wmem = 873200 1746400 3492800
#TCP讀buffer,可參考的優(yōu)化值:873200/1746400/3492800/6985600
net.ipv4.tcp_rmem = 873200 1746400 3492800
#進入SYN包的最大請求隊列.默認(rèn)1024.對重負(fù)載服務(wù)器,增加該值顯然有好處.可調(diào)整到16384/32768/65535
net.ipv4.tcp_max_syn_backlog = 32768
#TCP失敗重傳次數(shù),默認(rèn)值15,意味著重傳15次才徹底放棄.可減少到5,以盡早釋放內(nèi)核資源
net.ipv4.tcp_retries2 = 5
#以下3個參數(shù)與TCP KeepAlive有關(guān).默認(rèn)值是:
#tcp_keepalive_time = 7200 seconds (2 hours)
#tcp_keepalive_probes = 9
#tcp_keepalive_intvl = 75 seconds
#意思是如果某個TCP連接在idle 2個小時后,內(nèi)核才發(fā)起probe.如果probe 9次(每次75秒)不成功,內(nèi)核才徹底放棄,認(rèn)為該連接已失效
#對服務(wù)器而言,顯然上述值太大.可調(diào)整到:
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 30
#表示開啟SYN Cookies,當(dāng)出現(xiàn)SYN等待隊列溢出時,啟用cookies來處理,可防范少量SYN攻擊,默認(rèn)為0,表示關(guān)閉
net.ipv4.tcp_syncookies = 1
#表示如果套接字由本端要求關(guān)閉,這個參數(shù)決定了它保持在FIN-WAIT-2狀態(tài)的時間
net.ipv4.tcp_fin_timeout = 30
#表示開啟重用,允許將TIME-WAIT sockets重新用于新的TCP連接,默認(rèn)為0,表示關(guān)閉
#net.ipv4.tcp_tw_reuse = 1
#表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認(rèn)為0,表示關(guān)閉
#net.ipv4.tcp_tw_recycle = 1
#表示系統(tǒng)同時保持TIME_WAIT套接字的最大數(shù)量,如果超過這個數(shù)字,TIME_WAIT套接字將立刻被清除并打印警告信息
#默認(rèn)為180000,建議使用默認(rèn)值,不建議調(diào)小
#net.ipv4.tcp_max_tw_buckets = 180000
#其它的一些設(shè)置
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_synack_retries = 2
保存退出:
2 #sudo /sbin/sysctl -p
二、tomcat優(yōu)化配置
配置tomcat鏈接池增加并能力
1.打開被注釋的默認(rèn)連接池配置
- <!--
- <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
- maxThreads="150" minSpareThreads="4"/>
- -->
修改實例:
- <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
- maxThreads="150" minSpareThreads="100"
- prestartminSpareThreads="true" maxQueueSize="100"/>
參數(shù)講解:
- name: 線程名稱
- namePrefix: 線程前綴
- maxThreads : 最大并發(fā)連接數(shù),不配置時默認(rèn)200,一般建議設(shè)置500~ 800 ,要根據(jù)自己的硬件設(shè)施條件和實際業(yè)務(wù)需求而定。
- minSpareThreads:Tomcat啟動初始化的線程數(shù),默認(rèn)值25
- prestartminSpareThreads:在tomcat初始化的時候就初始化minSpareThreads的值, 不設(shè)置true時minSpareThreads
- maxQueueSize: 最大的等待隊列數(shù),超過則拒絕請求
2.修改鏈接配置
默認(rèn)配置:
- <Connector port="8080" protocol="HTTP/1.1"
- connectionTimeout="20000"
- redirectPort="8443" />
修改配置:
- <Connector port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
- connectionTimeout="20000"
- redirectPort="8443"
- executor="tomcatThreadPool"
- enableLookups="false"
- acceptCount="100"
- maxPostSize="10485760"
- compression="on"
- disableUploadTimeout="true"
- compressionMinSize="2048"
- noCompressionUserAgents="gozilla, traviata"
- acceptorThreadCount="2"
- compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript"
- URIEncoding="utf-8"/>
- port:連接端口。
- protocol:連接器使用的傳輸方式。 Tomcat 8 設(shè)置 nio2 更好:org.apache.coyote.http11.Http11Nio2Protocol
- protocol, Tomcat 6、7 設(shè)置 nio 更好:org.apache.coyote.http11.Http11NioProtocol
注:
每個web客戶端請求對于服務(wù)器端來說就一個單獨的線程,客戶端的請求數(shù)量增多將會導(dǎo)致線程數(shù)就上去了,CPU就忙著 跟線程切換。
而NIO則是使用單線程(單個CPU)或者只使用少量的多線程(多CPU)來接受Socket,而由線程池來處理堵塞在pipe 或者隊 列里的請求.這樣的話,只要OS可以接受TCP的連接,web服務(wù)器就可以處理該請求。大大提高了web服務(wù)器的可伸縮性。
- executor: 連接器使用的線程池名稱
- enableLookups:禁用DNS 查詢
- acceptCount:指定當(dāng)所有可以使用的處理請求的線程數(shù)都被使用時,可以放到處理隊列中的請求數(shù),超過這個數(shù)的請求將不予處理,默認(rèn)設(shè)置 100 。
- maxPostSize:限制 以FORM URL 參數(shù)方式的POST請求的內(nèi)容大小,單位字節(jié),默認(rèn)是 2097152(2兆),10485760 為 10M。如果要禁用限制,則可以設(shè)置為 -1。
- acceptorThreadCount: 用于接收連接的線程的數(shù)量,默認(rèn)值是1。一般這個指需要改動的時候是因為該服務(wù)器是一個多核CPU,如果是多核 CPU 一般配置為 2。
- compression:傳輸時是壓縮。
- compressionMinSize:壓縮的大小
- noCompressionUserAgents:不啟用壓縮的瀏覽器
修改${JAVA_HOME}/bin/catalina.sh文件,JAVA_OPTS選項
三,nginx優(yōu)化配置
worker_processes 8;//取值為cup合數(shù)的倍數(shù)
worker_rlimit_nofile 65535;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
events {
use epoll;
worker_connections 65535;
}