關於Linux環境調優(tomcat)

序言

首先需要了解服務器的內存和cpu情況.然後根據服務器的配置情況設置java的相關環境.並且可以查看各個進程中的使用情況

 

Linux相關命令

Free命令--內存(top命令也可以顯示內存使用情況,但是不能設置單位)

free 命令顯示系統使用和空閒的內存情況,包括物理內存、交互區內存(swap)和內核緩衝區內存。

命令 註釋
free 以Kb爲單位顯示內存容量
free -m 以Mb爲單位顯示內存容量
free -g 已Gb爲單位顯示內存容量

系統根據不同的顯示單位展示如下:

參數說明如下:

  • Mem:表示物理內存統計,如果機器剩餘內存非常小,一般小於總內存的20%,則判斷爲系統物理內存不夠
  • Swap: 表示硬盤上交換分區的使用情況,如剩餘空間較小,需要留意當前系統內存使用情況及負載,當Swap的used值大於0時,則表示操作系統物理內存不夠,已經開始使用硬盤內存了。
  • total:表示物理內存統計
  • used:表示總計分配給(包含buffers與cache)使用的數量,但其中可能部分緩存並未實際使用
  • free:表示未被分配的內存
  • shared:表示共享內存
  • buff/cache:表示系統分配但未被使用的buffers數量
  • available:表示系統分配但未被使用的available數量

 

        查看系統中各線程佔用內存百分比的情況:(執行以上命令可查看各個程序進程內存使用的內存情況,如下圖所示,第一列爲進程佔用的內存百分比,可以看到哪些應用程序佔的內存比較多,用於排查問題)

# 如下的命令感覺比Top要好點,可以看執行命令的全路徑,這樣就比簡寫要好點.

ps -eo pmem,pcpu,rss,vsize,args | sort -k 1 -r | less


 

輸入命令後顯示如下的內容:

  • %MEM : 表示進程佔用的內存百分比
  • %CPU : 表示進程佔用的CPU百分比

 

Top命令--包括內存,cup,進程的使用情況

top 命令查看系統的實時負載, 包括進程、CPU負載、內存使用等等;

直接輸入top命令,可以看到如下圖所示的的信息.其中上半部分是內存的使用情況,下面是各個進程的使用情況.

 

上半部分--這部分感覺也很重要

上半部分如下圖.主要屆時下 %Cpu部分參數的意思.下面的就是free的部分可以看上面的free註釋

 

  • us: 用戶空間佔用CPU百分比
  • sy: 內核空間佔用CPU百分比
  • ni: 用戶進程空間內改變過優先級的進程佔用CPU百分比
  • id: 空閒CPU百分比
  • wa: 等待輸入輸出CPU時間百分比
  • hi: CPU服務於硬件中斷所耗費的時間總額
  • si: CPU服務軟中斷所耗費的時間總額
  • st: Steal Time. 如果你想要部署虛擬環境(例如:Amazon EC2), steal time就是你想要關注的性能指標之一。 如果這個指標的數值很高,那麼說明機器狀態非常糟糕

 

下半部分--這部分比較簡單

  • PID: 進程ID
  • User: 進程所有者
  • PR: 優先級
  • NI: nice值,負值表示高優先級,正直表示低優先級
  • VIRT: 進程使用的虛擬內存總量
  • RES: 進程使用的,未被換出的物理內存大小
  • SHR: 共享內存大小
  • S: 進程狀態
  • %CPU: 上次更新到現在的CPU時間佔用百分比
  • %MEM: 進程使用的物理內存百分比
  • TIME+: 進程使用CPU總時間
  • COMMAND:命令名,命令行

top命令其它

       進入top的實時界面後,默認按照CPU的使用率排序,通過“shift+m”按鍵將進程按照內存使用情況排序,可以查看哪些進程是當前系統中的內存開銷“大戶”。

       top命令中,按下 f 鍵,進入選擇排序列的界面,這裏可以選擇要顯示的信息列,要按照哪些信息列進行排序等,參照紅框的說明來選擇是否顯示那些列就行,標*的就是顯示

 

CUP個數與cpu內核數

  注意Netty的work默認2倍核心數,o密集型2倍核心數,計算密集型1倍核心數,避免線程上下文切換帶來的開銷。

# 總核數 = 物理CPU個數 X 每顆物理CPU的核數 
# 總邏輯CPU數 = 物理CPU個數 X 每顆物理CPU的核數 X 超線程數


# 查看物理CPU個數
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l


# 查看每個物理CPU中core的個數(即核數)
cat /proc/cpuinfo| grep "cpu cores"| uniq


# 查看邏輯CPU的個數
cat /proc/cpuinfo| grep "processor"| wc -l

 

tomcat參數優化

 

\bin\catalina.sh設置JAVA_OPTS

在catalina.sh的cygwin=false這句話之前加上Java_opts

