背景
阿里開源的chaosblade混沌測試工具:從cpu、磁盤、內存、網絡等硬因素,jvm、process、servlet等軟因素,從物理機、docker容器、k8s集群等維度統一規范地維護了一套命令用于單節點、分布式集群的應用、中間件、數據庫的故障注入,以檢測目標系統的穩定性、可靠性、容錯性、數據一致性等方面問題
實現原理
還是對最底層的linux命令進行封裝,如tc、iptables、dd等,本工具是基于blade create? 命令進行使用,支持本地運行或者通過ssh進行遠程機器上的運行, 方便進行基于blade開源出來的命令進行自動化測試
├── blade_cpu.py
├── blade_disk.py
├── blade_docker.py
├── blade_jvm.py
├── blade_mem.py
├── blade_net.py
├── blade_process.py
├── blade_servlet.py
├── blade_utils.py
├── configure_utils.py
├── log_utils.py
└── shell_utils.py
核心腳本已經開源至:https://gitee.com/helloworldct/chaosblade-python
備注 java進程相關的排查工具:
# jinfo
可以輸出并修改運行時的java進程的opts
* 用法:jinfo -opt pid
如:查看2788的MaxPerm大小可以用 jinfo -flag MaxPermSize 2788。
# jps
與ps類似,用來顯示本地的java進程,可以查看本地運行著幾個java程序,并顯示他們的進程號。
# jstat
一個極強的監視VM內存工具。可以用來監視VM內存內的各種堆和非堆的大小及其內存使用量。
詳細:在使用這些工具前,先用JPS命令獲取當前的每個JVM進程號,然后選擇要查看的JVM。
jstat工具特別強大,有眾多的可選項,詳細查看堆內各個部分的使用量,以及加載類的數量。使用時,需加上查看進程的進程id,和所選參數。以下詳細介紹各個參數的意義。
* jstat -class pid:顯示加載class的數量,及所占空間等信息。
* jstat -compiler pid:顯示VM實時編譯的數量等信息。
* jstat -gc pid:可以顯示gc的信息,查看gc的次數,及時間。其中最后五項,分別是young gc的次數,young gc的時間,full gc的次數,full gc的時間,gc的總時間。
* jstat -gccapacity:可以顯示,VM內存中三代(young,old,perm)對象的使用和占用大小,如:PGCMN顯示的是最小perm的內存使用量,PGCMX顯示的是perm的內存最大使用量,PGC是當前新生成的perm內存占用量,PC是但前perm內存占用量。其他的可以根據這個類推, OC是old內純的占用量。
* jstat -gcnew pid:new對象的信息。
* jstat -gcnewcapacity pid:new對象的信息及其占用量。
* jstat -gcold pid:old對象的信息。
* jstat -gcoldcapacity pid:old對象的信息及其占用量。
* jstat -gcpermcapacity pid: perm對象的信息及其占用量。
* jstat -util pid:統計gc信息統計。
* jstat -printcompilation pid:當前VM執行的信息。
* jstat -gcutil? pid? 1000 100? : 1000ms統計一次gc情況統計100次;
除了以上一個參數外,還可以同時加上 兩個數字,如:jstat -printcompilation 3024 250 6是每250毫秒打印一次,一共打印6次,還可以加上-h3每三行顯示一下標題。
# jmap
打印出某個java進程(使用pid)內存內的所有‘對象‘的情況(如:產生那些對象,及其數量)。
jmap是一個可以輸出所有內存中對象的工具,甚至可以將VM中的heap,以二進制輸出成文本。
命令:jmap -dump:format=b,file=heap.bin
* file:保存路徑及文件名
* pid:進程編號
* jmap -histo:live? pid| less :堆中活動的對象以及大小
* jmap -heap pid :查看堆的使用狀況信息
# jconsole
一個java GUI監視工具,可以以圖表化的形式顯示各種數據。并可通過遠程連接監視遠程的服務器VM。
JConsole中關于內存分區的說明:
* Eden Space (heap): 內存最初從這個線程池分配給大部分對象。
* Survivor Space (heap):用于保存在eden space內存池中經過垃圾回收后沒有被回收的對象。
* Tenured Generation (heap):用于保持已經在 survivor space內存池中存在了一段時間的對象。
* Permanent Generation (non-heap):保存虛擬機自己的靜態(refective)數據,例如類(class)和方法(method)對象。Java虛擬機共享這些類數據。這個區域被分割為只讀的和只寫的,
* Code Cache (non-heap):HotSpot Java虛擬機包括一個用于編譯和保存本地代碼(native code)的內存,叫做“代碼緩存區”(code cache)
# jstack
查看jvm線程運行狀態,是否有死鎖現象等等信息
* 用法: jstack pid : thread dump
# jcmd
[參考鏈接](https://juejin.cn/post/6844903809932591112)
* 使用jcmd的Compiler.codecache也可以查看code cache的使用情況,輸出跟-XX:+PrintCodeCache相同
用法:jcmd pid Compiler.codecache
* 使用jcmd的VM.native_memory也可以查看code cache的使用情況(Code部分),Compiler部分為Memory tracking used by the compiler when generating code
用法:jcmd pid VM.native_memory:
另外推薦一款查看jmap dump的內存對象工具 MemoryAnalyzer
工程參考鏈接:https://chaosblade-io.gitbook.io/chaosblade-help-zh-cn/blade-create-jvm/blade-create-jvm-return