系統優化怎麼做-Tomcat優化

来源:https://www.cnblogs.com/changsong/archive/2018/08/04/9417879.html
-Advertisement-
Play Games

大家好,這裡是「聊聊系統優化 」,併在下列地址同步更新 博客園:http://www.cnblogs.com/changsong/ 知乎專欄:https://zhuanlan.zhihu.com/youhua 全網私活,免費訂閱: http://www.zsihuo.com 在這裡我會從基於J2EE ...


大家好,這裡是「聊聊系統優化 」,併在下列地址同步更新

在這裡我會從基於J2EE系統及互聯網架構方面,來談談系統優化的各個方面,乾貨滿滿,歡迎訂閱及關註!

 

前言

Tomcat作為Web應用的伺服器,目前絕大多數公司都是用其作為應用伺服器的,應用伺服器的執行效率會影響系統執行,這裡會講Tomcat怎樣進行配置能提高處理性能。另外必須提到對應的JVM參數的優化的一些經驗。

Tomcat運行模式

分3種模式: bio,nio,apr 一般使用nio模式
bio效率低,apr對系統配置有一些比較高的要求

確認Tomcat的運行模式

配置文件 server.xml
<Executor name="tomcatThreadPool" 
namePrefix="catalina-exec-" 
maxThreads="1024" 
minSpareThreads="512" 
prestartminSpareThreads="true" />

 

關鍵配置

maxThreads

最大線程數, 預設是200

minSpareThread

最小活躍線程數, 預設是25

maxQueueSize

最大的等待隊列個數,超過則請求拒絕預設值是Integer.MAX_VALUE ,一般不改變。在某些緊急狀態修複問題需要調整

連接器(Connector)優化

Connector是連接器,負責接收客戶的請求,以及向客戶端回送響應的消息。所以Connector的優化是重要部分。預設情況下 Tomcat只支持200線程訪問,超過這個數量的連接將被等待甚至超時放棄,所以我們需要提高這方面的處理能力。

nio配置- server.xml

<Connector port="14081" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
executor="tomcatThreadPool" 
URIEncoding="UTF-8" 
compression="on"   
useBodyEncodingForURI="true" 
enableLookups="false" 
redirectPort="14443" />

影響性能配置

  • protocol
org.apache.coyote.http11.Http11Protocol - 阻塞式的Java連接器
org.apache.coyote.http11.Http11NioProtocol - 不阻塞Java連接器
org.apache.coyote.http11.Http11AprProtocol - APR / native 連接器
選擇不阻塞ava連接器
  • enableLookups
若是你想request.getRemoteHost()的調用履行,以便返回的長途客戶端的實際主機名的DNS查詢,則設置為true。設置為false時跳過DNS查找,並返回字元串的IP地址(從而提高性能)。預設場景下,禁用DNS查找
  • compression
設置成on,開啟壓縮

禁用AJP鏈接器

使用Nginx+tomcat的架構,用不著AJP協議,所以把AJP連接器禁用
server.xml註釋掉一下配置
  <Connector port="8019" protocol="AJP/1.3" redirectPort="8443" />

優化JVM

/bin/catalina.sh

修改JAVA_OPTS參數
這裡需要參照機器配置,對JVM進行參數優化

JDK1.7

JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms512m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=1024M -XX:PermSize=1024m -XX:MaxPermSize=1024m -XX:+DisableExplicitGC"

JDK1.8

JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=1024M -XX:+DisableExplicitGC"

 

1.8 版本中已經沒有PermSize、MaxPermSize

JAVA8里對metaspace可以在小範圍自動擴展永生代避免溢出。

參數說明

  • -Djava.awt.headless
沒有設備、鍵盤或滑鼠的模式。
  • -Dfile.encoding
設置字元集
  • -server
vm的server工作模式,對應的有client工作模式。使用“java -version”可以查看當前工作模式
  • -Xms1024m
初始Heap大小,使用的最小記憶體
  • -Xmx1024m
Java heap最大值,使用的最大記憶體
經驗: 設置Xms大小等於Xmx大小
  • -XX:NewSize=512m
表示新生代初始記憶體的大小,應該小於 -Xms的值
  • -XX:MaxNewSize=1024M
表示新生代可被分配的記憶體的最大上限,應該小於 -Xmx的值
  • -XX:PermSize=1024m
設定記憶體的永久保存區域,記憶體的永久保存區域,VM 存放Class 和 Meta 信息,JVM在運行期間不會清除該區域

程式載入很多class情況下,超出PermSize情況下

JDK1.7會拋出java.lang.OutOfMemoryError: PermGen space異常

JDK1.8下會拋出 ERROR: java.lang.OutOfMemoryError: Metadata space 異常

  • -XX:MaxPermSize=1024m