JDK 1.8中 PermSize 和 MaxPermGen 已經無效。JDK 1.8 中已經不存在永久代的結論 而以 元空間 代替。

用例如下所示:

JAVA_OPTS="$JAVA_OPTS -server -Xms2048M -Xmx3072M -Xss1024k
-XX:+AggressiveOpts
-XX:+UseParallelGC -XX:+UseBiasedLocking"

 

  • -server:   一定要作爲第一個參數,在多個 CPU 時性能佳,還有一種叫 -client 的模式,特點是啓動速度比較快,但運行時性能和內存管理效率不高,通常用於客戶端應用程序或開發調試,在 32 位環境下直接運行 Java 程序默認啓用該模式。Server 模式的特點是啓動速度比較慢,但運行時性能和內存管理效率很高,適用於生產環境,在具有 64 位能力的 JDK 環境下默認啓用該模式,可以不配置該參數。

  • -Xms:  爲初始化內存,直接與最大內存一致,這樣可以避免內存重複分配,降低效率,直接上來就是最大的,jvm也不用再擴展內存了,節省時間。

  • -Xmx:  表示最大 Java 堆大小,當應用程序需要的內存超出堆的最大值時虛擬機就會提示內存溢出,並且導致應用服務崩潰,因此一般建議堆的最大值設置爲可用內存的最大值的80%(也有說物理內存的一半)如何知道我的 JVM 能夠使用最大值,使用 java -Xmx512M -version 命令來進行測試,然後逐漸的增大 512 的值,如果執行正常就表示指定的內存大小可用,否則會打印錯誤信息,默認值爲物理內存的 1/4,默認(MinHeapFreeRatio參數可以調整)空餘堆內存大於 70% 時,JVM 會減少堆直到-Xms 的最小限制
  • -Xmn:  新生代的內存空間大小,注意:此處的大小是(eden+ 2 survivor space)。與 jmap -heap 中顯示的 New gen 是不同的。整個堆大小 = 新生代大小 + 老生代大小 + 永久代大小在保證堆大小不變的情況下,增大新生代後,將會減小老生代大小。    (此值對系統性能影響較大,Sun官方推薦配置爲整個堆的 3/8。一般設置爲Xmx的3、4分之一)
  • -Xss:   是每個線程所佔用的內存,也就是每個線程的堆棧大小,太小了容易溢出,太大了會導致創建的線程數量減少,因爲最大容量是有限的。這裏最大內存爲1280M,理論上可以創建1000個左右線程,差不多支持500個併發訪問(是併發訪問哦,也就是500個用戶同一時刻點擊),已經相當可以了。表示每個 Java 線程堆棧大小,JDK 5.0 以後每個線程堆棧大小爲 1M,以前每個線程堆棧大小爲 256K。根據應用的線程所需內存大小進行調整,在相同物理內存下,減小這個值能生成更多的線程,但是操作系統對一個進程內的線程數還是有限制的,不能無限生成,經驗值在 3000~5000 左右。一般小的應用, 如果棧不是很深, 應該是128k 夠用的,大的應用建議使用 256k 或 512K,一般不易設置超過 1M,要不然容易出現out ofmemory。這個選項對性能影響比較大,需要嚴格的測試。

  • -XX:+AggressiveOpts:  作用如其名(aggressive),啓用這個參數,則每當 JDK 版本升級時,你的 JVM 都會使用最新加入的優化技術(如果有的話)。
  • -XX:+UseParallelGC:  設置爲並行收集器。此配置僅對年輕代有效。即年輕代使用並行收集,而年老代仍使用串行收集。
  • -XX:+UseBiasedLocking: 啓用一個優化了的線程鎖,我們知道在我們的appserver,每個http請求就是一個線程,有的請求短有的請求長,就會有請求排隊的現象,甚至還會出現線程阻塞,這個優化了的線程鎖使得你的appserver內對線程處理自動進行最優調配。
  • -XX:NewSize:設置新生代內存大小。
  • -XX:MaxNewSize:設置最大新生代新生代內存大小
  • -XX:PermSize:設置持久代內存大小.
  • -XX:MaxPermSize:設置最大值持久代內存大小,永久代不屬於堆內存,堆內存只包含新生代和老年代。

 

通過Tomcat檢查設置是否起效

  • 1.首先在conf/tomcat-users.xml文件裏面,在</tomcat-users>前面添加如下代碼
<role rolename="manager-gui"/>  

# username就是登陸賬號 password就是密碼

<user password="admin" roles="manager-gui" username="tomcat"/>  
  • 2. 修改/webapps/manager/META-INF/目錄下context.xml文件,如下:

<Valve className="org.apache.catalina.valves.RemoteAddrValve"  
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|\d+\.\d+\.\d+\.\d+" />  

  • 4.查看確認所分配的內存

 

 

 

