笔记 | Linux 性能监视与跑分测试

测试环境

系统:Kali Linux amd64

用户:yowfung

工具:htop, net-tools, ping, iperf, UnixBench 等

Linux 性能测试是运维和安全测试相关人员的一门必备技能。了解基本的性能查看命令可以帮助你更全面地了解服务器环境,掌握基本的性能测试能够让你对服务器的运行性能有更细致的了解。这里我整合了一些基本的性能查看与测试技巧,主要包含有基本信息查看、磁盘读写测试、网络通信测试和综合性能跑分测试等,以便日后查阅。


基本信息查看

查看 CPU 参数:

cat /proc/cpuinfo

该命令会列出 CPU 的详细信息,包括 CPU 个数、核心数、主频、型号等。

下面这些命令是筛选查看 CPU 的某个信息:

# 查看逻辑 CPU 的个数:
cat /proc/cpuinfo | grep 'physical id' | sort | uniq
 
# 查看 CPU 的型号:
cat /proc/cpuinfo | grep 'model name' | sort | uniq
 
# 查看单个 CPU 的内核数:
cat /proc/cpuinfo | grep 'cpu cores' | sort | uniq
 
# 查看 CPU 总线程数:
cat /proc/cpuinfo | grep 'processor'

查看内存参数:

cat /proc/meminfo

该命令可以查看内存的详细信息,包括内存容量、交换空间、高速缓存等。

查看内存使用情况:

free -mh

该命令可查看当前 Linux 对内存和交换空间的占用情况。

查看进程情况:

# 安装 htop
sudo apt install htop
 
# 运行 htop
htop

htop 软件可以查看当前的 CPU 和内存使用情况,以及当前正在运行的进程,其界面也是很炫酷美观的。

查看磁盘使用情况:

df -h

该命令可以查看所有挂载分区的容量和使用情况。

查看网卡信息:

ifconfig -a

查看 PCI 总线信息:

lspci

磁盘读写测试

磁盘 I/O (Input/Outpu) 读写速度是磁盘性能的一个重要指标。测试主机磁盘 IO 性能可以用以下两个命令。

# 方案一
dd if=/dev/zero of=test bs=4k count=256000 oflag=dsync
 
# 方案二
dd if=/dev/zero of=test bs=4k count=256000 conv=fdatasync

两个都是往硬盘中写入 1 Gbytes 的数据,只是第一个的速度慢的要命。 使用 dsync,dd 会从 /dev/zero 中,每次读取 4Kbytes 数据,然后直接写入到硬盘当中,重复此步骤,直到共读取并且写入了 1 Gbytes 的数据。 使用 fdatasync,dd 会从 /dev/zero 中一次性读取 1 Gbytes 的数据,写入到磁盘的缓存中,然后再从磁盘缓存中读取,一次性写入到硬盘当中。


网络通信测试

测试网络连通情况:

ping -c 4 {HOST}

其中 {HOST} 为目标主机,可以是域名或 IP 地址。有显示响应时间则表示网络连通。

测试网速:

# 下载测试脚本
git clone https://github.com/sivel/speedtest-cli.git
 
# 进入下载目录
cd speedtest-cli/
 
# 运行网速测试
./speedtest.py

运行这个脚本后,可以明显看得出下载和上传的网速。需要注意的是,这里的单位是 Mbit/s,而不是我们平常所说网速的多少 MB/s,他们之间的换算关系为 8Mbit/s = 1MB/s。

测试 TCP 吞吐量和 UDP 丢包率:

iperf 是一款基于TCP/IP 和 UDP/IP 的网络性能测试工具,它可以用来测量网络带宽和网络质量,还可以提供网络延迟抖动、数据包丢失率、最大传输单元等统计信息。网络管理员可以根据这些信息了解并判断网络性能问题,从而定位网络瓶颈,解决网络故障。

以下的测试过程需要由两台主机来配合完成,如果没有两台物理主机的话,也可以在虚拟机或 docker 容器中进行。

在下面的测试中,我们假设客户端主机为 172.20.10.3,服务器主机为 172.17.0.2,测试前分别在客户端主机和服务器主机中安装 iperf。

# 安装 iperf 软件
sudo apt install iperf3

在服务器主机中输入以下命令开启 iperf 服务,此时服务器会启动监听 5201 端口。

iperf3 -s

测试 TCP 吞吐量:在客户端主机中输入以下命令。

iperf3 -c {ServerHost}

其中 {ServerHost} 为服务器主机的 IP,这里为上面假设的 172.17.0.2。 为了确定网卡的最大吞吐量,iperf 将尝试从客户端尽可能快地向服务端发送数据请求,并且会输出发送的数据量和网卡平均带宽值。 从图中输出信息可以看出,iperf 默认测试 10 秒钟,共传送了 76.2 GB 的数据量,网卡的带宽平均速率为 65.5 Gbits/s,即 8.19 GB/s。由于我在测试时,服务器主机在本地电脑的 docker 容器中,故才会有这么惊人的传输速率,而在实际应用时,服务器主机应该选择实际被测试的目标,一般情况下不会有这么高的传输速率。

为了模拟更真实的测试,你可以添加 iperf 命令的参数,自定义传送的数据量、测试时长、输出频率以及线程数等。

iperf3 -c {ServerHost} -t {Time} -i {Interval} -n {Number} -P {Parallel}