設定最大記憶體的永久保存區域
經驗: 設置PermSize大小等於MaxPermSize大小
  • -XX:+DisableExplicitGC
自動將System.gc()調用轉換成一個空操作,即應用中調用System.gc()會變成一個空操作,避免程式員在代碼里進行System.gc()這種危險操作。System.gc() 除非是到了萬不得也的情況下不使用,都交給JVM吧

其他優化參數

  • -XX:SurvivorRatio=2
年輕代中Eden區與Survivor區的大小比值
  • -XX:ReservedCodeCacheSize=256m
保留代碼占用的記憶體容量,無大的影響
  • -Xss1024k
單個線程堆棧大小值,減少這個值可以生成更多線程,操作系統對於一個進程內的線程數是有限制的,經驗值在3000-5000左右
  • -XX:+CMSParallelRemarkEnabled
CMS 垃圾回收演算法,對響應時間的重要性需求 大於 對吞吐量的要求,能夠承受垃圾回收線程和應用線程共用處理器資源,並且應用中存在比較多的長生命周期的對象的應用
  • -XX:+UseCMSCompactAtFullCollection
在使用concurrent gc 的情況下, 防止 memoryfragmention, 對live object 進行整理, 使 memory 碎片減少。
  • -XX:+UseCMSInitiatingOccupancyOnly
在FULL GC的時候, 對年老代的壓縮。CMS是不會移動記憶體的, 因此這個非常容易產生碎片, 導致記憶體不夠用, 因此, 記憶體的壓縮這個時候就會被啟用。 增加這個參數是個好習慣。可能會影響性能,但是可以消除碎片。
  • -XX:CMSInitiatingOccupancyFraction=60
使用cms作為垃圾回收, 使用60%後開始CMS收集
  • -XX:+UseGCOverheadLimit
用來限制使用記憶體,如果不做控制,可能會報出
java.lang.OutOfMemoryError: GC overhead limit exceeded
  • -XX:+UseConcMarkSweepGC
使用CMS記憶體收集
  • -XX:+UseParNewGC
設置年輕代為並行收集
  • -XX:+HeapDumpOnOutOfMemoryError
  • -XX:HeapDumpPath=/x/dump_tomcat.hprof
JVM會在遇到OutOfMemoryError時拍攝一個“堆轉儲快照”,並將其保存在一個文件中。
  • -Xloggc:/xx/gc_tomcat.log
gc的日誌,如果該日誌中出現頻繁的Full GC就是有相關的系統問題,如果很少,說明暫時還算正常
  • -XX:+PrintGCDateStamps
輸出GC的時間戳(以基準時間的形式)
  • -XX:+PrintGCDetails
輸出GC的日誌格式
  • -Dnetworkaddress.cache.ttl=60
  • -Dsun.net.inetaddr.ttl=60
設置DNS緩存時間
  • -DautoStartup=false
  • -Dsun.net.client.defaultConnectTimeout=60000
連接建立超時時間
  • -Dsun.net.client.defaultReadTimeout=60000
內容獲取超時設置
  • -Djmagick.systemclassloader=no
是否生成縮略圖的一個框架的配置
  • -Djava.security.egd=file:/dev/./urandom

最佳實踐

export JAVA_OPTS="-server -showversion -Xms2000m -Xmx2000m -Xmn500m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:SurvivorRatio=2 -XX:ReservedCodeCacheSize=256m -Xss1024k -Djava.awt.headless=true -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=60 -XX:+UseGCOverheadLimit -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tomcat_path/logs/dump_tomcat.hprof -Xloggc:/tomcat_path/logs/gc_tomcat.log -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCDetails -Dnetworkaddress.cache.ttl=60 -Dsun.net.inetaddr.ttl=60 -DautoStartup=false -Dsun.net.client.defaultConnectTimeout=60000 -Dsun.net.client.defaultReadTimeout=60000 -Djmagick.systemclassloader=no -Djava.security.egd=file:/dev/./urandom -Dfile.encoding=UTF-8"

常見JVM異常

  • java.lang.OutOfMemoryError: Java heap space —-JVM Heap(堆)溢出

JVM 在啟動的時候會自動設置 JVM Heap 的值,其初始空間(即-Xms)是物理記憶體的1/64,最大空間(-Xmx)不可超過物理記憶體。可以利用 JVM提供的 -Xmn -Xms -Xmx 等選項可進行設置。Heap 的大小是 Young Generation 和 Tenured Generaion 之和。在 JVM 中如果 98% 的時間是用於 GC,且可用的 Heap size 不足 2% 的時候將拋出此異常信息。