./conf/server.xml調優

 

連接池

打開被註釋的默認連接池配置,並改成如下內容

<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的值, 不設置trueminSpareThreads  的值就沒啥效果了 。
  • maxQueueSize: 最大的等待隊列數,超過則拒絕請求

連接配置

修改連接配置並改成如下內容:

<Connector port="8080" protocol="HTTP/1.1"  
        connectionTimeout="20000"  
        redirectPort="8443"    
        executor="tomcatThreadPool"  
        enableLookups="false"   
        maxIdleTime="60000"
        acceptCount="100"   
        maxPostSize="10485760" 
        acceptorThreadCount="2"    
        disableUploadTimeout="true"   
        URIEncoding="utf-8"
        keepAliveTimeout ="6000"  
        maxKeppAliveRequests="500"  />  
  • port:連接端口。  
  • protocol:連接器使用的傳輸方式。  
  • executor: 連接器使用的線程池名稱
  • enableLookups:禁用DNS  查詢
  • maxIdleTime:線程空閒時間,超過該時間後,空閒線程會被銷燬,默認值爲6000(1分鐘),單位毫秒。
  • acceptCount:指定當所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理,默認設置 100 。
  • maxPostSize:限制 以FORM URL 參數方式的POST請求的內容大小,單位字節,默認是 2097152(2兆),10485760 爲 10M。如果要禁用限制,則可以設置爲 -1。
  • acceptorThreadCount: 用於接收連接的線程的數量,默認值是1。一般這個指需要改動的時候是因爲該服務器是一個多核CPU,如果是多核 CPU 一般配置爲 2。
  • disableUploadTimeOut:允許Servlet容器,正在執行使用一個較長的連接超時值,以使Servlet有較長的時間來完成它的執行,默認值爲false
  • keepAliveTimeout - 表示在下次請求過來之前,tomcat保持該連接多久。這就是說假如客戶端不斷有請求過來,且未超過過期時間,則該連接將一直保持。
  • maxKeepAliveRequests -表示該連接最大支持的請求數。超過該請求數的連接也將被關閉(此時就會返回一個Connection: close頭給客戶端)。 (maxKeepAliveRequests="1"代表禁用長連接)(1表示禁用,-1表示不限制個數,默認100個。一般設置在100~200之間)

 

關於tomcat的壓縮

      壓縮會增加Tomcat負擔,最好採用Nginx + Tomcat 或者 Apache + Tomcat 方式,壓縮交由Nginx/Apache 去做。

      Tomcat 的壓縮是在客戶端請求服務器對應資源後,從服務器端將資源文件壓縮,再輸出到客戶端,由客戶端的瀏覽器負責解壓縮並瀏覽。相對於普通的 瀏覽過程 HTML、CSS、Javascript和Text,它可以節省40% 左右的流量。更爲重要的是,它可以對動態生成的,包括CGI、PHP、JSP、ASP、Servlet,SHTML等輸出的網頁也能進行壓縮,壓縮效率也很高。

 

Tomcat的IO優化

       即修改Tomcat Connector運行模式,Tomcat Connector(Tomcat連接器)有bionioapr三種運行模式。

  • BIO: 同步阻塞IO,每個請求都要創建一個線程來處理,線程開銷比較大,tomcat7或以下,在Linux系統中默認使用這種方式。缺點:併發量高時,線程數較多,浪費資源。
  • NIO: 異步非阻塞IO,利用Java的異步IO處理可以通過少量的線程處理大量的請求,Tomcat8在Linux系統中默認使用這種方式。Tomcat7必須修改Connector的protocol屬性配置來啓動:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" 
         connectionTimeout="20000" redirectPort="8443"/> 

 

  • APR: 大殺器APR,即Apache Portable Run-time libraries,從操作系統層面解決io阻塞問題。apr也是在Tomcat上運行高併發應用的首選模式.Tomcat7或Tomcat8在Win7或以上的系統中啓動默認使用這種方式。Linux如果安裝了aprnative,Tomcat直接啓動就支持apr.(這個詳細的使用暫時,後面有空在寫清楚點[email protected])

 

Linux的TCP

 

 Linux系統優化-調大TCP最大連接數

   linux作爲服務器,當socket運行高併發TCP程序時,通常會出現連接建立到一定個數後不能再建立連接的情況生產環境下,多次測試,發現每次連接建立到1000左右時,再也不能建立tcp連接,爲什麼呢?

      這是因爲在Linux平臺上,無論編寫客戶端程序還是服務端程序,在進行高併發TCP連接處理時,最高的併發數量都要受到系統對用戶單一進程同時可打開文件數量的限制(這是因爲系統爲每個TCP連接都要創建一個socket句柄,每個socket句柄同時也是一個文件句柄)。爲了調大TCP最大連接數,必須修改用戶進程可打開文件數限制。

 

