vmstat 命令详解

概述

vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、IO、系统、CPU活动进行监控。

vmstat 命令

-V:显示vmstat版本信息。 -n:只在开始时显示一次各字段名称。 -a:显示活跃和非活跃内存 -d:显示磁盘相关统计信息。 -p:显示指定磁盘分区统计信息 -s:显示内存相关统计信息及多种系统活动数量。 -m:显示slabinfo -S:使用指定单位显示。参数有 k 、K 、m 、M ,分别代表1000、1024、1000000、1048576字节(byte)。默认单位为K(1024 bytes) -f:显示从系统启动至今的fork数量 。

delay:刷新时间间隔。 count:刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷。

vmstat 命令说明

该命令默认显示监控5部分:procs、memory、swap、io、system、cpu信息。具体列信息说明如下:

Procs(进程)

r: 等待运行的进程数 b: 处在非中断睡眠状态的进程数

Memory(内存) 单位:KB

swpd: 虚拟内存使用大小 free: 空闲的内存 buff: 用作缓冲的内存大小 cache: 用作缓存的内存大小

Swap (单位:KB)

si: 从交换区写到内存的大小 so: 每秒写入交换区的内存大小

IO (单位:块/秒)

bi: 每秒读取的块数 bo: 每秒写入的块数

System (系统)

in: 每秒中断数,包括时钟中断。 cs: 每秒上下文切换数。

CPU(以百分比表示):

us: 用户进程执行时间(user time) sy: 系统进程执行时间(system time) id: 空闲时间(包括IO等待时间),中央处理器的空闲时间 。以百分比表示。 wa: 等待IO时间

使用示例

1. 不使用参数

如果使用vmstat命令不使用参数,那么只显示一条监控信息

2. 间隔1秒

如果只使用一个间隔时间参数,那么,vmstat会每秒钟打印一条监控信息,直到手动关闭监控程序为止。

2. 每隔1秒打印一条,总共打印5条

vmstat 命令实战

通过运行下面程序,使用vmstat进行监控

public class VMStat {
    public static void main(String[] args) {
        String type = "0";
        if (args.length>0) {
            type = args[0];
        }
        test(type);
    }

    public static void test(String type) {
        if ("1".equals(type)) {
            new Thread(new ThreadSwitchTask()).start();
            new Thread(new ThreadSwitchTask()).start();
        } else if ("2".equals(type)) {
            new Thread(new IOTask()).start();
        } else if ("3".equals(type)) {
            new Thread(new IOTask()).start();
        } else {
            new Thread(new ThreadSwitchTask()).start();
            new Thread(new ThreadSwitchTask()).start();
            new Thread(new IOTask()).start();
            new Thread(new BusyCPUTask()).start();;
        }
    }

    public static class ThreadSwitchTask implements Runnable {
        @Override
        public void run() {
            while (true) {
                try {
                    TimeUnit.MILLISECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Thread.yield();
            }
        }
    }

    public static class IOTask implements Runnable {
        @Override
        public void run() {
            while (true) {
                try (FileOutputStream fos = new FileOutputStream(new File("file.txt"))) {
                    for (int i = 0; i < Integer.MAX_VALUE; i++) {
                        fos.write(i);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }

                try (FileInputStream fos = new FileInputStream(new File("file.txt"))) {
                    while (fos.read() != -1);

                    TimeUnit.SECONDS.sleep(2);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

    }
    public static class BusyCPUTask implements Runnable{
        @Override
        public void run() {
            while(true){
                double d = new Random().nextDouble() * new Random().nextDouble();
            }
        }
        
    }
}

type=“1”;测试线程上下文切换。 type=“2”;测试IO读写 type=“3”;测试CPU运算能力

type=“1”

当执行 ThreadSwitchTask 类时,发现线程上下文切换明显增加。

type=“2”

当执行IOTask类时,可以看出像磁盘中写入了2W多个磁盘块。 发现读的时候没有从磁盘中读取,是因为该文件在内存也存在一份,导致直接从内存中读取。

type=“3”

当执行BusyCPUTask类的时候,发现id空闲的cpu变成了50%了,因为我电脑是是双核CPU。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏PHP在线

PHP10个实用函数

介绍PHP中的10个实用函数 [导读] PHP的功能越来越强大,里面有着非常丰富的内置函数。资深的PHP程序员对它们可能都很熟悉,但很多的PHP学习者,仍然对...

36740
来自专栏锦小年的博客

python学习笔记5.2-包和模块的导入

在理解什么是包以及什么是模块之后,就要学会如何去导入包或者模块了,本文主要介绍如何导入包以及在导入包的过程中需要注意一些什么。导入包的核心是使用关键词impor...

21360
来自专栏代码世界

Python之协程

前言         在操作系统中进程是资源分配的最小单位,线程是CPU调度的最小单位。按道理来说我们已经算是把cpu的利用率提高很多了。但是我们知道无论是创建...

30270
来自专栏张善友的专栏

深入浅出事件流处理NEsper(三)

首先介绍一下NESPER的大体结构,NEsper从内容上分为两块,NEsper的核心NEsper.dll和NEsper.IO.dll。 (1)NEsper的核...

231100
来自专栏性能与架构

console.log() 之外的调试技巧

console.log( ) 是JS开发时常用的小工具,输出一些信息来辅助调试,console 还有很多有用的方法,下面介绍几个方便调试的用法 跟踪堆栈 例如想...

38290
来自专栏Python攻城狮

Redis的安装及基本使用1.Redis2.Redis安装3.redis常见配置4.redis数据操作5.redis发布订阅6.主从双备

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如 字符串(strings), ...

7510
来自专栏开源优测

RobotFramework怎么写好用例

github地址:https://github.com/robotframework/HowToWriteGoodTestCases/blob/master/H...

11020
来自专栏Hongten

java多线程系列_线程简介(1)

    线程是程序运行的基本执行单元。当操作系统(不包括单线程的操作系统,如微软早期的DOS)在执行一个程序时,会在系统中建立一个进程,而在这个进程中,必须至少...

13420
来自专栏noteless

[一]FileDescriptor文件描述符 标准输入输出错误 文件描述符

当应用程序请求打开或者操作文件时,操作系统为应用程序设置一张文件列表,具体的实现形式此处不深入说明

31320
来自专栏会跳舞的机器人

java并发编程的艺术笔记第一章——并发编程的挑战

单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切...

11230

扫码关注云+社区

领取腾讯云代金券