一、JAVA性能调优之linux命令工具

一、linux性能收集和统计工具
二、JAVA性能调优之jdk命令工具

一、linux性能收集和统计工具

linux在性能遇到问题时,常用的查看分析命令有

  • top:能够实时显示系统各个进程的资源占用情况;
  • sar:可以周期性的对内存CPU使用情况采样;
  • vmstat:可统计CPU内存使用情况、swap使用情况等信息;
  • iostat:提供的是详细的I/O信息;
  • pidstat:可以监视进程的性能情况,也可以监视线程的情况;

下面分别介绍这几个命令参数的

1、top命令

在这里插入图片描述

top命令的输出分为两部分:前半部分是系统统计信息和进程统计信息,后半部分是进程区的信息

第1行是任务队列信息,从左到右依次为系统当前时间、系统运行时间、当前登录用户数。最后的load average表示系统的平均负载,即任务队列的平均长度,这3个值分别表示1分钟、5分钟、15分钟到现在的平均值。

第2行是进程统计信息,其含义从左到右表示正在运行的进程数、睡眠进程数、停止的进程数、僵户进程数。

第3行是CPU统计信息,us表示用户空间CPU占用率、Sy表示内核空间CPU 占用率、ni表示用户进程空间改变过优先级的进程CPU的占用率、id表示空闲CPU占用率、Wa表示等待输入输出的CPU时间百分比、hi表示硬件中断请求、si表示软件中断请求。

第4行是内存统计信息,其含义从左到右依次表示内存总量、已使用的内存、空闲内存、内核缓冲使用量。

第5行是交换区的统计信息,不做说明

进程区的列说明如下

列名含义
PID进程id
USER进程所有者的用户名
PR优先级
NInice值。负值表示高优先级,正值表示低优先级
VIRT进程使用的虚拟内存总量,单位KB。VIRT=SWAP+RES
RES进程使用的、未被换出的物理内存大小,单位KB
S进程状态,D,不可中断的睡眠状态,R,运行,S,睡眠,T,跟踪停止,Z,僵尸
%CPU上次更新到现在的CPU时间占用百分比
%MEM进程使用的物理内存百分比
TIME+进程使用的CPU时间总计,单位1/100秒
COMMAND进程名

top还有一些隐藏的列,在top下按F键,可以对列进行选择或者排序,top只能查看是哪一个进程占用资源较高

2、sar命令

sar [options] [ []]

interval和count分别表示采样周期(秒)和采样数量(采样几次)。options选项可以指定sar命令对哪些性能数据进行采样,

options参数列表

options选项选项对应含义
A所有报告的总和
uCPU利用率
d硬盘使用报告
bI/O情况
q队列长度
r内存使用统计信息
n网络信息统计

例:CPU使用情况sar -r 1 3

在这里插入图片描述

3、vmstat命令

vmstat可统计CPU内存使用情况、swap使用情况等信息,默认采样一次,也可以和sar一样设置采样频率。

在这里插入图片描述

参数含义列表

参数各列含义
Procsr:等待运行的进程数 b:处在非中断睡眠状态的进程数
Memoryswpd:虚拟内存使用情况 free:空闲的内存 buff:被用来作为缓存的内存数
Swapsi:从磁盘交换到内存的交换页数量 SO:从内存交换到磁盘的交换页数量
IObi:发送到块设备的块数 bo:从块设备接收到的块数
Systemin:每秒的中断数,包括时钟中断 CS:每秒的上下文切换次数
CPUuS:用户CPU使用时间 sy:内核CPU系统使用时间 id:空闲时间

4、iostat命令

当怀疑是磁盘I/O引起的性能问题时,可以采用iostat命令排查问题。通过iostat可以快速定位系统是否产生了大
量的IO操作。

iostat可以不跟参数运行,也可以跟上详细的参数

iostat

iostat 1 3

iostat [options] [ []] options的值可以使用 iostat -help获取
在这里插入图片描述

列参数含义

参数列含义
tps该设备每秒的传输次数
kB_read/s每秒从设备读取的数据量
kB_wrtn/s每秒向设备写入的数据量
kB_read读取的总数据量
kB_wrtn写入的总数据量
KB_dscd每秒设备丢弃的数据量

5、pidstat命令

5.1 CPU监控

1、编写一个占用CPU的程序,一个占用线程,两个空闲的线程

package com.toto.cpu;

/**
 * @Description: CpuUseDemo
 * @Package: com.toto
 * @Author gufanbiao
 * @CreateTime 2024-06-05 18:41
 */
public class Cppackage com.toto.cpu;

/**
 * @Description: CpuUseDemo
 * @Package: com.toto
 * @Author gufanbiao
 * @CreateTime 2024-06-05 18:41
 */
