本文主要内容:
简单回答:
top、iostat、pidstat、ps、vmstat、netstat、sar等。
能细说一下吗?下面就来好好聊聊这几这个命令。
top命令
top命令是Linux下常用的性能分享工具,能够实时显示系统中各个进程的资源占用状况信息。使用top命令输出:
输出信息可以分为两部分:
head部分
第一行
“728 days, 1:28”为系统启动后到现在的运作时间;
“2 user”为当前登录到系统的用户,更确切的说是登录到用户的终端数 , 同一个用户同一时间对系统多个终端的连接将被视为多个用户连接到系统,这里的用户数也将表现为终端的数目;
“load average”为当前系统负载的平均值,后面的三个值分别为1分钟前、5分钟前、15分钟前进程的平均数,一般的可以认为这个数值超过 CPU 数目时,CPU 将比较吃力的负载当前系统所包含的进程;
第二行
“77 sleeping”为当前处于等待状态中的进程数;
第三行
第四行
- 分别表示了内存总量、当前使用量、空闲内存量、以及缓冲使用中的内存量;
第五行
表示类别同第四行(Mem),但此处反映着交换分区(Swap)的使用情况。通常,交换分区(Swap)被频繁使用的情况,将被视作物理内存不足而造成的。
body部分
参数说明
在top命令下,按下f键。可以进行列的选择,使用o键可以更改列的显示顺序。
另外一些常见快捷键:
上下箭头:上下滚动查看进程;
注意:使用top命令可以从宏观上观察系统各个进程对CPU的占用情况以及内存使用情况。
使用方式
top [-][d] [p][q] [c][C] [S][s] [n]
参数说明:
- d:指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变之。
- p:通过指定监控进程ID来仅仅监控某个进程的状态。
- q:该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行。
- s:使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。
sar命令
sar命令也是Linux系统中重要的性能监测工具之一,特可以周期性地对内存和CPU进行采样。
下面使用sar命令统计CPU使用情况,每秒钟采样一次,采样五次。
使用方式
sar [options] []
interval和count分别表示采样周期和采样数量。
options:可以指定sar命令对哪些性能数据进行采样,可能每个系统版本会导致其options不一样,所以建议先试用
sar -h
查看具体参数:
监测内存使用
我们来做一个内存使用进行采样:每秒一次,采样五次。
监测IO信息
每秒一次,采样五次。
注意:sar命令可以查看I/O信息、内存信息以及CPU情况。
vmstat命令
vmstat是一款功能比较齐全的性能监测工具,使用它可以统计CPU、内存、swap使用情况等信息。可以指定采样周期和采样次数。
小试牛刀
参数说明
procs
memory
swap
io
system
CPU
- sy: 系统进程执行时间(system time)
- id: 空闲时间(包括IO等待时间),中央处理器的空闲时间 。以百分比表示。
案例详情
模拟一个线程切换频繁的案例。
代码如下:
写一个controller:
@RestController
@RequestMapping("/thread")
public class ThreadContextSwitchController {
@GetMapping("/test")
public String switchContext(){
HoldLockDemo.test();
try {
Thread.sleep(200000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "ok";
}
}
线程切换部分代码:
import java.util.Random;
public class HoldLockDemo {
public static Object[] lock = new Object[10];
public static Random r = new Random();
static {
for (int i = 0; i < lock.length; i++) {
lock[i] = new Object();
}
}
public static class HoldLockTask implements Runnable {
private int i;
public HoldLockTask(int i) {
this.i = i;
}
@Override
public void run() {
try {
while (true) {
//获取锁
synchronized (lock[i]) {
if (i % 2 == 0) {
System.out.println("wait");
//等待
lock[i].wait(r.nextInt(10));
} else {
System.out.println("notifyAll");
//唤醒所有等待所
lock[i].notifyAll();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void test() {
for (int i =0;i<lock.length;i++){
System.out.println("test method");
new Thread(new HoldLockTask(i/2)).start();
}
}
}
访问:
使用vmstat命令一秒采样一次,采样五次:
可以看到对应cs线程切换的值,us用户CPU的值。
注意:vmstat工具可以查看内存、交互分区、I/O操作、上线文切换、时钟中断已经CPU的使用情况。
iostat命令
iostat可以提供详尽的I/O信息。
基本使用如下:每一秒采样一次,采样五次。
参数说明
%nice:CPU处在带NICE值的用户模式下的时间百分比。
%system:CPU处在系统模式下的时间百分比。
%iowait:CPU等待输入输出完成时间的百分比。
%steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。
注意
- 如果%iowait的值过高,表示硬盘存在I/O瓶颈。
- 如果%idle值高但系统响应慢时,可能是CPU等待分配内存,应加大内存容量。
- 如果%idle值持续低于10,表明CPU处理能力相对较低,系统中最需要解决的资源是CPU。
CPU属性值说明:
- kB_read/s:每秒从设备(drive expressed)读取的数据量。
- kB_wrtn/s:每秒向设备(drive expressed)写入的数据量。
pidstat命令
pidstat是一个功能强大的性能检测工具,特也是Systat的组件之一。
systat组件主要包括
iostat 工具提供CPU使用率及硬盘吞吐效率的数据; #比较核心的工具
mpstat 工具提供单个处理器或多个处理器相关数据;
pidstat: 关于运行中的进程/任务、CPU、内存等的统计信息
sar 工具负责收集、报告并存储系统活跃的信息; #统计数据的核心工具
sa1 工具负责收集并存储每天系统动态信息到一个二进制的文件中。它是通过计划任务工具cron来运行,是为sadc所设计的程序前端程序;
sa2工具负责把每天的系统活跃性息写入总结性的报告中。它是为sar所设计的前端 ,要通过cron来调用
sadc 是系统动态数据收集工具,收集的数据被写一个二进制的文件中,它被用作sar工具的后端;
nfsiostat: NFS(Network File System)的I/O统计信息。
cifsiostat: CIFS(Common Internet File System)的统计信息
pidstat主要用于监控全部或指定进程占用系统资源的情况,如CPU,内存、设备IO、任务切换、线程等。pidstat首次运行时显示自系统启动开始的各项统计信息,之后运行pidstat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。
通过pidstat -help命令,可以查看到有以下几个常用参数可以监测线程的性能:
常用参数
监测CPU
输出参数说明:
PID: 进程pid
- %system: 进程在内核态运行所占cpu时间比率
监测内存
使用pidstat命令,还可以监测指定进程的内存使用情况。
下面就使用pidstat工具对进程pid=27180的进程进程内存监控。
每一秒采样一次,采样五次:
输出参数说明:
- minflt/s: 每秒次缺页错误次数(minor page faults),次缺页错误次数意即虚拟内存地址映射成物理内存地址产生的page fault次数
- majflt/s: 每秒主缺页错误次数(major page faults),当虚拟内存地址映射成物理内存地址时,相应的page在swap中,这样的page fault为major page fault,一般在内存使用紧张时产生
监测I/O
使用-d选项,我们可以查看进程IO的统计信息:
输出参数说明:
- kB_rd/s: 每秒进程从磁盘读取的数据量(以kB为单位)
- kB_wr/s: 每秒进程向磁盘写的数据量(以kB为单位)
ps命令
ps (Process Status) 。进程状态。使用该命令可以确定有哪些进程正在运行和运行的状态 。ps是显示瞬间进程的状态,并不动态连续,如果想对进程进行实时监控应该用 top 命令。
如果直接使用 ps 命令,会显示所有进程的状态,通常结合 grep 命令查看某进程的状态。(grep 即 global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
ps
结果默认会显示4列信息。
使用man ps可以查看:
参数:
- -A :所有的进程均显示出来,与 -e 具有同样的效用;
- -a :显示现行终端机下的所有进程,包括其他用户的进程;
- x :通常与 a 这个参数一起使用,可列出较完整信息。
输出格式规划:
使用ps -ef 命令查看Linux系统的进程
输出参数说明:
- TTY:当前进程在哪个终端上运行,若与进程无关,则显示为?,若为pts/0等,则表示由网络连接主机进程。
查找mysql进程、java进程、Tomcat进程等。
还可以使用ps aux查看
常见ps操作
- ps a 显示现行终端机下的所有程序,包括其他用户的程序。
- ps c 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。
- ps e 列出程序时,显示每个程序所使用的环境变量。
- ps f 用ASCII字符显示树状结构,表达程序间的相互关系。
- ps -N 显示所有的程序,除了执行ps指令终端机下的程序之外。
- ps -t 指定终端机编号,并列出属于该终端机的程序的状况。
使用PS实时监控进程状态
ps 命令会显示你系统当前的进程状态,但是这个结果是静态的。
当有一种情况,我们需要像上面第四点中提到的通过CPU和内存的使用率来筛选进程,并且我们希望结果能够每秒刷新一次。为此,我们可以将ps命令和watch命令结合起来。
watch -n 1 ‘ps -aux --sort -pmem, -pcpu’
如果输出太长,我们也可以限制它,比如前20条,我们可以使用head命令来做到。
watch -n 1 ‘ps -aux --sort -pmem, -pcpu | head 20’
这里的动态查看并不像top或者htop命令一样。但是使用ps的好处是你能够定义显示的字段,你能够选择你想查看的字段。举个例子,如果你只需要看名为‘root‘用户的信息,你可以使用下面的命令:
watch -n 1 ‘ps -aux -U root u --sort -pmem, -pcpu | head 20’
netstat命令
netstat命令用于显示网络相关信息,例如网络连接信息,路由表信息,端口占用情况等。建议查看:
https://www./2010/03/netstat-command-examples/
常见参数
-a (all)显示所有选项,默认不显示LISTEN相关
-l 仅列出有在 Listen (监听) 的服务状态
-c 每隔一个固定时间,执行该netstat命令。
显示所有连接信息
-a 选项用于显示全部连接信息:
列出所有 tcp 端口
netstat -at
显示监听状态的端口
netstat -l
查看某特定端口被哪个进程占用
netstat -an | grep ':8089'
总结
使用命令可以查看内存、CPU和线程切换等信息。还可以通过命令查看进程信息,以及进程对内存的占用和CPU的使用情况。