Java生产环境下性能监控与调优

277 阅读4分钟

1、 基于JDK命令行工具的监控

1.1、JVM的参数类型

  • 标准参数

    • -help
    • -server -client
    • -version -showversion
    • -cp -classpath
  • x参数

    • 非标准化参数
    • -Xit: 解释执行
    • Xcomp: 第一次使用就编译成本地代码
    • -Xmixed: 混合模式,JVM自己来决定是否编译成本地代码
  • XX参数

  • 非标准化参数

  • 相对不稳定

  • 主要用于JVM 调优 和 Debug

XX参数分类

  • Boolean 类型

    • 格式:-XX: [+-] 表示启用或者禁用name属性
    • 比如: -XX: +UseConcMarkSweepGc
    • -XX:+UseG1Gc
  • 非Boolean 类型

    • 格式: -xx: = 表示name属性的值是value

    • 比如: -XX:MaxGcPauseMillis = 500

      ​ XX: GCTimeRatio = 19

-Xmx -Xms

  • 不是X参数,而是XX参数

    • -Xms 等价于 -XX:lnitialHeapSize

    • -Xmx 等价于 -XX:MaxHeapSize

1.2、查看JVM运行时参数

  • -XX: + PrintFlagslnitail 查看初始值
  • -XX: + PrintFlagsFinal 查看最终值
  • -XX: + UnlockExperimentalVMOptions 解锁实验参数
  • -XX: + UnlockDiagnosticVMOptions 解锁诊断参数
  • -XX: + PrintCommandLineFlags 打印命令行参数

PrintFlagsFinal

  • bool UseG1Gc = false

  • bool UseGcLogFileRotation = false

  • bool UseGCOverheadLimit = true

  • uintx InitialHeapSize :=13212313

  • uintx MaxHeapSize := 233333332323

  • uintx MaxNewSize := 2334324243

= 表示默认值

:= 被用户或者JVM修改后的值

使用命令

java --XX:+PrintFlagsFinal -version 

// 保存文件
 java --XX:+PrintFlagsFinal -version > flag.txt 
 // 下载文件
 xz flag.txt 
  

JPS

root: jps
jps -l  	// 查看完整包名 

Jinfo 运行时

jinfo -flag MaxHeapSize 23789
jinfo -flags 23789

  • 查看最大内存
    • jinfo -flag MaxHeapSize 3176
  • 查看垃圾回收器
    • jinfo -flag UseConcMarkSweepGc 3176
    • jinfo -flag UseG1Gc 3176
    • jinfo -flag UseParallelGc 3176

1.3、jstat查看JVM统计信息

  • 类装载
  • 垃圾收集
    • -gc 、 -gcuti、 -gccause、 -gcnew 、 -gcold
  • JIT编译
    • -compiler 、 -printcompilation

1.4、jmap +MAT 演示内存溢出

1.5、导出内存映像文件

  • 内存溢出自动导出
-XX: +HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath = ./    
  • 使用jmap 命令手动导出

1.6、MAT分析内存溢出

1.7、Jstack与线程状态

jstack 实战死循环与死锁

jps -l 查看有几个进程

jstack 15764 > 15764.txt

sz 15764.txt 下载

1.8、jstack实战死循环与死锁

实战死循环导致CPU飙高

2、基于Btrace的监控调试

2.1、btrace 入门

  • brace安装入门
  • Brace使用想起

Btrace 简介

  • Btrace可以动态地向目标应用程序的字节码注入追踪代码
  • JavaComplierApi、JVMTI、Agent、Instrumentation + ASM

Btrace 安装

  • 新建环境变量 BTRACE_HOME
  • 添加Path: %BTRACE_HOME %\bin

两种运行脚本方式

  • 在JVisualVM中添加Btrace 插件,添加classpath
  • 使用命令行btrace <trace_script>

2.2、拦截构造函数,同名函数

