系统性能优化-持续更新

文章目录

  • CPU
    • 概念
    • 相关概念
    • 分析工具
      • 使用方式
  • 内存
    • 相关概念
    • 分析工具
      • 使用方式
  • IO
    • 相关概念
    • 工具
      • 使用方式
  • 网络
    • 工具
      • 使用方式
  • 系统负载
    • 概念
    • 工具
      • 使用
  • 具体

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

具体

  1. 查看当前系统整体负载:这时候最好不要直接上top,有可能会影响整体系统的情况。
    uptime :查看系统1/5/15分钟内的系统运行情况
  2. CPU:
    vmstat:查看等待执行的任务数和当前系统core的数量关系
    mpstat: -P ALL 1 :查看CPU在各个层面的占用率
    pidstat:查看每个进程占用CPU的具体情况
    taskset:查看每个进程的亲和性
  3. 内存
    /proc/meminfo:查看系统内存的总体情况
    free:同上
  4. 磁盘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%通常意味着饱和.
  1. 网络
    sar
    -n DEV 1:查看网卡的读写带宽情况
    -n TCP,ETCP 1:Tcp协议的操作情况
  2. 中断情况
    /proc/interrupts:查看系统当前所有的中断情况
中断号 中断次数 中断设备名称
  1. Top命令:
    查看线程执行在具体的core上: top -H -> f/F键 -> “Last Used Cpu (SMP)”
    按照CPU使用率排序: -H
    按照内存使用率排序:-M
    展示所有core的使用情况:top -> 1键
  2. trace
    1. ftrace,编译时使用-pg选项,会在函数入口处增加一条call mcount指令。

https://www.ibm.com/developerworks/cn/linux/l-cn-ftrace/index.html

你可能感兴趣的:(性能优化)