目录
- 前言
- linux性能度量标准
- 监控工具
- top
- uptime
- ps/pstree
- free
- mpstat
- vmstat
前言
在实际产品开发过程中遇到一些莫名其妙的问题,比如swap交换分区随着时间增多影响到系统调用
,或CPU占用以及内存的监测等,所以有必要系统了解Linux的性能问题。
linux性能度量标准
-
处理器度量标准
- CPU使用率。
- 用户进程消耗CPU的时间。
- 内核操作消耗CPU的时间。
- 等待
- CPU空闲时间。
- Nice消耗CPU时间。
- 平均负载。
- 可运行的进程。
- 阻塞的进程。
- 上下文切换。
- 中断。
-
内存度量标准
- 空闲内存。
- 使用的swap。
- 缓冲和缓存。
- Slab。
- **活跃与非活跃内存 **。
-
块设备度量标准
- I/O等待。
- 平均队列长度。
- 平均等待时间。
- 每秒传输。
- 每秒读取/写入块的数量。
- 每秒读取/写入的字节。
-
网络接口度量标准
- 收和发送的数据包。
- 接收和发送的字节。 这个指标描述了一个给定网络接口接收和发送的字节数。
- 每秒钟的冲突数量 。 这个值给出了在网络上连接的每个接口发出冲突的相对数量。如果发生持续冲突通常要关注网络基础设施的问题,而不是服务器。
- 丢弃的数据包 。已经被内核丢弃的数据包的统计数。丢弃的原因可能是由于防火漆配置,也可能是由于缺乏网络缓冲区。
- 溢出。
- 错误。
监控工具
工具 | 最有用的工具功能 |
---|---|
top | 提供运行系统的动态实时试图 |
uptime | 显示系统平均负载 |
ps/pstree | 提供当前进程列表 |
free | 显示系统中空闲内存和已使用内存的数量 |
mpstat | 报告处理器相关的统计数据 |
vmstat | 报告进程、内存、磁盘、系统、cpu的统计信息 |
iostat | 报告cpu统计数据,还有设备和分区的输入、输出统计数据 |
netstat,ss | 显示相关网络统计信息 |
sar | 收集报告系统活动信息 |
numastat | 显示每个NUMA节点的内存统计信息 |
pmap | 报告一个进程的内存映射 |
iptraf | 交互式局域网监控程序 |
tcpdump/wireshark | 用来捕捉和分析网络流量 |
straceltrace | 系统调用和库调用跟踪程序 |
gnuplot | 命令行绘图工具 |
Gnome System Monitor | Gnome桌面环境的图形性能分析工具 |
KDE System Guard | KDE任务管理器和性能监控器 |
top
- 系统摘要信息
top - 15:34:43 up 21:09, 2 users, load average: 1.22, 1.24, 1.37
- 任务和CPU状态
- Tasks: 235 total
/*总共任务数量*/
, 1 running/*正在运行的任务数*/
, 234 sleeping/*睡眠*/
, 0 stopped/*中止*/
, 0 zombie/*僵尸状态数*/
- %Cpu(s): 8.5 us
(c.1)
, 13.1 sy(c.2)
, 0.0 ni(c.3)
, 64.9 id(c.4)
, 0.0 wa(c.5)
, 12.7 hi(c.6)
, 0.8 si(c.7)
, 0.0 st(c.8)
c.1
:运行非nice的用户进程时间
c.2
:运行内核进程的时间
c.3
:运行nice的用户进程时间
c.4
:空闲花费的时间
c.5
:IO等待花费的时间
c.6
:服务硬件中断花费的时间
c.7
:服务软件中断花费的时间
c.8
:通过pypervisor虚拟机偷走的时间
- Tasks: 235 total
- 内存使用情况
- KiB Mem : 4059384 total, 135604 free, 1840076 used, 2083704 buff/cache
- KiB Swap: 2029680 total, 1789196 free, 240484 used. 2001496 avail Mem
- 内核管理的任务列表
- PID
d.1
USER``d.2 PRd.3
NId.4
VIRTd.5
RESd.6
SHRd.7
Sd.8
%CPUd.9
%MEMd.10
TIME+d.11
COMMANDd.12
d.1
:进程标识符
d.2
:任务拥有者(或启用者)的有效用户名
d.3
:任务的优先级
d.4
:任务的nice值。正数nice值意味着较高的优先级
d.5
:任务使用的虚拟内存的总量,包括所有代码,数据,共享库交换出的分页
d.6
:常驻内存的大小。任务所使用的非交换的物理内存。rescode+data
d.7
:任务所使用的共享内存量。它只反映了可与其他进程共享的内存。
d.8
:进程状态。D
:不可中断的睡眠R
:正在运行S
:睡眠T
:跟踪或停止Z
: 僵尸
d.9
:CPU总时间的百分比
d.10
:任务当前使用的可用物理内存
d.11
:自系统启动开始任务所使用的总共CPU时间
d.12
:显示用于启动任务的命令行或相关程序的名称
- PID
- 热键 详细按
h
查看
uptime
16:23:33a.
up 21:58b.
, 2 usersc.
, load average: 0.29, 1.00, 1.23d.
a.
: 系统时间 b.
:cpu时间 c.
:当前用户登录数 d.
:服务器在过去1分钟,5分钟和15分钟的系统平均负载
-
系统平均负载是可运行状态进程或不可中断状态进程的平均数。处在可运行状态的进程要么是正在使用CPU,要么是等待使用CPU。处在不可中断状态的进程正在等待一些I/O访问,例如等待磁盘。平均值有3个时间间隔。因为系统中CPU的数量、平均负载不是规范化的,所以,平均负载为1意味着一个单CPU系统始终是有负载的,在一个4核CPU系统上则意味着它有75%的空闲时间。
-
平均负载最佳值为1,这意味着每个进程都能立刻访问CPU,并且没有丢失CPU周期。对于单(核)处理器工作站,1或2是可以接受的,而在多处理器服务器上你可能会看到8到10的数字(单核CPU负载是2,4核CPU负载可能是8)。
-
可以使用uptime确定问题出在服务器还是网络。例如,如果一个网络应用程序运行很糟糕,则可以运行uptime,查看系统负载是否很高。如果没有,则这个问题很可能关系到你的网络,而不是你的服务器。
ps/pstree
- 查看进程号的几种方式
ps -ef |grep P1 |grep -v color |awk '{print $2}'
ps -C P1 -o pid=
pgrep P1
- pstree
- 可能使用的最多的是确认多进程和当前进程有多少线程吧。
pstree -p
一个main函数中增加2个线程确认如下,main作为一个进程也是一个线程,增加复杂线程或内存使用多样化的线程中可以增加线程名,后续方便排查问题。
- 可能使用的最多的是确认多进程和当前进程有多少线程吧。
free
基本的用法不在此展开,只做一些自己开发过程中的需求记录。
- 在使用过程中需要申请大块内存,可能导致
OOM
问题,所以在申请过程中按照剩余内存的.9系数申请 ,
代码获取剩余内存方式:- 使用popen方式获取系统调用返回值,然后解析返回的剩余内存
- 读取虚拟/proc/meminfo获取剩余内存
mpstat
因为开发板没有该命令,因此再次不做更新记录
vmstat
vmstat用来报告关于进程,内存,分页,块io,中断,cpu活动的信息。
vmstat命令显示平均数据或实际样本。通过vmstat命令提供一个采样频率和采样次数可启用采样模式。
- vmstat -n {n为采样频率}
第一行产生的报告是自上次重启之后的平均值,因此应该考虑排除它。可以使用delay给出采样周期的长度报告更多的信息。进程和内存的报告是瞬时的。
-
Procs
- r, 可运行进程的数量(正在运行或等待运行时间。)
- b, 不可中断睡眠状态进程的数量。
-
memory
- swpd,虚拟内存使用的数量。
- free,用作空闲内存的数量。
- buff,用作缓冲区的内存数量。
- cache,用作缓存的内存数量。
- nact,非活跃内存的数量(使用-a选项)。
- active,活跃内存的数量(使用-a选项)。
-
swap