成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

小伙伴問我性能指標監控怎么做,這次我安排上了!!

安全 應用安全
作者個人研發的在高并發場景下,提供的簡單、穩定、可擴展的延遲消息隊列框架,具有精準的定時任務和延遲隊列處理功能。

[[342919]]

作者個人研發的在高并發場景下,提供的簡單、穩定、可擴展的延遲消息隊列框架,具有精準的定時任務和延遲隊列處理功能。自開源半年多以來,已成功為十幾家中小型企業提供了精準定時調度方案,經受住了生產環境的考驗。為使更多童鞋受益,現給出開源框架地址:https://github.com/sunshinelyz/mykit-delay

小伙伴的疑問小伙伴:監控怎么做?

我:你指的是?

小伙伴:性能指標。

我:后面會專門寫這些文章。

使用JMX監控Tomcat

關于監控的文章,先寫些什么呢?想來想去,我們先來寫一篇使用JMX監控Tomcat的實戰文章吧。好了,我們直接進入主題。

激活Tomcat的JMX遠程配置

要通過JMX遠程監控Tomcat,首先需要激活Tomcat的JMX遠程配置。

① 修改腳本

先修改Tomcat的啟動腳本,windows下為bin/catalina.bat(linux下為catalina.sh),添加以下內容,8999是jmxremote使用的端口號,第二個false表示不需要鑒權:

  1. set JMX_REMOTE_CONFIG=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false 
  2. set CATALINA_OPTS=%CATALINA_OPTS% %JMX_REMOTE_CONFIG% 

要注意以上語句的位置不能太后面,可以加在【if "%OS%" == "Windows_NT" setlocal】一句后的大段的注釋后面。

參考官方說明:

  • http://tomcat.apache.org/tomcat-6.0-doc/monitoring.html#Enabling_JMX_Remote
  • http://tomcat.apache.org/tomcat-7.0-doc/monitoring.html#Enabling_JMX_Remote
  • http://tomcat.apache.org/tomcat-8.0-doc/monitoring.html#Enabling_JMX_Remote
  • http://tomcat.apache.org/tomcat-9.0-doc/monitoring.html#Enabling_JMX_Remote

② 鑒權

上面的配置是不需要鑒權的,如果需要鑒權則添加的內容為:

  1. set JMX_REMOTE_CONFIG=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password -Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access 
  2. set CATALINA_OPTS=%CATALINA_OPTS% %JMX_REMOTE_CONFIG% 

③ 復制并修改授權文件

$JAVA_HOME/jre/lib/management下有jmxremote.access和jmxremote.password的模板文件,將兩個文件復制到$CATALINA_BASE/conf目錄下

  • 修改$CATALINA_BASE/conf/jmxremote.access 添加內容
  1. monitorRole readonly 
  2. controlRole readwrite 
  • 修改$CATALINA_BASE/conf/jmxremote.password 添加內容:
  1. monitorRole binghe 
  2. controlRole binghe 

注意:如果進行了以上步驟導致Tomcat啟動不了,那么很可能是密碼文件的權限問題

需要修改jmxremote.password文件的訪問權限,只有運行Tomcat的用戶才能擁有訪問權限 :

Windows的NTFS文件系統下,選中文件,點右鍵 -->“屬性”-->“安全”--> 點“高級”--> 點“更改權限”--> 去掉“從父項繼承....”--> 彈出窗口中選“刪除”,這樣就刪除了所有訪問權限。再選“添加”--> “高級”--> “立即查找”,選中你的用戶(或用戶組,如果選用戶不行那就選用戶組),例administrator,點“確定",“確定"。來到權限項目窗口,勾選“完全控制”,點“確定”,OK了。

官方的提示

  1. The password file should be read-only and only accessible by the operating system user Tomcat is running as

④驗證配置

重新啟動Tomcat,在Windows命令行輸入“netstat -a”查看配置的端口號是否已打開,如果打開,說明上面的配置成功了。

