CPU
概念
分析CPU时,主要分析CPU的调度以及性能。线程本身有很多种状态:
状态
备注
描述
R
running
S
sleeping
D
Disk sleep
Z
zombie
I
idle
但线程针对于CPU只有两种状态:
on-CPU:执行占用CPU中,并且分为用户态时间user和系统态时间sys;
off-CPU:等待CPU,或者等待I/O,锁,换页等,具体状态包括可执行,匿名换页,睡眠,锁,空闲等状态。
相关概念
核数
硬件线程
时钟频率
CPI/IPC
用户态时间/系统态时间
运行队列
分析工具
工具
描述
top
监控每个进程的cpu用量
uptime
平均负载
vmstat
包括系统范围的cpu平均负载
mpstat
查看所有cpu的核信息
sar -u
查看cpu信息
pidstat
查看进程cpu用量分解
perf
cpu剖析
使用方式
//查看系统cpu使用情况
// 1键查看所有核的使用率; P按照cpu占用率进行排序;c显示完整的命令
top
//查看所有cpu核信息
mpstat -P ALL 1
//查看cpu使用情况以及平均负载
vmstat 1
//进程cpu的统计信息
pidstat -u 1 -p pid
//跟踪进程内部函数级cpu使用情况
内存
相关概念
物理内存
虚拟内存
常驻内存
虚拟地址空间
页缓存
缺页
换页
用户态内存分配器:libc,glibc,libmalloc,mtmalloc
内核态内存分配器:slub分配器。
分析工具
工具
描述
free
查看系统整体内存情况
vmstat
虚拟内存统计信息
top
查看每个进程内存占用
pidstat
查看活动进程的内存占用
pmap
查看进程的内存映像
sar -r
查看内存情况
dtrace
动态跟踪
valgrind
内存检查工具
使用方式
// M按照内存使用排序
top
//1s采集周期,获取内存的统计信息
pidstat -p pid -r 1
//查看进程的内存映像信息
pmap -d pid
//检测程序内存问题
valgrind --tool= memcheck --leak-check= full --log-file= ./log.txt ./程序名
IO
磁盘是系统中最慢的子系统。
相关概念
文件系统
VFS
文件系统缓存
页缓存page cache
缓存区高速缓存buffer cache
目录缓存
inode
inode缓存
noop调用策略
工具
工具
描述
iostat
磁盘详细统计信息
iotop
按进程查看磁盘IO的使用情况
pidstat
按进程查看磁盘IO的使用情况
perf
跟踪工具
使用方式
//查看系统io信息
iotop
//统计io详细信息
iostat -d -x -k 1 10
//查看进程级io的信息
pidstat -d 1 -p pid
//查看系统IO的请求,比如可以在发现系统IO异常时,可以使用该命令进行调查,就能指定到底是什么原因导致的IO异常
perf record -e block:block_rq_issue -ag
perf report
网络
工具
工具
描述
ping
traceroute
跟踪源主机和目标机直接的路由信息
netstat
查看进程和端口之间的统计数据,以及TCP/UDP等协议包的统计信息
ss
查看socket统计信息
tcpdump
tcpflow
tcp统计流
sar -n DEV
网卡流量情况
sar -n SOCK
查询网络以及TCP/UDP状态信息
使用方式
//显示网络统计信息
netstat -s
//显示当前UDP连接状况
netstat -nu
//显示UDP端口号的使用情况
netstat -apu
//统计机器中网络连接各个状态个数
netstat -a | awk '/^tcp/ {++S[$NF ]} END {for(a in S) print a, S[a]}'
//显示TCP连接
ss -t -a
//显示sockets摘要信息
ss -s
//显示所有udp sockets
ss -u -a
//tcp,etcp状态
sar -n TCP,ETCP 1
//查看网络IO
sar -n DEV 1
//抓包以包为单位进行输出
tcpdump -i eth1 host 192.168.1.1 and port 80
//抓包以流为单位显示数据内容
tcpflow -cp host 192.168.1.1
系统负载
概念
系统负载可以简单理解为运行队列的长度
工具
工具
描述
top
uptime
strace
跟踪系统调用以及每个系统调用的执行时间
dmesg
查看系统日志
使用
//查看负载情况
uptime
top
vmstat
//统计系统调用耗时情况
strace -c -p pid
//跟踪指定的系统操作例如epoll_wait
strace -T -e epoll_wait -p pid
//查看内核日志信息
dmesg
具体
查看当前系统整体负载:这时候最好不要直接上top,有可能会影响整体系统的情况。
uptime :查看系统1/5/15分钟内的系统运行情况
CPU:
vmstat :查看等待执行的任务数和当前系统core的数量关系
mpstat : -P ALL 1 :查看CPU在各个层面的占用率
pidstat :查看每个进程占用CPU的具体情况
taskset :查看每个进程的亲和性
内存
/proc/meminfo :查看系统内存的总体情况
free :同上
磁盘IO
iostat :-xz 1 : 查看所有磁盘的读写带宽/读写请求数/设备使用率
r/s,w/s,rkB/s,wkB/s
分别表示每秒设备读次数,写次数,读的KB数,写的KB数。它们描述了磁盘的工作负载。也许性能问题就是由过高的负载所造成的
await
I/O平均时间,以毫秒作单位。它是应用中I/O处理所实际消耗的时间,因为其中既包括排队用时也包括处理用时。如果它比预期的大,就意味着设备饱和了,或者设备出了问题
avgqu-sz
分配给设备的平均请求数。大于1表示设备已经饱和了。(不过有些设备可以并行处理请求,比如由多个磁盘组成的虚拟设备)
%util
设备使用率。这个值显示了设备每秒内工作时间的百分比,一般都处于高位。低于60%通常是低性能的表现(也可以从await中看出),不过这个得看设备的类型。接近100%通常意味着饱和.
网络
sar :
-n DEV 1:查看网卡的读写带宽情况
-n TCP,ETCP 1:Tcp协议的操作情况
中断情况
/proc/interrupts :查看系统当前所有的中断情况
Top命令:
查看线程执行在具体的core上 : top -H -> f/F键 -> “Last Used Cpu (SMP)”
按照CPU使用率排序 : -H
按照内存使用率排序 :-M
展示所有core的使用情况 :top -> 1键
trace
ftrace,编译时使用-pg选项,会在函数入口处增加一条call mcount指令。
https://www.ibm.com/developerworks/cn/linux/l-cn-ftrace/index.html