性能優化|Tomcat 服務優化

vascript" URIEncoding="utf-8" keepAliveTimeout="0"
關閉shutdown端口:
關閉ajp連接:註釋


取消訪問日誌Valve閥門
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
/>

圖示:

性能優化|Tomcat 服務優化


3. linux內核優化

3.1 linux 默認值 open files 和 max user processes 為 1024

#ulimit -n

1024

#ulimit –u

1024

問題描述:

說明server只允許同時打開1024個文件,處理1024個用戶進程,使用ulimit -a 可以查看當前系統的所有限制值,使用ulimit -n可以查看當前的最大打開文件數。新裝的linux 默認只有1024,當作負載較大的服務器時,很容易遇到error: too many open files 。

解決方法:

使用 ulimit –n 65535 可即時修改,但重啟後就無效了。

有如下三種修改方式:

在/etc/security/limits.conf 最後增加:

* soft nofile 65535

* hard nofile 65535

* soft nproc 65535

* hard nproc 65535

3.2 其他的linux配置優化


性能優化|Tomcat 服務優化


net.ipv4.tcp_syncookies = 1 開啟SYN Cookies。當出現SYN等待隊列溢出時,啟用cookies來處理,可防範少量SYN攻擊;
net.ipv4.tcp_tw_reuse = 1 開啟重用。允許將TIME-WAIT sockets重新用於新的TCP連接,默認為0
net.ipv4.tcp_tw_recycle = 1 開啟TCP連接中TIME-WAIT sockets的快速回收,默認為0,表示關閉。
net.ipv4.tcp_fin_timeout = 30 如果套接字由本端要求關閉,它決定了它保持在FIN-WAIT-2狀態的時間。
net.ipv4.tcp_keepalive_time = 1200 當keepalive起用的時候,TCP發送keepalive消息的頻度。缺省是2小時
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3 probe 3次(每次30秒)不成功,內核才徹底放棄。
tcp_keepalive_time = 7200 seconds (2 hours)
tcp_keepalive_probes = 9
tcp_keepalive_intvl = 75 seconds
net.ipv4.ip_local_port_range = 1024 65000 用於向外連接的端口範圍。缺省情況下很小:32768到61000,改為1024到65000。
net.ipv4.tcp_max_syn_backlog = 8192 SYN隊列的長度,默認為1024,加大隊列長度為8192,可以容納更多等待連接的網絡連接數。
net.ipv4.netdev_max_backlog = 1000 表示進入包的最大設備隊列,默認300,改大
net.core.tcp_max_tw_buckets = 5000 系統同時保持TIME_WAIT套接字的最大數量,如果超過這個數字,TIME_WAIT套接字將立刻被清除並打印警告信息。默認為180000,改為 5000。
另外可以參考優化內核配置:
/proc/sys/net/core/wmem_max 最大socket寫buffer,可參考的優化值:873200
/proc/sys/net/core/rmem_max 最大socket讀buffer,可參考的優化值:873200

/proc/sys/net/ipv4/tcp_wmem TCP寫buffer,可參考的優化值: 8192 436600 873200
/proc/sys/net/ipv4/tcp_rmem TCP讀buffer,可參考的優化值: 32768 436600 873200
/proc/sys/net/ipv4/tcp_mem
同樣有3個值,意思是:配置單位為頁,不是字節
net.ipv4.tcp_mem[0]:低於此值,TCP沒有內存壓力. 786432
net.ipv4.tcp_mem[1]:在此值下,進入內存壓力階段. 1048576
net.ipv4.tcp_mem[2]:高於此值,TCP拒絕分配socket. 1572864
/proc/sys/net/core/somaxconn 256
listen()的默認參數,掛起請求的最大數量.默認是128.對繁忙的服務器,增加該值有助於網絡性能.
/proc/sys/net/core/optmem_max socket buffer的最大初始化值,默認10K.
/proc/sys/net/ipv4/tcp_retries2 TCP失敗重傳次數,默認值15.減少到5,以儘早釋放內核資源.
net.core.somaxconn = 32768 socket監聽(listen)的backlog上限,是socket的監聽隊列。比如nginx定義
NGX_LISTEN_BACKLOG默認到511


4. nginx優化

1. worker_processes 8;nginx 進程數,建議按照cpu 數目來指定,一般為它的倍數 (如,2個四核的cpu計為8)。

2. worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;為每個進程分配cpu,上例中將8個進程分配到8個cpu,當然可以寫多個,或者將一個進程分配到多個cpu。

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

查看linux系統文件描述符的方法:

[root@web001 ~]# sysctl -a | grep fs.file

fs.file-max = 789972

fs.file-nr = 510 0 789972

4. use epoll; 使用epoll 的I/O 模型

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

6. keepalive_timeout 60;keepalive 超時時間。

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

[root@web001 ~]# getconf PAGESIZE

4096

但也有client_header_buffer_size超過4k的情況,但是client_header_buffer_size該值必須設置為“系統分頁大小”的整倍數。

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

9. open_file_cache_valid 80s;這個是指多長時間檢查一次緩存的有效信息。

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

性能優化|Tomcat 服務優化


四、集群優化

當線程數達到250以上,考慮群集部署,集群部署需要考慮的兩個問題:Tomcat部署和session共享,Tomcat<4時,可用tomcat內部的集群session共享,否則採用redis方式集群

集群部署原理圖:

性能優化|Tomcat 服務優化


redis實現session共享的原理

性能優化|Tomcat 服務優化


Redis實現seesion共享的步驟如下:

1. 下載以下包放到tomcat的lib目錄下

TomcatRedisSessionManager-1.1 .jar

Jredis-2.8.0.jar

Commons-logging-1.2.jar

Commons-pool2-2.4.1.jar

2. 在tomcat裡面增加如下配置



創建一個redis的配置文件redis-data-cache.properties,放在conf.d目錄

redis.hosts=127.0.0.1:6379
redis.cluster.enabled=false
#- redis database (default 0)
#redis.database=0
#- redis connection timeout (default 2000)
#redis.timeout=2000

五、壓力測試

Ab測試

吞吐率(Requests per second):總請求數 / 處理完成這些請求數所花費的時間

併發連接數(The number of concurrent users,Concurrency Level):一個用戶可能同時會產生多個會話,也即連接數

用戶平均請求等待時間(Time per request):處理完成所有請求數所花費的時間/ (總請求數 / 併發用戶數)

服務器平均請求等待時間(Time per request: across all concurrent requests)計 算 公 式 : 處 理 完 成 所 有 請 求 數 所 花 費 的 時 間 / 總 請 求 數

使用示例:

ab –n 1000 –c 100 url/

如果只用到一個Cookie,那麼只需鍵入命令:

ab -n 100 -C key=value http://test.com/

如果需要多個Cookie,就直接設Header:

ab -n 100 -H “Cookie: Key1=Value1; Key2=Value2” http://test.com/

關注我,私信回覆我“666"或者“Java架構"獲取免費的Java架構學習資料(裡面有高可用、高併發、高性能及分佈式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!


分享到:


相關文章: