测试环境
系统: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