其中 {ServerHost} 为服务器主机的 IP,{Time} 为测试的时长,{Tnterval} 为每隔几秒输出一个测试结果,{Number} 为要传送的数据量,{Parallel} 为采用多少线程进行传输。这里值得注意的是,这里 -t 参数和 -n 参数不能同时设置。 如上图所示,这里设置了 107374182400 字节的数据量,即 100 GB,每隔 5 秒输出一次测试结果,并且设置为双线程传输。可以看到最终的平均传输速率为 68.6 Gbits/s,并且每一条虚线分隔的,都是一次传输的记录,每次都有两条(双线程)记录和一条总的平均记录。 这里要提醒一下,如果你是用来测试你的付费云主机,请注意你的带宽流量费用,非必要时不要像我这样一次性传送这么大的数据量。

下面来测试 UDP 丢包和延迟。

说明:由于 UDP 协议是一个非面向连接的轻量级传输协议,并且不提供可靠的数据传输服务,因此对 UDP 应用的关注点不是传输数据有多快,而是它的丢包率和延时指标。

iperf3 -c {ServerHost} -u -i {Interval} -b {Bandwidth}

其中 {ServerHost} 为服务器主机的 IP,{Interval} 为每隔多少秒输出一次测试结果,{Bandwidth} 为需要传输的带宽。进行 UDP 测试的主要参数为 -u。 如上图,设置为每隔 1 秒输出测试结果,带宽为 200M。注意虚线下面的信息,Jitter 表示抖动时间(或称为传输延迟),Lost/Total 表示丢失的数据报和总的数据报数量,后面的 0% 是平均丢包的比率,Datagrams 表示总共传输数据报的数量。 这里需要说明的是,由于我是使用本地的 docker 容器进行测试,所以得到的结果比较理想(0%),而实际上 UDP 的丢包率很少会出现这样理想的情况的。


综合性能跑分

UnixBench 是一款开源的测试 Unix 系统基本性能的工具,是比较通用的测试性能的工具,Unixbench 的主要测试项目有:系统调用、读写、进程、图形化测试、2D、3D、管道、运算、C库等系统基准性能提供测试数据。

操作步骤:

# 进入系统临时目录
cd /tmp
 
# 下载 UnixBench 源码包
wget https://github.com/kdlucas/byte-unixbench/archive/v5.1.3.tar.gz
 
# 解压缩
tar -zxvf v5.1.3.tar.gz
 
# 进入软件目录
cd byte-unixbench-5.1.3/UnixBench/
 
# 运行跑分测试
sudo ./Run

测试时间比较久,等待测试完成后,可以看到如下这样的界面:

看最后一行的 System Benchmarks Index Score,是跑分测试的综合总得分。 列表中 BASELINE 为基准线,RESULT 为跑分结果,而 INDEX 则为测试系统的测试结果与一个基线系统测试结果的比值,即 INDEX = RESULT / BASELINE × 10。 这样得出的值比原始测试结果更有参考价值。

再来看看每一项测试结果所表示的含义吧。

项目

说明

Dhrystone 2 using register variables

此项用于测试 string handling。因为没有浮点操作,所以深受软件和硬件设计、编译和链接、代码优化、对内存的cache、等待状态、整数数据类型的影响。

Double-Precision Whetstone

这一项测试浮点数操作的速度和效率。覆盖面很广的一系列 C 函数:sin,cos,sqrt,exp,log 被用于整数和浮点数的数学运算、数组访问、条件分支和程序调用。

Execl Throughput

此测试考察每秒钟可以执行的 execl 系统调用的次数。

File Copy

测试从一个文件向另外一个文件传输数据的速率。每次测试使用不同大小的缓冲区。

Pipe Throughput

测试一秒钟内一个进程可以向一个管道写 512 字节数据然后再读回的次数。

Pipe-bases Context Switching

测试两个进程每秒钟通过一个管道交换一个不断增长的整数的次数。这个测试程序首先创建一个子进程,再和这个子进程进行双向的管道传输。

Process Creation

测试每秒钟一个进程可以创建子进程然后收回子进程的次数(子进程一定立即退出)。Process Creation 的关注点是新进程进程控制块(process control block)的创建和内存分配。

Shell Scripts

测试一秒钟内一个进程可以并发地开始一个 shell 脚本的 n (一般取值为1、2、4、8)个拷贝的次数。

System Call Overhead

测试进入和离开操作系统内核的代价,即一次系统调用的代价。它利用一个反复地调用 getpid 函数的小程序达到此目的。

Graphical Tests

测试非常粗的 2D 和 3D 图形性能,尤其是 3D 测试非常有限。测试结果和硬件,系统合适的驱动关系很大。


必要说明:

我在写这篇推文的时候,也参考了网上很多大咖写的博客和书籍,这里所涉及的大部分方案均不是我首先提出的,我只是将各位大咖的资料做了一个整合与加工,如果对本篇推文提及的一些技术有不懂的,可以移步查阅下面的参考来源,也可以在公众号给我留言。

参考文章:

《dd命令的conv=fsync,oflag=sync/dsync》 | 学步园

《基于Linux系统的性能测试》 | CSDN

《Unixbench 测试工具分析》 | 简书

《Linux网络性能评估工具iperf 、CHARIOT测试网络吞吐量》 | konglingbin

原文发布于微信公众号 - 悠风的采坑日记(yowfung)

原文发表时间:2019-08-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券