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

掃一掃