Nginx和Tomcat調優


一、Nginx和Tomcat定義

  tomcat 是一個中間件,在B/S架構中,瀏覽器發出的http請求經過tomcat中間件,轉發到最終的目的服務器上,響應消息再通過tomcat返回給瀏覽器。tomcat更多用來做一個應用容器,讓java web跑在里面的東西。

  nginx 常用做靜態內容服務和反向代理服務器,以及頁面前端高並發服務器。適合做負載均衡,直面外來請求轉發給后面的應用服務(tomcat什么的)。

  nginx+tomcat響應速度明顯要低於直接請求tomcat,性能不如直接請求tomcat,但是nginx由於多了中間一層轉發,使得請求壓力不會一次性都集中在tomcat上,因此nginx+tomcat的CPU明顯低於直接請求tomcat,也大大避免了因請求量過大導致tomcat服務不可用。

  單點tomcat在不使用nginx的情況下,能承載的最多也就是200-300的並發量,而加上了nginx之后,能大幅度提升服務器的並發承載量,不僅僅是因為nginx可以做負載均衡(load-banlance),更重要的是nginx可以讓請求進行排隊,而不是將壓力賦予給tomcat,這樣tomcat可以更加專注地完成業務操作,從而提高性能。

 

二、Nginx調優

  這里只說nginx的簡單優化,即讓nginx處理html靜態文件,圖片,css,js等非動態文件,動態文件交給tomcat處理,這樣的話可以減輕tomcat的壓力,再說對於這些靜態文件來說,不是tomcat的強項,而是nginx的強項。

 2.1 靜態資源配置

 請在nginx.conf中添加如下配置

location ~ .*\.(gif|jpg|jpeg|png|bmp|ico)$ {
root /www/; #即圖片存在的根路徑
expires 30d;#緩存時間
}

location ~ .*\.(js|css)?$ {
root /www/;#即圖文件存在的根路徑
expires 10h;#緩存時間
}
2.2 進程數的優化

一般nginx中,進程數一般設置為服務器cpu核數的倍數,例如:CPU為雙核,則設置進程數目為4或者8,每個nginx進程消耗的內存10兆的模樣

worker_processes 8;
2.3 將進程分配給制定CPU

假如是8核 cpu 分配如下:

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000
2.4 Nginx最大打開文件數

當使用linux時,最大文件打開數是有限制的。在linux中可使用ulimit –n來查看最大文件打開數,一般設置值為系統最大文件打開數除以最大進程數,但是大多數都是除不盡,導致資源分配不均勻,所以最好與最大進程數一致

worker_rlimit_nofile 655350;
2.5 Nginx的事件模型

使用epoll 的I/O 模型

use epoll;

補充說明:
與apache相類,nginx針對不同的操作系統,有不同的事件模型

A)標准事件模型
Select、poll屬於標准事件模型,如果當前系統不存在更有效的方法,nginx會選擇select或poll

B)高效事件模型
Kqueue:使用於 FreeBSD 4.1+, OpenBSD 2.9+, NetBSD2.0 和 MacOSX. 使用雙處理器的MacOSX系統使用kqueue可能會造成內核崩潰。

Epoll: 使用於Linux內核2.6版本及以后的系統。

/dev/poll:使用於 Solaris 7 11/99+, HP/UX 11.22+(eventport), IRIX 6.5.15+ 和 Tru64UNIX 5.1A+。

Eventport:使用於 Solaris 10. 為了防止出現內核崩潰的問題,有必要安裝安全補丁。

2.6 最大連接數

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

worker_connections 655350;
2.7 超時時間

設置超時時間,默認的是60s,Nginx會自動踢出超時的連接,保持可用性。

keepalive_timeout 90;
2.8 客戶端請求頭部緩沖區大小

  客戶端請求頭部的緩沖區大小,這個可以根據你的系統分頁大小來設置,一般一個請求頭的大小不會超過1k,不過由於一般系統分頁都要大於1k,所以這里設置為分頁小。

