简介在Linux环境下,确保系统各项资源充分且稳定地运行对任何系统管理员来说都至关重要。特别是在生产环境中,理解如何对系统资源进行基准测试和压力测试可以帮助预防未来的问题,同时也能够优化现有系统的性能。
在本文中,我们将探讨如何使用命令行工具来对Linux系统的CPU、内存、网络和I/O资源进行压力测试,抛砖引玉,希望大家线下详细学习并加以练习。
CPU压力测试
在Linux系统中,对CPU进行压力测试有助于评估处理器在高负载条件下的性能和稳定性。以下是几种常见的方法来对CPU进行压力测试:
stress
stress 是一个简化的压力测试工具,旨在对系统执行决定性的负载测试。该工具可以生成多种资源的工作负载,包括CPU、内存和I/O。
ubuntu 下安装方法: *
sudo apt-get install stress
stree对CPU压力测试
命令格式: *
stress --cpu <num_of_cpus> --timeout <duration>
-
num_of_cpus 是你想要产生负载的CPU核心数。
-
duration 是测试的持续时间。如果你希望持续直到手动停止,则可省略此参数。
示例: * * * *
stress --cpu 2
# 指定压力测试的持续时间stress --cpu 2 --timeout 60s
这条命令会创建 2 个工作进程,每个进程尽量让CPU忙碌。
stress-ng
stress-ng 是一个功能更强大的工具,提供了更多压力测试功能和更精细的资源控制。它包含了数以百计的测试项目,能针对不同的系统组件施加压力,包括CPU、内存、I/O以及系统调用等。此外,stress-ng 还能收集和报告系统在压力测试期间的一些统计数据。
ubuntu 下安装方法: *
sudo apt-get install stress-ng
stress-ng对CPU压力测试
命令格式: *
stress-ng --cpu <num_of_workers> --cpu-method <test_method> --timeout <duration>
-
num_of_workers 指定任务的数量,通常与CPU的核心数相等。
-
test_method 是可选的,指定具体的CPU压力测试方法,如 matrixprod、fft 或 ackermann 等。
-
duration 指定了测试运行的时间。
使用cpuburn
cpuburn 是一个专为Linux设计的工具,旨在通过运行特定于CPU架构的高压力运算,使CPU达到其最大热产生状态。它经常用于测试系统的散热性能以及CPU稳定性。cpuburn 在运行时会极大地加热CPU,因此在使用时需要小心,以免过热损坏硬件。
由于 cpuburn 的安装可能会因不同的发行版而有所不同,它未必在所有系统中都提供,但通常你可以从相关的软件仓库或源码编译来获得它。
下载链接:https://patrickmn.com/projects/cpuburn/
使用方法:
sysbench工具
sysbench 是一款强大的多线程系统评测和基准测试工具,它对于评估各种系统参数的性能非常有用,包括:CPU性能、磁盘I/O性能、调度程序性能、内存分配和传输速度、POSIX线程的性能、数据库的性能(特别有名的是MySQL数据库的测试)。
sysbench 是开源的,通常用于Linux系统性能分析,但它也支持其他类Unix系统。安装 sysbench:
sudo apt-get updatesudo apt-get install sysbench
sysbench CPU基准测试
sysbench 可以进行CPU性能测试,通过执行大量的浮点运算来进行评估。例如:
sysbench cpu --cpu-max-prime=20000 run
这条命令将执行一个基于制定数量素数搜索的CPU基准测试(在这个例子中是20000)。
注 意 事 项在运行CPU压力测试时,请监视系统的温度和性能,确保CPU不会过热,同时注意测试可能影响到系统稳定性和数据安全。最好在一台不用于生产的机器上执行这些测试。使用如sensors(从 lm-sensors 包中提供)等工具可以帮助监控CPU温度和其他系统硬件指标。
内存压力测试
在Linux系统中,对内存进行压力测试通常是为了检验物理内存条的稳定性和问题排查,尤其是对新装的内存或系统在高负载下出现问题时进行测试。以下是与内存压力测试相关的几种方法:
stress生成内存负载
命令格式:
stress --vm <number_of_workers> --vm-bytes <memory_amount>M --timeout <duration>
这里:
-
number_of_workers 是并发生成内存负载的进程数。
-
memory_amount 是每个进程尝试分配的内存量,单位是MB(可以用G表示GB)。
-
duration 指定了测试运行的时间,例如60s或5m。
例如,下面的命令会启动4个进程,每个进程分配1GB内存,运行10分钟:
stress --vm 4 --vm-bytes 1G --timeout 10m
stress-ng比stress更全面
进行内存压力测试:
stress-ng --vm <number_of_workers> --vm-bytes <memory_amount>M --vm-keep --timeout <duration>
与 stress 命令类似,--vm-keep选项告诉 stress-ng 保持内存分配直至测试结束。例如:
stress-ng --vm 8 --vm-bytes 256M --vm-keep --timeout 20m
stress-ng --vm 2 --vm-bytes 256M --vm-keep -t 1m --metrics-brief
使用memtester工具
memtester 是另一个用户空间的内存测试程序,它能够测试和验证物理内存的完整性。
sudo apt-get install memtester
可以这样使用memtester:
sudo memtester <memory_amount>M <number_of_passes>
memory_amount 是测试的内存量, number_of_passes 是测试运行的遍数。例如: *
sudo memtester 1024M 5
sysbench内存基准测试
sysbench memory --memory-block-size=1M --memory-total-size=100G run
该命令测试内存性能,通过逐块处理总共100GB的数据,每块大小为1MB。
网络压力测试想要对Linux系统上的网络性能进行测试,通常会使用其他专门的工具,如 iperf、netperf
iperf网络性能测试
iperf 是一个常用的网络性能测试工具,它可以测试通过TCP和UDP协议的网络带宽质量,可以测试网络带宽和传输速率。
首先在两台机器上安装 iperf(一台作为服务器,另一台作为客户端):
# Debian/Ubuntusudo apt-get install iperf
然后,启动其中一台机器的iperf服务:
iperf -s # iperf服务器iperf3 -s # or iperf3服务器
在要测试的客户端上,运行iperf连接到服务器:
iperf -c <server_ip_address> # 客户端连接到iperf服务器iperf3 -c <server_ip_address> # or iperf3客户端
这样将执行一个基本的网络带宽测试。iperf 支持许多参数来调整测试类型、持续时间、并行连接数等。
netperf网络性能测试
netperf 是另一个功能强大的网络测量工具,它也可测试网络带宽、延迟和其他重要指标。
在服务器和客户端上安装 netperf: *
sudo apt-get install netperf # Debian/Ubuntu
在服务器端启动 netperf: * *
netserver
在客户端进行测试: *
netperf -H <server_ip_address>
以上命令将默认执行一个TCP带宽测试。
这些工具都比 stress 更适合于网络性能测试,因为它们特别设计来测量网络带宽、连接质量、延迟等关键网络性能指标。在执行网络性能测试时,请将服务器和客户端放置在你希望测试的目标网络环境中,而不是在本地环境或者受限带宽的环境中。这将提供更准确的网络性能数据。
IO压力测试
stress测试IO
要使用 stress 进行I/O性能测试,你可以用 -i 选项来指定启动多少个进程来执行同步I/O操作。这能帮助你创建一个针对存储子系统运行的负载。
stress --io 4
或者,如果你想进一步指定测试持续多长时间,可以添加 -t 或 --timeout 参数:
stress --io 4 --timeout 60s
stress 的 I/O 测试相对比较简单,它通过不断地执行 sync() 系统调用来给I/O系统施加负载。sync 会刷新所有缓冲区的数据到磁盘,这可能会不足以对磁盘性能进行全面的评估,尤其是涉及到随机读写或者有大量并行I/O请求的情况。
对于更为高级的I/O性能分析,可以考虑使用如 fio 或 iometer 这样的工具。fio 可以模拟多种不同类型的I/O工作负载,包括顺序读写和随机读写,并且可以详细设定每次I/O操作的大小、I/O深度、队列长度等,这样可以更真实地模拟应用程序对磁盘的使用模式。
工具: dd和fio
dd 是一个用来复制和转换数据的命令行工具,它也经常被用来测量磁盘写速度。
dd if=/dev/zero of=/tmp/output bs=8k count=10k; rm -f /tmp/output
fio 是一个功能更强大的I/O测试工具,它能让你指定各种测试参数。
fio --name=randwrite --ioengine=libaio --iodepth=1 --rw=randwrite --bs=4k --direct=1 --size=4G --numjobs=4 --runtime=60
可以调整 --name(测试名称)、--iodepth(I/O深度)、--rw(读写模式)、--bs(块大小)、--direct(是否绕过缓存)、--size(测试文件的大小)、--numjobs(并行作业的数量)和--runtime(运行时长)等参数来定义你的测试场景。
fio --name=randwrite --ioengine=libaio --iodepth=1 --rw=randwrite --bs=4k --direct=1 --size=4G --numjobs=4 --runtime=60randwrite: (g=0): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=1...fio-3.16Starting 4 processesrandwrite: Laying out IO file (1 file / 4096MiB)randwrite: Laying out IO file (1 file / 4096MiB)randwrite: Laying out IO file (1 file / 4096MiB)randwrite: Laying out IO file (1 file / 4096MiB)Jobs: 4 (f=4): [w(4)][100.0%][w=736MiB/s][w=188k IOPS][eta 00m:00s]randwrite: (groupid=0, jobs=1): err= 0: pid=3349743: Sat Jul 6 12:12:18 2024 write: IOPS=45.3k, BW=177MiB/s (186MB/s)(4096MiB/23137msec); 0 zone resets slat (usec): min=3, max=5665, avg= 5.82, stdev= 6.74 clat (nsec): min=437, max=62480k, avg=15451.75, stdev=63204.67 lat (usec): min=15, max=62485, avg=21.38, stdev=64.41 clat percentiles (nsec): | 1.00th=[12864], 5.00th=[13376], 10.00th=[13760], 20.00th=[14272], | 30.00th=[14528], 40.00th=[14784], 50.00th=[15040], 60.00th=[15296], | 70.00th=[15552], 80.00th=[16064], 90.00th=[17024], 95.00th=[18560], | 99.00th=[20864], 99.50th=[22144], 99.90th=[33024], 99.95th=[36608], | 99.99th=[67072] bw ( KiB/s): min=151216, max=191752, per=25.12%, avg=181161.83, stdev=5686.93, samples=46 iops : min=37804, max=47938, avg=45290.43, stdev=1421.72, samples=46 lat (nsec) : 500=0.01%, 750=0.01% lat (usec) : 10=0.01%, 20=97.74%, 50=2.24%, 100=0.01%, 250=0.01% lat (usec) : 500=0.01%, 750=0.01% lat (msec) : 2=0.01%, 4=0.01%, 10=0.01%, 100=0.01% cpu : usr=7.21%, sys=27.89%, ctx=1048604, majf=0, minf=11 IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0% submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% issued rwts: total=0,1048576,0,0 short=0,0,0,0 dropped=0,0,0,0 latency : target=0, window=0, percentile=100.00%, depth=1randwrite: (groupid=0, jobs=1): err= 0: pid=3349744: Sat Jul 6 12:12:18 2024 write: IOPS=45.1k, BW=176MiB/s (185MB/s)(4096MiB/23239msec); 0 zone resets slat (usec): min=3, max=4776, avg= 5.83, stdev= 5.67 clat (nsec): min=429, max=62492k, avg=15536.79, stdev=63268.89 lat (usec): min=15, max=62497, avg=21.46, stdev=64.41 clat percentiles (nsec): | 1.00th=[12864], 5.00th=[13504], 10.00th=[13888], 20.00th=[14272], | 30.00th=[14528], 40.00th=[14784], 50.00th=[15040], 60.00th=[15296], | 70.00th=[15552], 80.00th=[16064], 90.00th=[17280], 95.00th=[19072], | 99.00th=[21376], 99.50th=[22912], 99.90th=[33024], 99.95th=[37120], | 99.99th=[78336] bw ( KiB/s): min=145472, max=191792, per=25.00%, avg=180284.57, stdev=7980.31, samples=46 iops : min=36368, max=47948, avg=45071.13, stdev=1995.08, samples=46 lat (nsec) : 500=0.01%, 750=0.01% lat (usec) : 2=0.01%, 10=0.01%, 20=96.94%, 50=3.03%, 100=0.02% lat (usec) : 250=0.01%, 500=0.01%, 750=0.01%, 1000=0.01% lat (msec) : 2=0.01%, 4=0.01%, 10=0.01%, 100=0.01% cpu : usr=7.91%, sys=27.03%, ctx=1048636, majf=0, minf=12 IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0% submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% issued rwts: total=0,1048576,0,0 short=0,0,0,0 dropped=0,0,0,0 latency : target=0, window=0, percentile=100.00%, depth=1randwrite: (groupid=0, jobs=1): err= 0: pid=3349745: Sat Jul 6 12:12:18 2024 write: IOPS=45.3k, BW=177MiB/s (185MB/s)(4096MiB/23170msec); 0 zone resets slat (usec): min=3, max=2490, avg= 5.95, stdev= 4.06 clat (nsec): min=402, max=62471k, avg=15340.79, stdev=63627.74 lat (usec): min=15, max=62476, avg=21.39, stdev=64.12 clat percentiles (nsec): | 1.00th=[12736], 5.00th=[13248], 10.00th=[13632], 20.00th=[14144], | 30.00th=[14400], 40.00th=[14656], 50.00th=[14912], 60.00th=[15168], | 70.00th=[15552], 80.00th=[15936], 90.00th=[16768], 95.00th=[18304], | 99.00th=[20608], 99.50th=[21888], 99.90th=[33024], 99.95th=[37120], | 99.99th=[63232] bw ( KiB/s): min=151192, max=191728, per=25.08%, avg=180884.91, stdev=5619.73, samples=46 iops : min=37798, max=47932, avg=45221.22, stdev=1404.93, samples=46 lat (nsec) : 500=0.01%, 750=0.01% lat (usec) : 10=0.01%, 20=98.29%, 50=1.69%, 100=0.01%, 250=0.01% lat (usec) : 500=0.01%, 1000=0.01% lat (msec) : 2=0.01%, 4=0.01%, 10=0.01%, 100=0.01% cpu : usr=8.33%, sys=27.32%, ctx=1048761, majf=0, minf=13 IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0% submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% issued rwts: total=0,1048576,0,0 short=0,0,0,0 dropped=0,0,0,0 latency : target=0, window=0, percentile=100.00%, depth=1randwrite: (groupid=0, jobs=1): err= 0: pid=3349746: Sat Jul 6 12:12:18 2024 write: IOPS=45.1k, BW=176MiB/s (185MB/s)(4096MiB/23262msec); 0 zone resets slat (usec): min=3, max=3415, avg= 5.85, stdev= 5.99 clat (nsec): min=440, max=62482k, avg=15524.90, stdev=63386.91 lat (usec): min=15, max=62487, avg=21.47, stdev=64.41 clat percentiles (nsec): | 1.00th=[12864], 5.00th=[13376], 10.00th=[13888], 20.00th=[14272], | 30.00th=[14528], 40.00th=[14784], 50.00th=[15040], 60.00th=[15296], | 70.00th=[15552], 80.00th=[16064], 90.00th=[17280], 95.00th=[19072], | 99.00th=[21376], 99.50th=[22912], 99.90th=[33024], 99.95th=[37120], | 99.99th=[64256] bw ( KiB/s): min=145536, max=191768, per=24.97%, avg=180079.00, stdev=7867.79, samples=46 iops : min=36384, max=47942, avg=45019.74, stdev=1966.94, samples=46 lat (nsec) : 500=0.01%, 750=0.01% lat (usec) : 10=0.01%, 20=97.00%, 50=2.98%, 100=0.01%, 250=0.01% lat (usec) : 500=0.01%, 750=0.01%, 1000=0.01% lat (msec) : 2=0.01%, 4=0.01%, 10=0.01%, 100=0.01% cpu : usr=7.08%, sys=27.87%, ctx=1048742, majf=0, minf=10 IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0% submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% issued rwts: total=0,1048576,0,0 short=0,0,0,0 dropped=0,0,0,0 latency : target=0, window=0, percentile=100.00%, depth=1
Run status group 0 (all jobs): WRITE: bw=704MiB/s (739MB/s), 176MiB/s-177MiB/s (185MB/s-186MB/s), io=16.0GiB (17.2GB), run=23137-23262msec
Disk stats (read/write): nvme0n1: ios=315/4182462, merge=0/40802, ticks=53/53638, in_queue=53692, util=99.60%
其他第三方测试工具Prime95:Prime95是一种针对CPU稳定性的工具,它会执行大量的计算密集型计算,以便在CPU上加压。
UnixBench:UnixBench是一种性能测量工具,它可以测试CPU、内存、磁盘I/O、数据库I/O以及其他一些系统参数。
总结在企业和个人项目中,持续和系统性的压力测试是维护系统稳定性、可靠性和性能的关键。通过以上介绍的命令行工具,你可以定制并实施全面的压力测试方案,随时准备接受最严苛的生产环境挑战。记住,始终在安全环境中进行测试,避免在实际生产系统上直接执行强度测试。通过这种方法,不仅能够确保负载的管理,在系统极限状态下,也能确保数据的安全和完整。
使用这些工具进行系统性能测试时,应该谨慎并确保对系统可能响应的趋势和瓶颈有充分的理解。这些测试工具应该作为系统监控和优化决策的补充,而不是唯一的依据。在评估测试结果和实施系统更改时,还应该考虑线上环境的复杂性和可变性。