⑤ 使用jconsole測試JMX

運行$JAVA_HOME/bin目錄下的jconsole.exe,打開J2SE監視和管理控制臺,然后建立連接,如果是本地的Tomcat則直接選擇然后點擊連接,如果是遠程的,則進入遠程選項卡,填寫地址、端口號、用戶名、口令即可連接。。Mbean屬性頁中給出了相應的數據,Catalina中是tomcat的,java.lang是jvm的。對于加粗的黑體屬性值,需雙擊一下才可看內容。

代碼獲取監控指標

  • 關鍵代碼
  1. String jmxURL = "service:jmx:rmi:///jndi/rmi://192.168.10.93:8999/jmxrmi"
  2. JMXServiceURL serviceURL = new JMXServiceURL(jmxURL); 
  3.   
  4. Map map = new HashMap(); 
  5. // 用戶名密碼,在jmxremote.password文件中查看 
  6. String[] credentials = new String[] { "monitorRole""tomcat" }; 
  7. map.put("jmx.remote.credentials", credentials); 
  8. JMXConnector connector = JMXConnectorFactory.connect(serviceURL, map); 
  9. MBeanServerConnection mbsc = connector.getMBeanServerConnection(); 
  10.   
  11. // 端口最好是動態取得 
  12. ObjectName threadObjName = new ObjectName("Catalina:type=ThreadPool,name=http-8080"); 
  13. MBeanInfo mbInfo = mbsc.getMBeanInfo(threadObjName); 
  14.   
  15. // tomcat的線程數對應的屬性值 
  16. String attrName = "currentThreadCount"
  17. MBeanAttributeInfo[] mbAttributes = mbInfo.getAttributes(); 
  18. System.out.println("currentThreadCount:" + mbsc.getAttribute(threadObjName, attrName)); 
  • 完整代碼
  1. import java.lang.management.MemoryUsage; 
  2. import java.text.SimpleDateFormat; 
  3. import java.util.Date
  4. import java.util.Formatter; 
  5. import java.util.HashMap; 
  6. import java.util.Iterator; 
  7. import java.util.Map; 
  8. import java.util.Set
  9.   
  10. import javax.management.MBeanAttributeInfo; 
  11. import javax.management.MBeanInfo; 
  12. import javax.management.MBeanServerConnection; 
  13. import javax.management.ObjectInstance; 
  14. import javax.management.ObjectName; 
  15. import javax.management.openmbean.CompositeDataSupport; 
  16. import javax.management.remote.JMXConnector; 
  17. import javax.management.remote.JMXConnectorFactory; 
  18. import javax.management.remote.JMXServiceURL; 
  19. /** 
  20.  * @author binghe 
  21.  * @description JMX監控Tomcat代碼實戰 
  22.  */ 
  23. public class JMXTest { 
  24.  public static void main(String[] args) { 
  25.   try { 
  26.    String jmxURL = "service:jmx:rmi:///jndi/rmi://127.0.0.1:8999/jmxrmi"
  27.    JMXServiceURL serviceURL = new JMXServiceURL(jmxURL); 
  28.    Map map = new HashMap(); 
  29.    String[] credentials = new String[] { "monitorRole""tomcat" }; 
  30.    map.put("jmx.remote.credentials", credentials); 
  31.    JMXConnector connector = JMXConnectorFactory.connect(serviceURL,map); 
  32.    MBeanServerConnection mbsc = connector.getMBeanServerConnection(); 
  33.    // 端口最好是動態取得 
  34.    ObjectName threadObjName = new ObjectName("Catalina:type=ThreadPool,name=http-8080"); 
  35.    MBeanInfo mbInfo = mbsc.getMBeanInfo(threadObjName); 
  36.    String attrName = "currentThreadCount";// tomcat的線程數對應的屬性值 
  37.    MBeanAttributeInfo[] mbAttributes = mbInfo.getAttributes(); 
  38.    System.out.println("currentThreadCount:" + mbsc.getAttribute(threadObjName, attrName)); 
  39.   
  40.    // heap 
  41.    for (int j = 0; j < mbsc.getDomains().length; j++) { 
  42.     System.out.println("###########" + mbsc.getDomains()[j]); 
  43.    } 
  44.    Set MBeanset = mbsc.queryMBeans(nullnull); 
  45.    System.out.println("MBeanset.size() : " + MBeanset.size()); 
  46.    Iterator MBeansetIterator = MBeanset.iterator(); 
  47.    while (MBeansetIterator.hasNext()) { 
  48.     ObjectInstance objectInstance = (ObjectInstance) MBeansetIterator.next(); 
  49.     ObjectName objectName = objectInstance.getObjectName(); 
  50.     String canonicalName = objectName.getCanonicalName(); 
  51.     System.out.println("canonicalName : " + canonicalName); 
  52.     if (canonicalName.equals("Catalina:host=localhost,type=Cluster")) { 
  53.      // Get details of cluster MBeans 
  54.      System.out.println("Cluster MBeans Details:"); 
  55.      System.out.println("========================================="); 
  56.      // getMBeansDetails(canonicalName); 
  57.      String canonicalKeyPropList = objectName.getCanonicalKeyPropertyListString(); 
  58.     } 
  59.    } 
  60.    // ------------------------- system ---------------------- 
  61.    ObjectName runtimeObjName = new ObjectName("java.lang:type=Runtime"); 
  62.    System.out.println("廠商:"+ (String) mbsc.getAttribute(runtimeObjName, "VmVendor")); 
  63.    System.out.println("程序:"+ (String) mbsc.getAttribute(runtimeObjName, "VmName")); 
  64.    System.out.println("版本:"+ (String) mbsc.getAttribute(runtimeObjName, "VmVersion")); 
  65.    Date starttime = new Date((Long) mbsc.getAttribute(runtimeObjName,"StartTime")); 
  66.    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
  67.    System.out.println("啟動時間:" + df.format(starttime)); 
  68.   
  69.    Long timespan = (Long) mbsc.getAttribute(runtimeObjName, "Uptime"); 
  70.    System.out.println("連續工作時間:" + JMXTest.formatTimeSpan(timespan)); 
  71.    // ------------------------ JVM ------------------------- 
  72.    // 堆使用率 
  73.    ObjectName heapObjName = new ObjectName("java.lang:type=Memory"); 
  74.    MemoryUsage heapMemoryUsage = MemoryUsage.from((CompositeDataSupport) mbsc.getAttribute(heapObjName,"HeapMemoryUsage")); 
  75.    long maxMemory = heapMemoryUsage.getMax();// 堆最大 
  76.    long commitMemory = heapMemoryUsage.getCommitted();// 堆當前分配 
  77.    long usedMemory = heapMemoryUsage.getUsed(); 
  78.    System.out.println("heap:" + (double) usedMemory * 100 / commitMemory + "%");// 堆使用率 
  79.   
  80.    MemoryUsage nonheapMemoryUsage = MemoryUsage.from((CompositeDataSupport) mbsc.getAttribute(heapObjName,"NonHeapMemoryUsage")); 
  81.    long noncommitMemory = nonheapMemoryUsage.getCommitted(); 
  82.    long nonusedMemory = heapMemoryUsage.getUsed(); 
  83.    System.out.println("nonheap:" + (double) nonusedMemory * 100 / noncommitMemory + "%"); 
  84.   
  85.    ObjectName permObjName = new ObjectName("java.lang:type=MemoryPool,name=Perm Gen"); 
  86.    MemoryUsage permGenUsage = MemoryUsage.from((CompositeDataSupport) mbsc.getAttribute(permObjName, "Usage")); 
  87.    long committed = permGenUsage.getCommitted();// 持久堆大小 
  88.    long used = heapMemoryUsage.getUsed();// 
  89.    System.out.println("perm gen:" + (double) used * 100 / committed + "%");// 持久堆使用率 
  90.   
  91.    // -------------------- Session --------------- 
  92.    ObjectName managerObjName = new ObjectName("Catalina:type=Manager,*"); 
  93.    Set<ObjectName> s = mbsc.queryNames(managerObjName, null); 
  94.    for (ObjectName obj : s) { 
  95.     System.out.println("應用名:" + obj.getKeyProperty("path")); 
  96.     ObjectName objname = new ObjectName(obj.getCanonicalName()); 
  97.     System.out.println("最大會話數:" + mbsc.getAttribute(objname, "maxActiveSessions")); 
  98.     System.out.println("會話數:" + mbsc.getAttribute(objname, "activeSessions")); 
  99.     System.out.println("活動會話數:" + mbsc.getAttribute(objname, "sessionCounter")); 
  100.    } 
  101.   
  102.    // ----------------- Thread Pool ---------------- 
  103.    ObjectName threadpoolObjName = new ObjectName("Catalina:type=ThreadPool,*"); 
  104.    Set<ObjectName> s2 = mbsc.queryNames(threadpoolObjName, null); 
  105.    for (ObjectName obj : s2) { 
  106.     System.out.println("端口名:" + obj.getKeyProperty("name")); 
  107.     ObjectName objname = new ObjectName(obj.getCanonicalName()); 
  108.     System.out.println("最大線程數:" + mbsc.getAttribute(objname, "maxThreads")); 
  109.     System.out.println("當前線程數:" + mbsc.getAttribute(objname, "currentThreadCount")); 
  110.     System.out.println("繁忙線程數:" + mbsc.getAttribute(objname, "currentThreadsBusy")); 
  111.    } 
  112.   } catch (Exception e) { 
  113.    e.printStackTrace(); 
  114.   } 
  115.  } 
  116.   
  117.  public static String formatTimeSpan(long span) { 
  118.   long minseconds = span % 1000; 
  119.   
  120.   span = span / 1000; 
  121.   long seconds = span % 60; 
  122.   
  123.   span = span / 60; 
  124.   long mins = span % 60; 
  125.   
  126.   span = span / 60; 
  127.   long hours = span % 24; 
  128.   
  129.   span = span / 24; 
  130.   long days = span; 
  131.   return (new Formatter()).format("%1$d天 %2$02d:%3$02d:%4$02d.%5$03d", days, hours, mins, seconds, minseconds).toString(); 
  132.  } 

Tomcat9 JVM參數調優

修改配置

  1. #要添加在tomcat 的bin 下catalina.sh 里添加 
  2. JAVA_OPTS="-Xms1024m -Xmx2048m -Xss2048K -XX:PermSize=128m -XX:MaxPermSize=256m" 

參數說明

  • -Xms 初始化內存大小,一般設置為和Xmx一致,避免每次垃圾回收后重新分配內存
  • -Xmx 最大可用內存
  • -Xmn 年輕代大小
  • -Xss 設置每個線程棧的大小
  • -XX:MetaspaceSize=512M 初始元空間大小,達到該值就會觸發垃圾收集進行類型卸載,同時GC會對該值進行調整:如果釋放了大量的空間,就適當降低該值;如果釋放了很少的空間,那么在不超過MaxMetaspaceSize時,適當提高該值。
  • -XX:MaxMetaspaceSize=512M
  • -XX:+UseConcMarkSweepGC 并發標記清除(CMS)收集器
  • -XX:+CMSClassUnloadingEnabled
  • -XX:+HeapDumpOnOutOfMemoryError 表示當JVM發生OOM時,自動生成DUMP文件。
  • -XX:HeapDumpPath={目錄}/java_heapdump.hprof。如果不指定文件名,默認為:java__heapDump.hprof。

Tomcat 相關參數優化

連接數,線程數,緩存,修改server.xml

打開被注釋的默認連接池配置。

默認配置如下所示:

  1. <!--   
  2. <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"   
  3. maxThreads="150" minSpareThreads="4"/>   
  4. -->   

修改實例:

  1. <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"   
  2.          maxThreads="150"  
  3.          minSpareThreads="100"    
  4.          prestartminSpareThreads="true"  
  5.          maxQueueSize="100"/>  

參數說明:

  • name:線程名稱
  • namePrefix:線程前綴
  • maxThreads:最大并發連接數,不配置時默認200,一般建議設置500~ 800 ,要根據自己的硬件設施條件和實際業務需求而定。
  • minSpareThreads:Tomcat啟動初始化的線程數,默認值25
  • prestartminSpareThreads:在tomcat初始化的時候就初始化minSpareThreads的值, 不設置trueminSpareThreads 的值就沒啥效果了 。
  • maxQueueSize:最大的等待隊列數,超過則拒絕請求

修改后的配置如下所示:

  1. <Connector port="8080" protocol="HTTP/1.1" 
  2.         connectionTimeout="20000"   
  3.         redirectPort="8443"    
  4.         executor="tomcatThreadPool"   
  5.         enableLookups="false"    
  6.         maxIdleTime="60000" 
  7.         acceptCount="100"    
  8.         maxPostSize="10485760"  
  9.         acceptorThreadCount="2"     
  10.         disableUploadTimeout="true"    
  11.         URIEncoding="utf-8" 
  12.         keepAliveTimeout ="6000"   
  13.         maxKeppAliveRequests="500"    
  14.       /> 

參數說明:

  • 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之間)

