天天看點

伺服器優化

環境

針對高并發的優化主要包括以下幾個方面

本人的環境是centos7+nginx+tomcat

linux:2個CPU,每個2核,總共4個線程,4g記憶體

檢視方法:
grep 'physical id' /proc/cpuinfo | sort -u
grep 'core id' /proc/cpuinfo | sort -u | wc -l
grep 'processor' /proc/cpuinfo | sort -u | wc -l
           
伺服器優化

nginx:1.18

tomcat:8.5

tomcat優化

1.禁用AJP連接配接,ajp是用來和其他伺服器互動的,是以把AJP連接配接器禁用。

修改conf下的server.xml檔案,将AJP服務禁用掉即可。
<!--<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />-->
           

2.啟用線程池

修改server.xml檔案:

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="1000" minSpareThreads="300" prestartminSpareThreads="true" maxQueueSize="100"/>
<!--
參數說明:
maxThreads:最大并發數,預設設定 200,一般建議在 500 ~ 1000,根據硬體設施和業務來判斷
minSpareThreads:Tomcat 初始化時建立的線程數,預設設定 25
prestartminSpareThreads: 在 Tomcat 初始化的時候就初始化 minSpareThreads 的參數值,如果不等于 true,minSpareThreads 的值就沒啥效果了
maxQueueSize,最大的等待隊列數,超過則拒絕請求
-->

<!--在Connector中設定executor屬性指向上面的執行器   也可以把executor的屬性直接寫到下邊-->
<Connector executor="tomcatThreadPool"  port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
           

3.tomcat的運作模式有3種

bio

tomcat 7之前預設的模式,性能非常低下

nio

nio(new I/O),是Java SE 1.4及後續版本提供的一種新的I/O操作方式(即java.nio包及其子包)。Java nio是一個基于緩沖區、并能提供非阻塞I/O操作的Java API,是以nio也被看成是non-blocking I/O的縮寫。它擁有比傳統I/O操作(bio)更好的并發運作性能。nio2比nio性能好一點,我使用的nio2

apr

性能最好,比較麻煩,沒有嘗試

<Connector executor="tomcatThreadPool"  port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
               connectionTimeout="20000"
               redirectPort="8443" />
           

4.修改jvm參數

修改 tomcat/bin/catalina.sh

直接添加
JAVA_OPTS="
-Xms256m
-Xmx512m
-XX:+UseParallelGC
-XX:+UseParallelOldGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-XX:+PrintHeapAtGC
-Xloggc:$CATALINA_HOME/logs/gc.log"
           

具體參數根據實際使用情況調整

nginx優化

開始用了3個nginx,最上層一個(80端口),對外提供服務,中間兩個nginx(9000,9010端口),每個下面帶三個tomcat

請求來的時候先通路最上層的80,80通過負載均衡分發給9000和9010,然後再負載均衡到tomcat。測試結果并不理想,有時候請求會丢失,逾時,卡住,或者tomcat直接挂掉,可能是伺服器性能一般,帶不動,也可能是多了一層代理,出錯的幾率變大,也有可能是并發太高,端口占用太多,都是推測,沒有測,畢竟測試是一件又累又無聊的事。後來改成一個nginx+4個tomcat,性能大大提升。

對應伺服器的線程數(或者倍數),避免線程切換耗時
worker_processes  4;
打開檔案數
worker_rlimit_nofile  65535;
events {
	epoll模式
    use epoll;
    連接配接數
    worker_connections  65535;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    允許單個ip請求頻率
    limit_req_zone $binary_remote_addr zone=one:20m  rate=100000r/s;
    sendfile        on;
    keepalive_timeout  65;
    upstream nginx.com {
        server 127.0.0.1:8091;
        server 127.0.0.1:8092;
        server 127.0.0.1:8093;
        server 127.0.0.1:8094;
    }
    server {
        listen       80;
        server_name  localhost;       
        location / {
		proxy_pass  http://nginx.com/;
       		}
	}
}
           

除了這兩方面還有系統方面的優化,比如啟用的端口數等等

在這套配置下并發數達到5500的時候錯誤率為0,響應時間也挺快,CPU占用達到90%多