在Linux中,使用getconf PAGESIZE 來獲得,並設置給nginx

client_header_buffer_size4k;

打開文件緩存大小

這個默認是沒有開啟的,此參數將為打開文件指定緩存大小

open_file_cachemax=65535 inactive=60s;

open_file_cachemax為最大緩存大小,inactive為緩存多久沒使用就進行回收

2.9 檢查緩存有效信息時間
open_file_cache_valid80s;
open_file_cache_min_uses1;

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

2.10 開啟gzip
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;

nginx的5種負載均衡算法請跟進自身業務需要選擇,此處不做闡述。

 

三、Tomcat調優

3.1 基礎參數設置

在server.xml中配置
maxThreads:Tomcat使用線程來處理接收的每個請求。這個值表示Tomcat可創建的最大的線程數。
acceptCount:指定當所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理。
connnectionTimeout:網絡連接超時,單位:毫秒。設置為0表示永不超時,這樣設置有隱患的。通常可設置為30000毫秒。
minSpareThreads:Tomcat初始化時創建的線程數。
maxSpareThreads:一旦創建的線程超過這個值,Tomcat就會關閉不再需要的socket線程
3.2 Tomat的4種連接方式對比

tomcat默認的http請求處理模式是bio(即阻塞型,下面第二種),每次請求都新開一個線程處理。下面做一個介紹

<Connector port="8081" protocol="org.apache.coyote.http11.Http11NioProtocol" 
  connectionTimeout="20000" redirectPort="8443"/>
<Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000"
  redirectPort="8443"/>
<Connector executor="tomcatThreadPool"
  port="8081" protocol="HTTP/1.1"
  connectionTimeout="20000"
  redirectPort="8443" />
<Connector executor="tomcatThreadPool"
  port="8081" protocol="org.apache.coyote.http11.Http11NioProtocol"
  connectionTimeout="20000"
  redirectPort="8443" />

我們姑且把上面四種Connector按照順序命名為 NIO, HTTP, POOL, NIOP。測試性能對比,數值為每秒處理的請求數,越大效率越高

NIO   HTTP   POOL  NIOP
281   65     208    365
666   66     110    398
692   65     66     263
256   63     94     459
440   67     145    363

得出結論:NIOP > NIO > POOL > HTTP 雖然Tomcat默認的HTTP效率最低,但是根據測試次數可以看出是最穩定的。且這只是一個簡單頁面測試,具體會根據復雜度有所波動。

配置參考:Linux系統每個進程支持的最大線程數是1000,windos是2000。具體跟服務器的內存,Tomcat配置的數量有關聯。

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
              maxThreads="500" minSpareThreads="25" maxSpareThreads="250"
              enableLookups="false" redirectPort="8443" acceptCount="300" connectionTimeout="20000" disableUploadTimeout="true"/>  
3.3  Tomcat的集群

Tomcat的部署,是一台服務器部署一個Tomcat(上線多個項目),還是一台服務器部署多個tomact(每個tomcat部署1~n個項目)。多核必選配置多個Tomcat,微服務多線程的思想模式。

3.4  Tomcat內存設置

修改/bin/catalina.sh,增加如下設置:

JAVA_OPTS='-Xms【初始化內存大小】 -Xmx【可以使用的最大內存】'

需要把這個兩個參數值調大,大小的可以根據服務器內存的大小進行調整。例如:

JAVA_OPTS='-Xms1024m –Xmx2048m'

服務器是8G 內存,跑了3個tomcat服務,給分配了2G的內存,因為還有其他進程。

 

以8核16G的服務器為例,服務器單點原本沒配置優化參數,服務器承載量為1000個並發量,配置成功后,服務器動態並發訪問為3000,按照並發適度冗余的原則同時在線用戶為(3000/0.15=20000)。因此證明參數的配置非常有用,可以提高服務器的穩定性和性能。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM