Loading

Linux - 性能统计命令汇总

监测服务器性能的基本命令

通过 CPU、内存、I/O 这三方面,回顾 Linux 系统下,服务器性能监测命令以及问题排查思路。

CPU

查看 CPU 软硬件信息

$ cat /proc/cpuinfo
processor       : 系统核编号,从 0 开始排序
vendor_id       : 制造商
cpu family      : 产品系列号
model           : 产品系列中的哪一代,代号
model name      : CPU 名称和编号,标称主频
stepping        : 更新版本
microcode       : 0x1d
cpu MHz         : 实际使用主频
cache size      : 二级缓存大小
physical id     : 单个 CPU 标号
siblings        : 单个 CPU 逻辑物理核数
core id         : 当前物理核在其所处 CPU 中的编号,不一定连续
cpu cores       : 该逻辑核所处 CPU 的物理核数
apicid          : 区分不同逻辑核的编号,每个逻辑核编号必然不同
initial apicid  : 初始化逻辑核编号
fpu             : 是否具有浮点运算单元(Floating Point Unit)
fpu_exception   : 是否支持浮点计算异常
cpuid level     : 执行 cpuid 指令前,eax 寄存器中的值,根据不同的值 cpuid 指令会返回不同的内容
wp              : 表明当前CPU是否在内核态支持对用户空间的写保护(Write Protection)
flags           : 当前CPU支持的功能
bogomips        : 在系统内核启动时粗略测算的CPU速度(Million Instructions Per Second)
clflush size    : 每次刷新缓存的大小单位
cache_alignment : 缓存地址对齐单位
address sizes   : 可访问地址空间位数
power management: 对能源管理的支持

常用过滤查找命令

# 查询系统CPU的个数
$ cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l
2

# 查询系统具有多少个逻辑核
$ cat /proc/cpuinfo | grep "processor" | wc -l
8

# 查询系统CPU的物理核数
$ cat /proc/cpuinfo | grep "cpu cores" | uniq
cpu cores : 4

# 查询系统CPU是否启用超线程; 输出二者一致,没有启用超线程,否则被启用
$ cat /proc/cpuinfo | grep -e "cpu cores"  -e "siblings" | sort | uniq
cpu cores : 4
siblings  : 4

查看进程运行信息

$ top

# -d:设置刷新间隔秒数
# -n:设置更新次数,到达指定次数后自动退出 top 视图
# -p:获取指定端口的进程信息

# 当前时间,系统运行天数;当前系统在线用户数;负载 1 分钟、5 分钟、15 分钟
top - 10:07:34 up 262 days, 16:41,  1 user,  load average: 0.02, 0.04, 0.05

# 共运行进程数,2 个正在运行,829 在休眠状态;0 个停止状态; 0 个僵尸进程
Tasks: 831 total,   2 running, 829 sleeping,   0 stopped,   0 zombie

# cup 占用百分比:us 用户使用;sy 系统使用;ni ;id 空闲/等待;wa 等待写入
%Cpu(s):  0.1 us,  0.1 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

# 内存占用:总内存;空闲内存;已经使用内存;缓存
KiB Mem : 16252328 total,   690012 free,  6821492 used,  8740824 buff/cache
KiB Swap:  8290300 total,  8290300 free,        0 used.  8294140 avail Mem 

# 进程详情 
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                          
22166 root      20   0  162784   3056   1588 R   1.0  0.0   0:00.70 top                                                                              
  733 polkitd   20   0 1697352 142076  21752 S   0.7  0.9 709:12.65 mongod   
  
# S 代表进程运行状态
# TIME+ 代表进程使用的总时间

更详细的参数介绍,这篇 top 命令 写的非常详细,可以参考。

注意:僵尸进程会占用系统资源,影响正常程序运行,所以要及时处理掉僵尸进程。

# 使用 ps 过滤查找 stat 状态为 Z/z 的进程
$ ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'

# 使用 kill 杀掉进程
$ kill -HUP 1234
系统负载测试

新建两个服务器窗口

  • 窗口 1:运行 top 命令,实时观察系统负载数据
  • 窗口 2:运行测试命令
# yes 命令的作用是输出指定字符串,直到 yes 进程被杀死
# 运行 30 秒后获取到 yes 进程并杀死
$ { yes > /dev/null & } && sleep 30 && ps -ef | grep yes | awk '{print $2}' | xargs kill

