Linux
Linux software install
Google repo的使用
Vector AP StartApplication编译脚本解析
Yocto的cmake版本升级
不能自动安装的解决方式
S32G-BSP35.0-SDK使用方法
S32G从SDK生成文件系统的制作过程
Linux Samba设置
Linux添加双网卡
S32G USB-Redirector安装指南
VS code自动生成Doxygen格式注释
Linux下使用多线程下载
使用pandoc 生成带中文的pdf
minicom无法输入的问题解决办法
使用 systemd unit 添加一条路由规则
CMake 教程
步骤 1:基本起点
步骤 2:添加lib库
步骤 3:为库添加使用要求
步骤 4:添加生成器表达式
步骤 5:安装和测试
步骤 6:添加支持测试仪表板
步骤 7: 添加系统内省
步骤 8:自定义命令和生成的文
步骤 9:打包安装程序
步骤 10:选择静态库或共享库
步骤 11:添加导出配置
步骤 12:打包 Debug 和 Release
添加虚拟网卡
Vector AP 去掉防篡改校验
Vector AP startapplication编译与使用
Vector AP问题汇总
Vector AP大型项目开发流程
Vector AP EM
Vector AP 最简单的开发示例
Linux kernel 版本降级
Vector AP StartApplicaiton
startappplication-machine-design
startapplicaiton-machine-integration
amsr-vector-fs-em-executionmanager-design
amsr-vector-fs-em-executionmanager
Vector AP 复杂模型的开发
第一章 Machine和MachineDesign
第二章 Execute Manager
第三章 Log
第四章 State Manager
第五章 State Manager 源码的理解
第六章 Someip daemon
第七章 IPC Service Discovery Daemon
crond的使用方法
解决蓝牙鼠标在 Ubuntu 中单位时间内断开的问题
VPS服务器自建教程
v2rayA的客户端使用配置
GDB调试指南入门篇:揭开程序运行世界的神秘面纱
GDB调试指南高级篇:成为调试专家,掌控程序的命运
Linux安装PyQt5并配置Qt Designer
ADB 命令大全
GoogleTest(一)
GoogleTest(二)简单的TEST宏
GoogleTest(三)简单类函数测试
C++ Template
1. 函数模板
2. 类模板
3. 非类型模板参数
软件版本号规范
EPOLL
C++手札
C++ 使用{}初始化有哪些好处?
现代 C++ decltype 深入解析
函数对象(functor)
Linux性能剖析:CPU、内存、网络与I/O压力测试
AP StateManager
C++ Lambda表达式
C++ 中的Lambda表达式
Lambda 表达式语法
Lambda 表达式的示例
手动发送UDP数据包
pyqt5生成的UI界面不能输入中文
自己搭建repo镜像
摄影
Sony仿富士PP值设置
诗词歌赋
本文档使用 MrDoc 发布
-
+
首页
Linux性能剖析:CPU、内存、网络与I/O压力测试
# Linux性能剖析:CPU、内存、网络与I/O压力测试 ## **简介** 在Linux环境下,确保系统各项资源充分且稳定地运行对任何系统管理员来说都至关重要。特别是在生产环境中,理解如何对系统资源进行基准测试和压力测试可以帮助预防未来的问题,同时也能够优化现有系统的性能。 在本文中,我们将探讨如何使用命令行工具来对Linux系统的CPU、内存、网络和I/O资源进行压力测试,抛砖引玉,希望大家线下详细学习并加以练习。 ## **CPU压力测试** 在Linux系统中,对CPU进行压力测试有助于评估处理器在高负载条件下的性能和稳定性。以下是几种常见的方法来对CPU进行压力测试: ### **stress** stress 是一个简化的压力测试工具,旨在对系统执行决定性的负载测试。该工具可以生成多种资源的工作负载,包括CPU、内存和I/O。  ubuntu 下安装方法: ```shell sudo apt-get install stress ``` #### **stree对CPU压力测试** 命令格式: ```shell stress --cpu <num_of_cpus> --timeout <duration> ``` + num\_of\_cpus 是你想要产生负载的CPU核心数。 + duration 是测试的持续时间。如果你希望持续直到手动停止,则可省略此参数。 示例: ```auto stress --cpu 2 # 指定压力测试的持续时间 stress --cpu 2 --timeout 60s ``` 这条命令会创建 2 个工作进程,每个进程尽量让CPU忙碌。  ### **stress-ng** stress-ng 是一个功能更强大的工具,提供了更多压力测试功能和更精细的资源控制。它包含了数以百计的测试项目,能针对不同的系统组件施加压力,包括CPU、内存、I/O以及系统调用等。此外,stress-ng 还能收集和报告系统在压力测试期间的一些统计数据。  ubuntu 下安装方法: ```shell sudo apt-get install stress-ng ``` #### **stress-ng对CPU压力测试** 命令格式: ```shell 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: ```shell sudo apt-get update sudo apt-get install sysbench ```  #### **sysbench CPU基准测试** sysbench 可以进行CPU性能测试,通过执行大量的浮点运算来进行评估。例如: ```shell sysbench cpu --cpu-max-prime=20000 run ``` 这条命令将执行一个基于制定数量素数搜索的CPU基准测试(在这个例子中是20000)。  > **注 意 事 项** > 在运行CPU压力测试时,请监视系统的温度和性能,确保CPU不会过热,同时注意测试可能影响到系统稳定性和数据安全。最好在一台不用于生产的机器上执行这些测试。使用如sensors(从 lm-sensors 包中提供)等工具可以帮助监控CPU温度和其他系统硬件指标。 ## **内存压力测试** 在Linux系统中,对内存进行压力测试通常是为了检验`物理内存条`的稳定性和问题排查,尤其是对新装的内存或系统在高负载下出现问题时进行测试。以下是与内存压力测试相关的几种方法: ### **stress生成内存负载** 命令格式: ```shell stress --vm --vm-bytes M --timeout ``` 这里: \- number\_of\_workers 是并发生成内存负载的进程数。 \- memory\_amount 是每个进程尝试分配的内存量,单位是MB(可以用G表示GB)。 \- duration 指定了测试运行的时间,例如60s或5m。 例如,下面的命令会启动4个进程,每个进程分配1GB内存,运行10分钟: ```shell stress --vm 4 --vm-bytes 1G --timeout 10m ``` ### **stress-ng比stress更全面** 进行内存压力测试: ```shell stress-ng --vm --vm-bytes M --vm-keep --timeout ``` 与 stress 命令类似,--vm-keep选项告诉 stress-ng 保持内存分配直至测试结束。例如: ```shell 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 是另一个用户空间的内存测试程序,它能够测试和验证物理内存的完整性。 ```shell sudo apt-get install memtester ``` 可以这样使用memtester: ```shell sudo memtester M ``` memory\_amount 是测试的内存量, number\_of\_passes 是测试运行的遍数。例如: ```shell sudo memtester 1024M 5 ``` 可以这样使用memtester:  ### **sysbench内存基准测试** ```shell sysbench memory --memory-block-size=1M --memory-total-size=100G run ``` 该命令测试内存性能,通过逐块处理总共100GB的数据,每块大小为1MB。  ## **网络压力测试** 想要对Linux系统上的网络性能进行测试,通常会使用其他专门的工具,如 iperf、netperf ### **iperf网络性能测试** iperf 是一个常用的网络性能测试工具,它可以测试通过`TCP`和`UDP`协议的网络带宽质量,可以测试网络带宽和传输速率。 首先在两台机器上安装 iperf(一台作为服务器,另一台作为客户端): ```shell # Debian/Ubuntu sudo apt-get install iperf ``` 然后,启动其中一台机器的iperf服务: ```shell iperf -s # iperf服务器 iperf3 -s # or iperf3服务器 ``` 在要测试的客户端上,运行iperf连接到服务器: ```shell iperf -c # 客户端连接到iperf服务器 iperf3 -c # or iperf3客户端 ``` 这样将执行一个基本的网络带宽测试。iperf 支持许多参数来调整测试类型、持续时间、并行连接数等。  ### **netperf网络性能测试** netperf 是另一个功能强大的网络测量工具,它也可测试网络带宽、延迟和其他重要指标。 在服务器和客户端上安装 netperf: ```shell sudo apt-get install netperf # Debian/Ubuntu ``` 在服务器端启动 netperf: ```shell netserver ``` 在客户端进行测试: ```shell netperf -H ``` 以上命令将默认执行一个TCP带宽测试。 这些工具都比 stress 更适合于网络性能测试,因为它们特别设计来测量网络带宽、连接质量、延迟等关键网络性能指标。在执行网络性能测试时,请将服务器和客户端放置在你希望测试的目标网络环境中,而不是在本地环境或者受限带宽的环境中。这将提供更准确的网络性能数据。 ## **IO压力测试** ### **stress测试IO** 要使用 stress 进行I/O性能测试,你可以用 -i 选项来指定启动多少个进程来执行同步I/O操作。这能帮助你创建一个针对存储子系统运行的负载。 ```shell stress --io 4 ``` 或者,如果你想进一步指定测试持续多长时间,可以添加 -t 或 --timeout 参数: ```shell 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 是一个用来复制和转换数据的命令行工具,它也经常被用来测量磁盘写速度。 ```shell dd if=/dev/zero of=/tmp/output bs=8k count=10k; rm -f /tmp/output ```  fio 是一个功能更强大的I/O测试工具,它能让你指定各种测试参数。  ```shell 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(运行时长)等参数来定义你的测试场景。 ```shell fio --name=randwrite --ioengine=libaio --iodepth=1 --rw=randwrite --bs=4k --direct=1 --size=4G --numjobs=4 --runtime=60 randwrite: (g=0): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=1 ... fio-3.16 Starting 4 processes randwrite: 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=1 randwrite: (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=1 randwrite: (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=1 randwrite: (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以及其他一些系统参数。 ## **总结** 在企业和个人项目中,持续和系统性的压力测试是维护系统稳定性、可靠性和性能的关键。通过以上介绍的命令行工具,你可以定制并实施全面的压力测试方案,随时准备接受最严苛的生产环境挑战。记住,始终在安全环境中进行测试,避免在实际生产系统上直接执行强度测试。通过这种方法,不仅能够确保负载的管理,在系统极限状态下,也能确保数据的安全和完整。 使用这些工具进行系统性能测试时,应该谨慎并确保对系统可能响应的趋势和瓶颈有充分的理解。这些测试工具应该作为系统监控和优化决策的补充,而不是唯一的依据。在评估测试结果和实施系统更改时,还应该考虑线上环境的复杂性和可变性。
admin
2024年8月22日 09:20
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码