使用详解

  • 拦截方法
    • 普通方法 @OnMethod(clazz = "", method="")
    • 构造函数 @Onmethod( class= "" , method = "")
    • 拦截同名函数,用参数区分
  • 拦截时机
    • Kind.ENTRY: 入口,默认值
    • Kind.RETURN: 返回
    • Kind.THROW: 异常
    • Kind.Line: 行
  • 拦截this 、参数 、 返回值
    • this : @Self
    • 入参: 可以用AnyType, 也可以用真实类型,同名的用真是的
    • 返回: @Return
  • 获取对象的值
    • 简单类型: 直接获取
    • 复杂类型:反射,类名 + 属性名
  • 其他

2.5、注意事项

  • 默认只能本地运行
  • 生产环境下可以使用,但是被修改的字节码不会被还原

3、Tomcat 性能监控与调优

3.1、tomcat远程debug

startup.sh 加入 jpda start 之前 加入

bin/catalina.sh 加入

3.2、tomcat-manger监控

3.3、psi-probe 监控

3.4、tomcat优化

  • 内存优化
  • 线程优化
  • 配置优化

4、Nginx 性能监控与调优

4.1、nginx 安装

4.2、ngx_http_stub_status监控连接信息

添加状态监控

location = /nginx_status {
    stub_status on;
    access_log off;
    allow 127.0.0.1;
    deny all;
}


4.3、ngxtop 监控请求信息

  • 安装python-pip

    • yum install epel-release
    • yum install python-pip
  • 安装ngxtop

    • pip install ngxtop

ngxtop 使用

  • 指定配置文件: ngxtop -c /etc/nginx/nginx.conf
  • 查询状态是200:ngxtop -c /etc/nginx/nginx.conf -i 'status == 200'
  • 查询访问最多ip: ngxtop -c /etc/nginx/nginx.conf -g remote_addr

4.4、nginx-rrd 图形化监控

1、首先安装监控状态

location = /nginx_status {
    stub_status on;
    access_log off;
    allow 127.0.0.1;
    deny all;
}

2、安装php依赖

yum install php php-gd php-soap php-mbstring php-xmlrpc php-dom php-fpm -y 

3、nginx 整合php-fpm

修改/etc/php-fpm.d/www.conf 文件中的user 和group, 与nginx.conf 中的user一致

user = nginx

group = nginx

4、启动php-fpm 服务

systemctl start php-fpm

5、修改nginx的配置

location ~ \.php$ {
    root /usr/share/nginx/html;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
    include fastcgi_params;
          
}

6、重启nginx

nginx -s reload

7、编写index.php

8、打开浏览器访问

localhost:80/index.php

9、安装rrdtool 相关依赖

yum install perl rrdtool perl-libwww-perl libwww-perl-rrdtool -y 

10、安装nginx-rdd

wget http://soft.vpser.net/status/nginx-rrd/nginx-rrd-0.1.4.tgz

tar zxvf nginx-rrd-0.1.4.tgz
cd nginx-rrd-0.1.4
cp  usr/sbin/* /usr/sbin  # 复制主程序文件到/usr/sbin 下
cp  etc/nginx-rrd.conf /etc # 复制配置文件到 /etc 下
cp html/index.php /usr/share/nginx/html/ 

11、修改配置vi /etc/nginx-rrd.conf

RRD_DIR = "/usr/share/nginx/html/nginx-rrd";
WWW_DIR = "/usr/share/nginx/html/";

13、新建定时任务

crontab -l 
* * 	* * * /bin/sh /usr/sbin/nginx-collect
*/1 * 	* * * /bin/sh /usr/sbin/nginx-graph

查看任务

tail -f /var/log/cron 

14、ab压测

安装ab压测工具: yum -y install httpd-tools

ab -n 10000 -c 10 http://127.0.0.1/index.html

4.5、nginx优化

  • 增加工作线程数和并发连接数
  • 启用长连接
  • 启用缓存、压缩
  • 操作系统优化