Linux 性能监控分析
Linux 性能测试指标评估
https://blog.51cto.com/364879551/2095709
超全整理! Linux 性能分析工具汇总合集
https://www.cnblogs.com/tcicy/p/8461807.html
Linux 系统性能 10 条命令监控
https://www.cnblogs.com/qmfsun/p/5729442.html
18 个监控网络带宽的工具
一, 影响 Linux 服务器性能的因素
1. 操作系统级
. CPU
. 内存
. 磁盘 I/O 带宽
. 网络 I/O 带宽
2. 程序应用级
二, 系统性能评估标准
影响性能因素
其中:
%user: 表示 CPU 处在用户模式下的时间百分比.
%sys: 表示 CPU 处在系统模式下的时间百分比.
%iowait: 表示 CPU 等待输入输出完成时间的百分比.
swap in: 即 si, 表示虚拟内存的页导入, 即从 SWAP DISK 交换到 RAM
swap out: 即 so, 表示虚拟内存的页导出, 即从 RAM 交换到 SWAP DISK.
三, 系统性能分析工具
1. 常用系统命令
Vmstat,sar,iostat,netstat,free,ps,top 等
2. 常用组合方式
用 vmstat,sar,iostat 检测是否是 CPU 瓶颈
用 free,vmstat 检测是否是内存瓶颈
用 iostat 检测是否是磁盘 I/O 瓶颈
用 netstat 检测是否是网络带宽瓶颈
通过执行以下命令, 可以在 1 分钟内对系统资源使用情况有个大致的了解.
- uptime
- dmesg | tail
- vmstat 1
- mpstat -P ALL 1
- pidstat 1
- iostat -xz 1
- free -m
- sar -n DEV 1
- sar -n TCP,ETCP 1
- top
其中一些命令需要安装 sysstat 包, 有一些由 procps 包提供. 这些命令的输出, 有助于快速定位性能瓶颈, 检查出所有资源 (CPU, 内存, 磁盘 IO 等) 的利用率 (utilization), 饱和度(saturation) 和错误 (error) 度量, 也就是所谓的 USE 方法.
一, uptime --- 快速查看服务器的负载情况
命令的输出分别表示 1 分钟, 5 分钟, 15 分钟的平均负载情况, 正常情况需要小于 CPU 个数(2 个);
通过这三个数据, 可以了解服务器负载是在趋于紧张还是区域缓解. 如果 1 分钟平均负载很高, 而 15 分钟平均负载很低, 说明服务器正在命令高负载情况, 需要进一步排查 CPU 资源都消耗在了哪里. 反之, 如果 15 分钟平均负载很高, 1 分钟平均负载较低, 则有可能是 CPU 资源紧张时刻已经过去.
上面例子中的输出, 可以看见最近 1 分钟的平均负载非常高, 且远高于最近 15 分钟负载, 因此我们需要继续排查当前系统中有什么进程消耗了大量的资源. 可以通过下文将会介绍的 vmstat,mpstat 等命令进一步排查.
二, dmesg | tail
打印内核环形缓存区中的内容, 可以用来查看一些错误;
该命令会输出系统日志的最后 10 行. 示例中的输出, 可以看见一次内核的 oom kill 和一次 TCP 丢包. 这些日志可以帮助排查性能问题.
注释:
1,Linux 内核有个机制叫 OOM killer(Out Of Memory killer), 该机制会监控那些占用内存过大, 尤其是瞬间占用内存很快的进程, 然后防止内存耗尽而自动把该进程杀掉.
2,TCP 丢包:
TCP 是基于不可靠的网络实现可靠的传输, 肯定也会存在掉包的情况, 如果通信中发现缺少数据或者丢包, 那么, 最大的可能在于程序发送的过程或者接收的过程出现问题.
例如服务端要给客户端发送大量数据, Send 频率很高, 那么就很有可能在 Send 环节出现错误(1. 程序处理逻辑错误, 2. 多线程同步问题, 3. 缓冲区溢出等), 如果没有对 Send 发送失败做处理, 那么客户端收到的数据比理论要收到的数据少, 就会造成丢数据, 丢包现象.
三, vmstat 1
vmstat 命令, 每行会输出一些系统核心指标, 这些指标可以让我们更详细的了解系统状态. 后面跟的参数 1, 表示每秒输出一次统计信息, 表头提示了每一列的含义, 这几介绍一些和性能调优相关的列:
r: 等待在 CPU 资源的进程数. 这个数据比平均负载更加能够体现 CPU 负载情况, 数据中不包含等待 IO 的进程. 如果这个数值大于机器 CPU 核数, 那么机器的 CPU 资源已经饱和.
free: 系统可用内存数(以千字节为单位), 如果剩余内存不足, 也会导致系统性能问题. 下文介绍到的 free 命令, 可以更详细的了解系统内存的使用情 况.
si, so: 交换区写入和读取的数量. 如果这个数据不为 0, 说明系统已经在使用交换区(swap), 机器物理内存已经不足.
us, sy, id, wa, st: 这些都代表了 CPU 时间的消耗, 它们分别表示用户时间 (user), 系统(内核) 时间(sys), 空闲时间(idle),IO 等待时间(wait) 和被偷走的时间(stolen, 一般被其他虚拟机消耗).
上述这些 CPU 时间, 可以让我们很快了解 CPU 是否出于繁忙状态. 一般情况下, 如果用户时间和系统时间相加非常大, CPU 出于忙于执行指令. 如果 IO 等待时间很长, 那么系统的瓶颈可能在磁盘 IO.
示例命令的输出可以看见, 大量 CPU 时间消耗在用户态, 也就是用户应用程序消耗了 CPU 时间. 这不一定是性能问题, 需要结合 r 队列, 一起分析.
procs
r 列表示运行和等待 CPU 时间片的进程数, 如果长期大于 1, 说明 CPU 不足, 需要增加 CPU.
b 列表示在等待资源的进程数, 比如正在等待 I/O, 或者内存交换等.
memory
swpd 切换到内存交换区的内存数量(k 表示). 如果 swpd 的值不为 0, 或者比较大, 比如超过了 100m, 只要 si,so 的值长期为 0, 系统性能还是正常
free 当前的空闲页面列表中内存数量(k 表示)
buff 作为 buffer cache 的内存数量, 一般对块设备的读写才需要缓冲.
cache: 作为 page cache 的内存数量, 一般作为文件系统的 cache, 如果 cache 较大, 说明用到 cache 的文件较多, 如果此时 IO 中 bi 比较小, 说明文件系统效率比较好.
swap
si 由内存进入内存交换区数量.
so 由内存交换区进入内存数量.
IO
bi 从块设备读入数据的总量(读磁盘)(每秒 kb).
bo 块设备写入数据的总量(写磁盘)(每秒 kb)
这里我们设置的 bi+bo 参考值为 1000, 如果超过 1000, 而且 wa 值较大应该考虑均衡磁盘负载, 可以结合 iostat 输出来分析.
system 显示采集间隔内发生的中断数
in 列表示在某一时间间隔中观测到的每秒设备中断数.
cs 列表示每秒产生的上下文切换次数, 如当 cs 比磁盘 I/O 和网络信息包速率高得多, 都应进行进一步调查.
CPU 表示 CPU 的使用状态
us 列显示了用户方式下所花费 CPU 时间的百分比. us 的值比较高时, 说明用户进程消耗的 CPU 时间多, 但是如果长期大于 50%, 需要考虑优化用户的程序.
sy 列显示了内核进程所花费的 CPU 时间的百分比. 这里 us + sy 的参考值为 80%, 如果 us+sy 大于 80% 说明可能存在 CPU 不足.
wa 列显示了 IO 等待所占用的 CPU 时间的百分比. 这里 wa 的参考值为 30%, 如果 wa 超过 30%, 说明 IO 等待严重, 这可能是磁盘大量随机访问造成的, 也可能磁盘或者磁盘访问控制器的带宽瓶颈造成的(主要是块操作).
id 列显示了 CPU 处在空闲状态的时间百分比
vmstat 第一次输出表示从开机到 vmstat 运行时的平均值; 剩余输出的都是在指定的时间间隔内的平均值, 上述例子中 delay 的值设置为 1, 除第一次以外, 剩余的都是 1 秒统计一次, count 未设置, 将会一直循环打印.
上述的例子中 delay 设置为 10,count 设置为 3, 表示每行打印 10 秒内的平均值, 只打印 3 次.
r: 表示正在运行或者等待 CPU 调度的进程数. 因为该列数据不包含 I/O 的统计信息, 因此可以用来检测 CPU 是否饱和. 若 r 列中的数字大于 CPU 的核数, 表示 CPU 已经处于饱和状态.
free: 当前剩余的内存;
si, so: 交换分区换入和换出的个数, 若换入换出个数大于 0, 表示内存不足;
us, sy, id, wa:CPU 的统计信息, 分别表示 user time,system time(kernel),idle,wait I/O.I/O 处理所用的时间包含在 system time 中, 因此若 system time 超过 20%, 则 I/O 可能存在瓶颈或异常;
四, mpstat -P ALL 1
该命令可以显示每个 CPU 的占用情况, 如果有一个 CPU 占用率特别高, 那么有可能是一个单线程应用程序引起的.
五, pidstat 1
pidstat 命令输出进程的 CPU 占用率, 该命令会持续输出, 并且不会覆盖之前的数据, 可以方便观察系统动态. 如上的输出, 可以看见两个 JAVA 进程占用了将近 1600% 的 CPU 时间, 既消耗了大约 16 个 CPU 核心的运算资源.
六, iostat -xz 1
输入 iostat -x 1 3 命令, 表示开始监控输入输出状态,-x 表示显示所有参数信息, 1 表示每隔 1 秒监控一次, 3 表示共监控 3 次.
其中 rsec/s 表示读入, wsec/s 表示每秒写入, 这两个参数某一个特别高的时候就表示磁盘 IO 有很大压力, util 表示 IO 使用率, 如果接近 100%, 说明 IO 满负荷运转.
类似 vmstat, 第一次输出的是从系统开机到统计这段时间的采样数据;
r/s, w/s, rkB/s, wkB/s, 表示每秒向 I/O 设备发出的 reads,writes,read Kbytes,write Kbytes 的数量.
await, 表示应用程序排队等待和被服务的平均 I/O 时间, 该值若大于预期的时间, 这表示 I/O 设备处于饱和状态或者异常.
avgqu-sz, 表示请求被发送给 I/O 设备的平均时间, 若该值大于 1, 则表示 I/O 设备可能已经饱和;
%util, 每秒设备的利用率; 若该利用率超过 60%, 则表示设备出现性能异常;
七, free -m
若 buffers 和 cached 接近 0, 说明 I/O 的使用率过高, 系统存在性能问题.
Linux 中会用 free 内存作为 cache, 若应用程序需要分配内存, 系统能够快速的将 cache 占用的内存回收, 因此 free 的内存包含 cache 占用的部分.
free 命令可以查看系统内存的使用情况,-m 参数表示按照兆字节展示. 最后两列分别表示用于 IO 缓存的内存数, 和用于文件系统页缓存的内存数. 需要注意的是, 第 二行 -/+ buffers/cache, 看上去缓存占用了大量内存空间. 这是 Linux 系统的内存使用策略, 尽可能的利用内存, 如果应用程序需要内存, 这部分内存会 立即被回收并分配给应用程序. 因此, 这部分内存一般也被当成是可用内存.
如果可用内存非常少, 系统可能会动用交换区(如果配置了的话), 这样会增加 IO 开销(可以在 iostat 命令中体现), 降低系统性能.
八, sar -n DEV 1
sar 命令在这里可以查看网络设备的吞吐率. 在排查性能问题时, 可以通过网络设备的吞吐量, 判断网络设备是否已经饱和.
sar 是 System Activity Reporter 的缩写, 系统活动状态报告.
-n { keyword [,...] | ALL }, 用于报告网络统计数据. keyword 可以是以下的一个或者多个: DEV, EDEV, NFS, NFSD, SOCK, IP, EIP, ICMP, EICMP, TCP, ETCP, UDP, SOCK6, IP6, EIP6, ICMP6, EICMP6 和 UDP6.
-n DEV 1, 每秒统计一次网络的使用情况;
-n EDEV 1, 每秒统计一次错误的网络信息;
IFACE , 网络接口名称;
rxpck/s , 每秒接收到包数;
txpck/s , 每秒传输的报数;(transmit packages)
rxkB/s , 每秒接收的千字节数;
txkB/s , 每秒发送的千字节数;
rxcmp/s , 每秒接收的压缩包的数量;
txcmp/s , 每秒发送的压缩包的数量;
rxmcst/s, 每秒接收的组数据包数量;
sar -b 1
sar 命令查看当天 IO 统计记录
sar -n TCP,ETCP 1
该命令可以用于粗略的判断网络的吞吐量, 如发起的网络连接数量和接收的网络连接数量;
TCP, 报告关于 TCPv4 网络流量的统计信息;
ETCP, 报告有关 TCPv4 网络错误的统计信息;
sar 命令在这里用于查看 TCP 连接状态, 其中包括:
active/s-- 发起的网络连接数量: 每秒本地发起的 TCP 连接数, 既通过 connect 调用创建的 TCP 连接;
passive/s-- 接收的网络连接数量: 每秒远程发起的 TCP 连接数, 即通过 accept 调用创建的 TCP 连接;
retrans/s: 每秒 TCP 重传数量;
TCP 连接数可以用来判断性能问题是否由于建立了过多的连接, 进一步可以判断是主动发起的连接, 还是被动接受的连接. TCP 重传可能是因为网络环境恶劣, 或者服务器压力过大导致丢包.
九, iotop
iotop 命令类似于 top 命令, 但是显示的是各个进程的 I/O 情况, 对于定位 I/O 操作较重的进程有比较大的作用.
十, top
top 命令包 含了前面好几个命令的检查的内容. 比如系统负载情况 (uptime), 系统内存使用情况(free), 系统 CPU 使用情况(vmstat) 等. 因此通过这 个命令, 可以相对全面的查看系统负载的来源. 同时, top 命令支持排序, 可以按照不同的列排序, 方便查找出诸如内存占用最多的进程, CPU 占用率最高的进 程等.
但是, top 命令相对于前面一些命令, 输出是一个瞬间值, 如果不持续盯着, 可能会错过一些线索. 这时可能需要暂停 top 命令刷新, 来记录和比对数据.
dstat
dstat 命令是一个用来替换 vmstat,iostat,netstat,nfsstat 和 ifstat 这些命令的工具, 是一个全能系统信息统计工具.
直接使用 dstat, 默认使用的是 - cdngy 参数, 分别显示 CPU,disk.NET,page,system 信息;
来源: http://www.bubuko.com/infodetail-3365629.html