查看系統允許當前用戶進程打開的文件數限制

ulimit -n 

這表示當前用戶的每個進程最多允許同時打開1024個文件,默認也是1024

修改/etc/security/limits.conf文件,在文件最後添加如下內容:
 

vim /etc/security/limits.conf

添加

root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535

 

  • 第1個參數指定修改root用戶的打開文件數限制,可用’*'號表示修改所有用戶的限制;
  • 第2個參數softhard指定要修改軟限制還是硬限制;
  • 第3個參數65535則指定了想要修改的新的限制值,即最大打開文件數(請注意軟限制值要小於 或等於硬限制) nofile有上限,不是無窮大,nofile 65535即上限爲65535

        再次查看一下可以發現件數限制已變爲:65535(有的Linux操作系統,如(Ubuntu)不允許配置 * ,ubuntu的root用戶必須寫出來,其它用戶可用*代替)  這個需要重啓系統後才能生效.

 

查看Linux系統級的最大打開文件數限制,使用如下命令

每臺服務器有可能不一樣,是Linux系統在啓動時根據系統硬件資源狀計算

cat /proc/sys/fs/file-max   #我的是584864 這個根據服務器硬件計算得出的

這表明這臺Linux系統最多允許同時打開(即包含所有用戶打開文件數總和)95288個文件,是Linux系統級硬限制,所有用戶級的打開文件數限制都不應超過這個數值。通常這個系統級硬限制是Linux系統在啓動時根據系統硬件資源狀況計算出來的最佳的最大同時打開文件數限制,如果沒有特殊需要,不應該修改此限制,除非想爲用戶級打開文件數限制設置超過此限制的值

 

 Linux系統優化-TCP/IP內核參數優化

修改 /etc/sysctl.conf
生效: sysctl -p

net.ipv4.tcp_mem = 196608  262144  393216  
#(4G 內存機器 使用,TCP連接最多約使用1.6GB內存 , 393216*4096/1024/1024=1.6G)
#內核分配給TCP連接的內存,單位是Page,1 Page = 4096 Bytes

net.ipv4.tcp_mem = 524288  699050  1048576  
#(8G 內存使用,TCP連接最多約使用4GB內存)         

#爲每個TCP連接分配的讀、寫緩衝區內存大小,單位是Byte
net.ipv4.tcp_rmem = 4096      8192    4194304
net.ipv4.tcp_wmem = 4096      8192    4194304
#                  最小內存  缺省內存  最大內存
# 一般按照缺省值分配,上面的例子就是讀寫均爲8KB,共16KB
#1.6G 內存服務器, TCP內存能容納的連接數,約爲  1600MB/16KB = 100K = 10萬
#4.G TCP內存能容納的連接數,約爲  4000MB/16KB = 250K = 25萬

net.core.somaxconn= 4000
#(端口最大的監聽隊列的長度)
#同時,修改下全局配置
# echo 4000 > /proc/sys/net/core/somaxconn 定義了系統中每一個端口最大的監聽隊列的長度,這是個全局的參數,默認值爲128,

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,表示關閉;

net.ipv4.tcp_fin_timeout = 30
#修改系統默認的 TIMEOUT 時間。

net.ipv4.tcp_keepalive_time = 1200  
#表示當keepalive起用的時候,TCP發送keepalive消息的頻度。缺省是2小時,改爲20分鐘。

net.ipv4.ip_local_port_range = 10000 65000  
#表示用於向外連接的端口範圍。缺省情況下很小:32768到61000,改爲10000到65000。
#(注意:這裏不要將最低值設的太低,否則可能會佔用掉正常的端口!)

net.ipv4.tcp_max_syn_backlog = 8192
#表示SYN隊列的長度,默認爲1024,加大隊列長度爲8192,可以容納更多等待連接的網絡連接數。

net.ipv4.tcp_max_tw_buckets = 5000
#表示系統同時保持TIME_WAIT的最大數量,如果超過這個數字,TIME_WAIT將立刻被清除並打印警告信息。默 認爲180000,改爲5000。

net.ipv4.tcp_max_orphans = 65536
#當orphans達到32768個時,會報Out of socket memory,此時佔用內存 32K*64KB=2048MB=2GB
#(每個孤兒socket可佔用多達64KB內存),實際可能小一些

net.ipv4.tcp_orphan_retries = 1
#孤兒socket廢棄前重試的次數,重負載web服務器建議調小,設置較小的數值,可以有效降低orphans的數量

net.ipv4.tcp_retries2
#活動TCP連接重傳次數,超過次數視爲掉線,放棄連接。缺省值:15,建議設爲 2或者3.

net.ipv4.tcp_synack_retries
#TCP三次握手的syn/ack階段,重試次數,缺省5,設爲2-3

net.core.netdev_max_backlog = 2048
# 網絡設備的收發包的隊列大小

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章