解決方法:手動設置 JVM Heap(堆)的大小。

  • java.lang.OutOfMemoryError: PermGen space —- PermGen space溢出。
jdk1.8 拋出 ERROR: java.lang.OutOfMemoryError: Metadata space 異常

PermGen space 的全稱是 Permanent Generation space,是指記憶體的永久保存區域。為什麼會記憶體溢出,這是由於這塊記憶體主要是被 JVM 存放Class 和 Meta 信息的,Class 在被 Load 的時候被放入 PermGen space 區域,它和存放 Instance 的 Heap 區域不同,sun 的 GC 不會在主程式運行期對 PermGen space 進行清理,所以如果你的 APP 會載入很多 CLASS 的話,就很可能出現 PermGen space 溢出。

解決方法: 手動設置 MaxPermSize 大小

  • java.lang.StackOverflowError —- 棧溢出

棧溢出了,JVM 依然是採用棧式的虛擬機。函數的調用過程都體現在堆棧和退棧上了。調用構造函數的 “層”太多了,以致於把棧區溢出了。通常來講,一般棧區遠遠小於堆區的,因為函數調用過程往往不會多於上千層,而即便每個函數調用需要 1K 的空間(這個大約相當於在一個 C 函數內聲明瞭 256 個 int 類型的變數),那麼棧區也不過是需要 1MB 的空間。通常棧的大小是 1-2MB 的。
通常遞歸也不要遞歸的層次過多,很容易溢出。

思考題

1. 線上應用系統出現問題,怎麼快速定位系統哪塊資源問題


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 使用html5視頻背景 直到現在,仍然不存在一項旨在網頁上顯示視頻的標準。今天,大多數視頻是通過插件(比如 Flash)來顯示的。然而,並非所有瀏覽器都擁有同樣的插件。HTML5 規定了一種通過 video 元素來包含視頻的標準方法。 瀏覽器支持的視頻格式 當前,video 元素支持Ogg,MPEG ...
  • Require.js與Sea.js的區別 相同之處 和 都是模塊載入器,倡導模塊化開發理念,核心價值是讓 JavaScript 的模塊化開發變得簡單自然。 不同之處 兩者的主要區別如下: RequireJS 想成為瀏覽器端的模塊載入器,同時也想成為 Rhino / Node 等環境的模塊載入器。Se ...
  • 場景: 假如有一天,你的在寫一個前端項目,是關於一份點餐商家電話信息表,你啪塔啪塔地寫完了,突然間項目經理跑過來找你,要求你在每一個商家的電話號碼前都添加一個電話符號,來使得電話號碼更直觀和頁面更美觀。這個時候你就糾結了,這不是折磨人嗎?這不是要我在每個電話號碼前都添加一個<img>標簽?這要整到猴 ...
  • [TOC] 前後端如何通信 前段:客戶端 後端: 伺服器端 所謂的全棧,其實是你可以實現客戶端和伺服器端程式的編寫,而且可以實現倆端之間的通信 客戶端和伺服器端是如何通信的? 本地開發(當前項目可以在本地預覽) 部署到伺服器上,讓別人可以通過功能變數名稱或者外網訪問 購買一臺伺服器(阿裡雲獨立主機,虛擬服務 ...
  • 不知不覺接觸前端的時間已經過去半年了,越來越發覺對知識的學習不應該只停留在會用的層面,這在我學jQuery的一段時間後便有這樣的體會。 雖然jQuery只是一個JS的代碼庫,只要會一些JS的基本操作學習一兩天就能很快掌握jQuery的基本語法並熟練使用,但是如果不瞭解jQUery庫背後的實現原理,相 ...
  • 開發者的javascript造詣取決於對【動態】和【非同步】這兩個詞的理解水平。 這一期主要分析各種實際開發中各種複雜的 指向問題。 一. 嚴格模式 嚴格模式是 ES5 中添加的 的另一種運行模式,它可以禁止使用一些語法上不合理的部分,提高編譯和運行速度,但語法要求也更為嚴格,使用 標記開啟。 嚴格模 ...
  • 這幾天項目著急,同時也學到好多以前沒有接觸過的知識。oninput、onchange與onpropertychange事件的區別, 與input輸入框實時檢測 onchange事件只在鍵盤或者滑鼠操作改變對象屬性,value的值發生變化且失去焦點時觸發,用戶js改變value時無法觸發; onkey ...
  • 通常我們在寫程式的時候會碰到一個類只允許在整個系統中只存在一個實例(Instance) 的情況, 比如說我們想做一計數器,統計某些介面調用的次數,通常我們的資料庫連接也是只期望有一個實例。Windows系統的系統任務管理器也是始終只有一個,如果你打開了windows管理器,你再想打開一個那麼他還是同 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...