转载

【深入浅出-JVM】(43):pidstat 命令

iostat 是 i/o statictics 输入输出统计

【深入浅出-JVM】(43):pidstat 命令

安装

apt install sysstat

CPU 使用情况

iostat -u

【深入浅出-JVM】(43):pidstat 命令

解析:

  • %usr
    进程在用户空间占用 CPU 的百分比
  • %system
    进程在内核空间占用 CPU 的百分比
  • %guest
    进程在虚拟机占用 CPU 的百分比
  • %CPU
    进程占用 CPU 的百分比
  • CPU
    处理进程的 CPU 编号
  • Command
    进程对应的命令

内存使用情况

pidstat -r

【深入浅出-JVM】(43):pidstat 命令

解析:

  • PID
    进程标识符
  • minflt/s
    任务每秒发生的次要错误
  • majflt/s
    任务每秒发生的主要错误
  • VSZ
    虚拟机地址大小
  • RSS
    常驻内存大小

I/O 使用情况

pidstat -d

【深入浅出-JVM】(43):pidstat 命令

解析:

  • PID
    进程id
  • kb_rd/s
    每秒从磁盘读取的 KB
  • kb_wr/s
    每秒写入磁盘 KB
  • kb_ccwr/s
    任务取消写入磁盘的kb
  • COMMAND
    task的命令

进程的上下文切换

【深入浅出-JVM】(43):pidstat 命令 pidstat -w

解析:

  • PID
    进程id
  • cswch/s
    每秒主动任务上下文切换数量
  • nvcswch/s
    每秒被动任务上下文切换数量
  • command
    task的命令

    线程情况

    pidstat -t
    【深入浅出-JVM】(43):pidstat 命令

解析:

  • TGID
    主线程的表示
  • TID
    线程的 ID
  • %usr
    进程在用户空间占用的 CPU 百分比
  • %system
    进程在内核空间占用的 CPU百分比
  • %guest
    进程在虚拟机占用的 CPU 百分比
  • %CPU
    进程占用 CPU 的百分比
  • CPU
    处理进程的 CPU 编号
  • Command
    进程的命令

例子

一个线程占用大量 CPU资源,其他 3 个线程空闲

/**
 * @version 1.0
 * @author: mousycoder
 * @date: 2019-07-18 17:06
 */
public class HoldCPUMain {

    public static class HoldCPUTask implements Runnable{
        @Override
        public void run() {
            while (true){
                double a = Math.random() * Math.random();
            }
        }
    }

    public static class LazyTask implements Runnable{
        @Override
        public void run() {
            try {
                while (true){
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        new Thread(new HoldCPUTask()).start();
        new Thread(new LazyTask()).start();
        new Thread(new LazyTask()).start();
        new Thread(new LazyTask()).start();
    }
}
  1. jps 找到 pid
    【深入浅出-JVM】(43):pidstat 命令
  2. pidstat -p 20049 -u -t 1 3 找到 CPU100 的线程的pid 20061
    【深入浅出-JVM】(43):pidstat 命令
  3. jstack -l 20049 > dump.txt 导出线程 dump文件
  4. 打印 20061 对应 16 进制 printf %x 20061 为4e5d
  5. 查看 dump 文件 4e5d 线程的堆栈 ,定位到问题
    【深入浅出-JVM】(43):pidstat 命令

一个线程大量的读写,其他 3 个线程空闲

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @version 1.0
 * @author: mousycoder
 * @date: 2019-07-18 17:06
 */
public class HoldIOMain {

    public static class HoldIOTask implements Runnable {
        @Override
        public void run() {
            while (true) {
                try {
                    FileOutputStream fos = new FileOutputStream(new File("temp"));
                    for (int i = 0; i < 10000; i++) {
                        fos.write(i);
                    }

                    fos.close();
                    FileInputStream fis = new FileInputStream(new File("temp"));
                    while (fis.read() != -1) {
                    }

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static class LazyTask implements Runnable{
        @Override
        public void run() {
            try {
                while (true) {
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        new Thread(new HoldIOTask()).start();
        new Thread(new LazyTask()).start();
        new Thread(new LazyTask()).start();
        new Thread(new LazyTask()).start();

    }
}
  1. 查看pid jps
    【深入浅出-JVM】(43):pidstat 命令
  2. 查看线程磁盘情况 pidstat -p 20203 -d -t
    【深入浅出-JVM】(43):pidstat 命令
  3. 查看线程 dump jstack -l > io.dump
  4. 查看线程十六进制 printf %x 20215 4ef7
  5. 查看线程dump cat io.dump | grep ‘4ef7’ -A 50 -B 50;
    【深入浅出-JVM】(43):pidstat 命令
  6. 定位到线程堆栈

总结

  1. jps 查看线程
  2. pidstat -p 20267 -t -d -r -u -w 1 3 查看线程、内存、CPU、上下文切换,每隔 1 秒取一次,循环 3 次
原文  http://mousycoder.com/thinking-in-jvm/43/
正文到此结束
Loading...