title: Linux常用系统性能测试命令(硬盘、内存、CPU)
categories: Linux
timezone: Asia/Shanghai
date: 2019-01-06

环境

REHL7
CentOS7

1.硬盘监控

为什么把硬盘性能查看放到最前边,因为现在服务起来说,一般CPU和内存都基本可以满足要求,但是由于很多服务器存储还是使用机械硬盘,所有往往瓶颈实在硬盘IO上,所以系统出现问题要重点查看硬盘IO占用。

1.简单粗暴的测试硬盘写入速度
[root@redhat73 ~]# dd if=/dev/zero of=/home/linshi.a bs=1024000000 count=2
2+0 records in
2+0 records out
2048000000 bytes (2.0 GB) copied, 4.67577 s, 438 MB/s

写入一个2GB的文件,用时4.67577秒,平均438 MB/s
2.iotop命令:简单的top类I/O监视器,可用来查看具体某进程所占用的硬盘IO情况。
# 安装
yum install iotop -y

# 简单使用
iotop
    左右箭头    改变列
    r           改变排序
    a           切换累计还是当前实时速度
    d           马上刷新。默认1秒刷新一次
    q           退出

# 常用示例
iotop -d 0.1        # 刷新时间0.1秒
iotop -d 0.1 -n 10  # 刷新时间0.1秒,10次后退出

    -p pid      要监控的pid进程号,不加此参数默认监控所有
    -o          仅显示执行I/O的进程,执行过程中可以按o切换
    -u USERNAME 监控指定用户的IO
    -a          显示累计,而不是当前IO
    -b          非交互模式,一般用来记录日志
    -k          使用kB单位,而不是对人友好的单位。在非交互模式下,脚本编程有用。
    -t          加时间戳,非交互模式下记录日志非常有用
    -q          禁止头几行,非交互模式。有三种指定方式。
        -q     只在第一次监测时显示列名
        -qq    永远不显示列名。
        -qqq   永远不显示I/O汇总。
    
# 各列说明:    
    PID         进程PID(按p切换)
    PRIO        
    USER        用户
    DISK READ   读取速度
    DISK WRITE> 写入速度(>代表按当前列排序)
    SWAPIN      进程或者线程花费在交换内存时间的百分比。
                如果出现SWAPIN百分比很高,可以肯定内存不足了,赶快通过free -h 查看一下内存情况,并合理优化内存相关配置。
    IO          占用IO百分比
    COMMAND     进程名
3.iostat命令:分硬盘统计所有进程写入和读取总速度
# 安装
yum install -y sysstat

# 简单实用
iostat -m 1 3       # 每1秒输出一次,执行3次后退出,并已MB为单位显示

# 输出说明
最上面指示系统版本、主机名和当前日期
Linux 3.10.0-514.el7.x86_64 (redhat73.com)      01/05/2019      _x86_64_        (1 CPU)

总体cpu使用情况统计信息,对于多核cpu,这里为所有cpu的平均值
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
        0.00    0.00  100.00    0.00    0.00    0.00
    
    %user	CPU在用户态执行进程的时间百分比。
    %nice	CPU在用户态模式下,用于nice操作,所占用CPU总时间的百分比
    %system	CPU处在内核态执行进程的时间百分比
    %iowait	CPU用于等待I/O操作占用CPU总时间的百分比
    %steal	管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟CPU的百分比
    %idle	CPU空闲时间百分比

1. 若 %iowait 的值过高,表示硬盘存在I/O瓶颈 
2. 若 %idle 的值高但系统响应慢时,有可能是CPU等待分配内存,此时应加大内存容量 
3. 若 %idle 的值持续低于1,则系统的CPU处理能力相对较低,表明系统中最需要解决的资源是 CPU

各磁盘设备的IO统计信息
Device:            tps    MB_read/s    MB_wrtn/s    MB_read    MB_wrtn
sda             752.33         0.00       366.35          0        315
scd0              0.00         0.00         0.00          0          0
dm-0            934.88         0.00       453.58          0        390
dm-1              0.00         0.00         0.00          0          0
    Device      磁盘名称
    tps         每秒向磁盘设备请求数据的次数,包括读、写请求,为rtps与wtps的和。
                出于效率考虑,每一次IO下发后并不是立即处理请求,而是将请求合并(merge),这里tps指请求合并后的请求计数。
    MB_read/s   读取速度(单位:MB/s)
    MB_wrtn/s   写入速度(单位:MB/s)
    MB_read     取样时间间隔内读取总数(单位:MB)
    MB_wrtn     取样时间间隔内写入总数(单位:MB)

2.内存

[root@localhost home]# free -h
              total        used        free      shared  buff/cache   available
Mem:           974M         56M        818M        580K         99M        787M
Swap:          2.0G         37M        2.0G

    # 参数解释
    -m      以MB为单位输出
    -g      以GB为单位输出
    -h      以人类可读的单位输出,自动转换KB、MB或者GB为单位
    -s N    每N秒打印一次
    -c N    打印N次后退出
    
    
# 输出说明(Mem代表物理内存、Swap代表虚拟内存)
total       表示系统的总内存
used        表示应用程序已经使用的内存
free        表示当前还没有被使用的内存 
shared      表示共享链接库使用的内存
buff/cache  表示系统的page cache和buffer使用到的内存
available   表示应用程序还可以申请到的内存

怎么判断是否需要加内存:
    1.swap使用有多少
    2.available剩余是多少,而不是看free

cache是Linux系统为了提高系统运行效率而将一些程序或文件写入到cache,可提高程序运行和加载速度,如果程序需要会马上释放。所以判断系统内存是否足够和是否需要增加的时候不能简单的看free
Cache Pages:
    A cache is the part of the memory which transparently stores data so that future requests for that data can be served faster. 
    This memory is utilized by the kernel to cache disk data and improve i/o performance.

    
系统当前使用到的内存是:used + buff/cache,used中包含了shared。
所以total = used + buff/cache + free = 56 + 99 + 818 = 973
available(787) <= free + buff/cache(818 + 99 = 917),为什么是小于呢?因为系统的一些page或cache是不能回收的。

3.CPU

查看CPU信息
# 总核数 = 物理CPU个数 X 每颗物理CPU的核数 
# 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数

# 查看物理CPU个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l

# 查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo| grep "cpu cores"| uniq

# 查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"| wc -l

# 查看CPU信息(型号)
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c