切换到 top 命令窗口,发现 yes 命令启动的进程已经开始工作,用户态 CPU 使用率提升,系统负载增加,30 秒后 yes 进程被自动杀死,各项数据恢复。

再做一次更直观的测试,通过 for 循环启动与 CPU 核数相同的进程数运行 yes 命令。

$ for i in $(seq 0 $(($(cat /proc/cpuinfo | grep processor | wc -l) -l))); do taskset -c $i yes > /dev/null & done && sleep 30 && ps -ef | grep yes | awk '{print $2}' | xargs kill

这次发现 CPU 占用率已经接近百分百了,此时再访问该机器下的其他服务,响应就会相对变慢。说回工作,在测试过程中发现业务响应很慢,除了排查网络原因外,还可以登录服务器,通过 top 命令查看是否有其他进程导致 CPU 占用率过高。

内存

$ free -h
       total  used  free  shared  buff/cache  available
Mem:   15G    6.5G  674M  724M    8.3G        7.9G
Swap:  7.9G   0B    7.9G
  • total:总物理内存
  • used:已经使用的内存
  • free:空闲可用内存
  • shared:多进程共享内存
  • buff/cache:读写缓存内存,当 free 不足时,内核会讲该部分内存释放
    • buffer:即将要被写入磁盘的
    • cache:即将从磁盘中读出来的
  • available:还能被应用程序使用的物理内存

IO

Input / Output

硬盘 IO

通过 iostat 工具可以对系统的磁盘操作活动进行监视。

# 安装
$ yum install sysstat

# 使用
# 参数 1 代表每秒刷新一次
# 后面可以再跟一个数字,表示共刷新几次
$ iostat 1
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.00    0.00    0.00    0.00    0.00  100.00
           
# 机器硬盘信息
# tps:数据每秒传输次数;每秒从设备读写的数据量(读写速度);读写的总数据量
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               0.00         0.00         0.00          0          0
sdb               0.00         0.00         0.00          0          0
sdc               0.00         0.00         0.00          0          0

参数说明:

  • %user:CPU 处在用户模式下的时间百分比
  • %nice:CPU 处在带 NICE 值的用户模式下的时间百分比
  • %system:CPU 处在系统模式下的时间百分比
  • %iowait:CPU 等待输入输出完成时间的百分比,如果该值过高,表示硬盘存在 I/O 瓶颈
  • %steal:管理程序维护另一个虚拟处理器时,虚拟 CPU 的无意识等待时间百分比
  • %idle:CPU 空闲时间百分比,如果该值过高,表示 CPU 较空闲

备注:

如果 %idle 值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量;%idle 值如果持续低于 10,那么系统的 CPU 处理能力较低,表明系统中最需要解决的资源是 CPU。

重新启动一个窗口,通过两条命令模拟 IO 操作:

# 写
$ dd if =/dev/zero bs=1024 count=4096000 of=test.iso

# 读
$ dd if=test.iso bs=64k | dd of=/dev/null
  • bs:设置读/写缓冲区的字节数
  • /dev/null:空设备,特殊的设备文件,丢弃一切写入其中的数据
  • /dev/zero:特殊文件,当被读取时,提供无限的空字符

观察 iostat 数据情况,通过 dd 命令写入,由于是系统操作,所以用户态占用并不是很高,system 的 CPU 占用率升高。

写操作

网络 IO

使用 iftop 工具进行实时流量监控。

# 安装
$ yum install iftop

# 使用
$ iftop

# 测试向服务器发送大文件下载请求

iftop 命令界面

  • TX:发送流量
  • RX:接收流量
  • TOTAL:总流量
  • cum:运行 iftop 到目前时间的总流量
  • peak:流量峰值
  • rates:分别表示过去 2s、10s、40s 的平均流量

总结

当请求服务器时无响应,首先检查本地网络、服务器网络是否正常,其次检查服务是否部署成功并正常运行。

当请求服务器返回响应过慢时,除了检查网络问题外,还需要关注一下服务器性能问题,通过性能统计命令来初步排查原因:

1、查看 CPU 占用率是否过高;

2、查看内存空间是否充足;

3、检查硬盘读写是否过慢过多;

4、检查网络流量传输,是否存在大流量堆积,导致超时响应请求。

posted @ 2023-03-07 18:58  ABEELAN  阅读(108)  评论(0编辑  收藏  举报