Mycat 本身就是一个 Java 进程,所以所有标准 JVM 监控工具都能直接用。
一、先找到 Mycat 进程
bash
运行
jps -l
你会看到类似:
plaintext
12345 io.mycat.MycatServer
记住这个 PID,后面所有工具都要用。
二、最常用:jstat 看 GC、内存、CPU(生产必备)
1. 看 GC 情况(最重要)
bash
运行
jstat -gcutil <pid> 1000 10
含义:每 1 秒输出一次,共 10 次。
重点看这几列:
- S0、S1、E、O:幸存区、伊甸区、老年代使用率
- YGC、YGCT:Young GC 次数、总耗时
- FGC、FGCT:Full GC 次数、总耗时(越少越好)
- GCT:GC 总耗时占比
生产告警线
- FGC 频繁 > 1 次 / 1440 分钟(一天)就有问题
- FGCT 飙升、CPU 高 → 大概率内存泄漏或堆太小
2. 看类加载、线程
bash
运行
jstat -class <pid>
jstat -threads <pid>
三、看堆内存详情:jmap
1. 查看堆概况
bash
运行
jmap -heap <pid>
能看到:
- 堆最大、最小、已用
- 新生代 / 老年代比例
- Eden:S0:S1 比例
2. 查看对象占用(排查内存暴涨)
bash
运行
jmap -histo:live <pid> | head -20
看哪些类实例最多、占内存最大,快速定位内存泄漏。
3. 导出堆 dump(排查 OOM 必备)
bash
运行
jmap -dump:format=b,file=mycat.hprof <pid>
用 MAT(Eclipse Memory Analyzer) 打开分析泄漏。
四、实时看线程、死锁、堆栈:jstack
1. 导出所有线程栈
bash
运行
jstack <pid> > stack.log
2. 排查死锁
bash
运行
jstack -l <pid>
搜索关键字:
deadlockBLOCKEDWAITING
Mycat 常见阻塞点:
- 后端 MySQL 连接池满
- 网络 IO 阻塞
- 锁竞争
五、图形化监控(简单直观)
1. jconsole(JDK 自带)
bash
运行
jconsole
连接本地 Mycat 进程即可看到:
- 堆内存
- 线程
- 类
- CPU
- MBean
2. jvisualvm(更强,推荐)
bash
运行
jvisualvm
功能:
- 实时堆图
- 抽样 CPU
- 内存抽样
- 线程死锁检测
- 打开 hprof 文件
六、远程 JVM 监控(生产常用)
如果你要远程监控服务器上的 Mycat,需要在 Mycat 启动参数里加 JMX 配置。
修改
wrapper.conf 或 mycat 启动脚本,添加:plaintext
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=10003
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=服务器IP
重启 Mycat 后,本地 jvisualvm 输入:
plaintext
服务器IP:10003
就能远程监控。
七、Mycat 专用 JVM 最佳配置(直接抄)
Mycat 是高 IO 型,推荐堆不要太大,避免 FullGC。
plaintext
-Xms4G
-Xmx4G
-Xmn2G
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:/usr/local/mycat/logs/gc.log
八、你实际要监控哪些指标?(精简版)
- 堆内存使用率(是否持续上涨 → 内存泄漏)
- FullGC 次数与耗时(核心)
- 线程数是否暴涨
- 是否死锁
- 连接池线程是否阻塞在 MySQL