本文轉載自微信公眾號「冰河技術」,可以通過以下二維碼關注。轉載本文請聯系冰河技術公眾號。

 

責任編輯:武曉燕 來源: 冰河技術
相關推薦

2020-10-19 08:53:08

Redis性能指標監控

2011-05-04 13:53:08

jQuery

2024-09-20 08:32:21

2023-11-20 09:48:13

Linux性能指標命令

2013-06-17 10:19:30

交換機性能交換機參數交換機

2022-05-02 08:56:04

前端性能指標

2010-09-08 11:38:27

2011-07-28 14:58:49

HP ProLiant服務器

2023-11-25 20:16:22

前端

2023-12-17 14:49:20

前端首屏時間

2023-12-29 15:30:41

內存存儲

2011-06-07 14:16:38

雙絞線

2021-01-13 08:08:18

ZabbixReport運維

2013-08-09 10:37:31

代碼數據

2015-05-19 14:30:48

加密視頻加密億賽通

2017-02-22 11:51:11

FortiGate企業級防火墻NGFW

2009-12-11 15:17:35

2024-06-28 11:54:20

2018-01-04 09:23:21

WEB服務器性能

2023-09-08 15:37:29

軟件開發性能
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久91av | 狠狠干网站 | 97国产精品视频人人做人人爱 | 成人在线观看免费 | 欧美成人h版在线观看 | 久久成人高清视频 | a级免费观看视频 | 国产成人精品免费 | 男人天堂视频在线观看 | 国产激情一区二区三区 | 成人在线免费 | 精品久久久久久亚洲国产800 | 九九免费在线视频 | 91在线观看免费视频 | 欧美成人激情 | 欧美成人免费电影 | 日本超碰在线 | 色欧美综合 | 午夜精品久久久久久久星辰影院 | 久草在线 | 成人av一区二区亚洲精 | 亚洲人在线 | 亚洲精品乱码久久久久久按摩 | 在线看片国产精品 | 久久久久久久久久久久久91 | 精品三级在线观看 | 国产欧美日韩一区 | 91一区| 免费一级片 | 亚洲国产欧美91 | 国产观看 | 欧美啪啪 | 国产精品欧美一区二区三区不卡 | 欧美一区二区三区在线 | 欧美日韩综合精品 | 欧美老少妇一级特黄一片 | 中文字幕91av | 蜜桃视频成人 | 99在线免费观看视频 | 日本久久久一区二区三区 | 欧美一区二区三区精品免费 |