public class CpuUseDemo {
    public static class CpuUseMax implements Runnable {
        @Override
        public void run() {
            while (true) {
                double a = Math.random()*Math.random();
            }
        }
    }
    public static class CpuUseMin implements Runnable {
        @Override
        public void run() {
            while (true) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    //throw new RuntimeException(e);
                }
            }
        }
    }

    public static void main(String[] args) {
        System.out.println("开启占用CPU线程");
        new Thread(new CpuUseMax()).start();
        System.out.println("开启两个不是那么占用线程的线程1");
        new Thread(new CpuUseMin()).start();
        System.out.println("开启两个不是那么占用线程的线程2");
        new Thread(new CpuUseMin()).start();
    }
}
uUseDemo {
    public static class CpuUseMax implements Runnable {
        @Override
        public void run() {
            while (true) {
                double a = Math.random()*Math.random();
            }
        }
    }
    public static class CpuUseMin implements Runnable {
        @Override
        public void run() {
            while (true) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    //throw new RuntimeException(e);
                }
            }
        }
    }

    public static void main(String[] args) {
        // 开启占用CPU线程
        new Thread(new CpuUseMax()).start();
        // 开启两个不是那么占用线程的线程
        new Thread(new CpuUseMin()).start();
        new Thread(new CpuUseMin()).start();
    }
}

2、运行程序,使用jps查找java程序的pid

[root@localhost ~]# jps
71563 Jps
71548 CpuUseDemo

3、使用pidstat输出程序cpu的使用情况

[root@localhost ~]# pidstat -p 71548 -u 1 3
...
07:40:55 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
07:40:56 PM     0     71970  100.00    0.00    0.00  100.00     0  java
07:40:57 PM     0     71970   99.01    0.00    0.00   99.01     0  java
07:40:58 PM     0     71970  100.00    0.00    0.00  100.00     0  java
Average:        0     71970   99.67    0.00    0.00   99.67     -  java

-p用于指定进程ID

-u表示对CPU使用率的监控。

1 3表示每秒钟采样一次,合计采样3次。

从输出中可以看到,该应用程序CPU占用率几乎达100%。pidstat的功能不仅仅限于观察进程信息,它可以进一步监控线程的信息。

[root@localhost ~]# pidstat -p 71970 1 3 -u -t
Linux 3.10.0-1160.el7.x86_64 (localhost.localdomain) 	06/09/2024 	_x86_64_	(2 CPU)

08:01:00 PM   UID      TGID       TID    %usr %system  %guest    %CPU   CPU  Command
08:01:01 PM     0     71970         -  100.00    0.00    0.00  100.00     0  java
...
08:01:01 PM     0         -     71972    0.00    0.00    0.00    0.00     0  |__GC task thread#
08:01:01 PM     0         -     71973    0.00    0.00    0.00    0.00     0  |__GC task thread#
...
08:01:01 PM     0         -     71982  100.00    0.00    0.00  100.00     0  |__Thread-0
08:01:01 PM     0         -     71983    0.00    0.00    0.00    0.00     1  |__Thread-1
08:01:01 PM     0         -     71984    0.00    0.00    0.00    0.00     1  |__Thread-2

参数-t将进程中的线程级别输出,可以明确看到是71982线程较高。

进一步使用jstack -l 71982>/opt/71982.txt,可以看到是哪段代码出的问题。

“Thread-0” #8 prio=5 os_prio=0 tid=0x00007f77e0152800 nid=0x11a6a runnable [0x00007f77cb0c7000]
java.lang.Thread.State: RUNNABLE
at com.toto.cpu.CpuUseDemo$CpuUseMax.run(CpuUseDemo.java:15)
at java.lang.Thread.run(Thread.java:750)

5.2 IO监控

IO 的监控同CPU监控类似

  • 首先使用 jps 查看进程ID
  • 其次使用 pidstat -p 71970 1 3 -d -t
  • 再次使用 jstack 导出当前线程的堆栈信息,定位IO操作的代码
5.3 内存监控

该命令和参数,能查出内存的占用情况

pidstat -p -r 71970 1 3

6、话外篇

jps 命令不存在时

[root@localhost ~]# Jps
bash: Jps: command not found...
[root@localhost ~]# yum list *openjdk-devel*
[root@localhost ~]# yum install java-1.8.0-openjdk-devel.x86_64

查看java安装目录

执行命令,逐步寻找java安装目录

[root@localhost /]# which java
/usr/bin/java
[root@localhost /]# ls -lrt /usr/bin/java
lrwxrwxrwx. 1 root root 22 Jun  6 03:25 /usr/bin/java -> /etc/alternatives/java
[root@localhost /]# ls -lrt /etc/alternatives/java
lrwxrwxrwx. 1 root root 73 Jun  6 03:25 /etc/alternatives/java -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412.b08-1.el7_9.x86_64/jre/bin/java

修改环境变量文件

[root@localhost bin]# vi /etc/profile
##JAVA_HOME配置
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412.b08-1.el7_9.x86_64/jre	
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

3.使配置生效

source /etc/profile

ot@localhost bin]# vi /etc/profile


```shell
##JAVA_HOME配置
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412.b08-1.el7_9.x86_64/jre	
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

3.使配置生效

source /etc/profile

3.ip设置

TYPE="Ethernet"
PROXY_METHOD="static"
BROWSER_ONLY="no"
BOOTPROTO="none"
IPADDR=192.168.102.103
GATEWAY=192.168.102.2
DNS1=114.114.114.114
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="2cda184a-8947-444d-b12c-a7b253a1b7e3"
DEVICE="ens33"
ONBOOT="yes"
systemctl  restart network
  • 17
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Grain322

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值