Linux性能剖析:CPU/内存/网络/I/O压力测试指南
Linux 操作系统凭借其稳定性、安全性和开源特性,在服务器领域占据着举足轻重的地位。从大型数据中心到小型企业服务器,Linux 无处不在,支撑着无数关键业务的运行。随着业务的不断发展和用户需求的日益增长,对 Linux 系统性能的要求也越来越高。一个性能卓越的 Linux 系统,不仅能够高效地处理大量任务,还能为用户提供稳定、快速的服务体验,降低运营成本,提升企业竞争力。
而性能剖析作为优化 Linux 系统的关键手段,就像是给系统做一次全面的 “体检”。通过对 CPU、内存、网络与 I/O 等关键性能指标进行压力测试,我们能够深入了解系统在不同负载下的运行状况,精准定位性能瓶颈,为后续的优化工作提供有力依据。无论是新搭建的系统需要进行性能评估,还是现有系统出现性能问题需要排查,压力测试都能发挥重要作用。接下来,就让我们一起深入探索 Linux 性能剖析的世界,学习如何进行 CPU、内存、网络与 I/O 压力测试 。
Part1.CPU 压力测试:挖掘处理器潜力
1.1 stress 命令
在 Linux 系统中,stress命令是进行 CPU 压力测试的常用利器。它就像是一个 “压力制造机”,能够模拟出各种高负载场景,让我们清晰地看到 CPU 在重压之下的表现。
首先,我们需要安装stress工具。在基于 Debian 或 Ubuntu 的系统上,安装过程非常简单,只需在终端中输入以下命令 :
对于 CentOS 系统,由于默认的软件源中可能没有stress,我们需要先安装 EPEL 源(Extra Packages for Enterprise Linux),然后再安装stress:
安装完成后,就可以使用stress进行 CPU 压力测试了。通过指定-c参数,我们可以创建多个 CPU 工作线程。例如,如果你的服务器是 4 核 CPU,想要充分利用所有核心进行压力测试,可以使用以下命令 :
这条命令会创建 4 个工作线程,每个线程都会疯狂地进行随机数的平方根计算,让 CPU 全力运转起来。在测试过程中,我们可以结合其他命令来观察 CPU 的负载和使用率变化 。比如,使用top命令,它就像是系统状态的 “实时监控屏”,能够动态地展示系统中各个进程的资源占用情况。在终端中输入top后,按下数字1,可以看到每个 CPU 核心的使用率。当运行stress -c 4命令后,观察top的输出,会发现%CPU列的数值迅速上升,接近 100%,这表明 CPU 已经被充分利用,处于高负荷运行状态。
uptime命令则能让我们快速了解系统的平均负载情况。它会显示系统已经运行的时间、当前登录的用户数以及过去 1 分钟、5 分钟和 15 分钟的平均负载。平均负载是指在特定时间间隔内,系统处于可运行状态(正在使用 CPU 或等待使用 CPU)的进程数的平均值。一般来说,如果平均负载持续高于 CPU 核心数,就说明系统可能面临着较大的压力 。当进行 CPU 压力测试时,运行uptime命令,可以看到平均负载逐渐升高,直观地反映出系统负载的变化。
mpstat命令能够提供每个 CPU 核心的详细使用情况报告。使用mpstat -P ALL命令,可以实时查看所有 CPU 核心的使用率、空闲率、中断率等信息。在 CPU 压力测试过程中,通过观察mpstat的输出,我们可以判断是否存在某个核心过载的情况。如果某个核心的使用率一直居高不下,而其他核心相对空闲,就可能需要进一步分析原因,是否是程序的并行化处理存在问题,或者是硬件配置不均衡等。
如果在测试过程中发现 CPU 使用率异常高,想要定位是哪个进程导致的,可以使用pidstat命令。它可以按进程显示 CPU 的使用情况,包括用户态和内核态的 CPU 时间、I/O 等待时间等。使用pidstat -u 1命令,会每秒输出一次各个进程的 CPU 使用情况,通过观察%CPU列,就能轻松找到占用 CPU 资源最多的进程,进而对其进行进一步的分析和处理。
1.2其他测试方式
除了stress命令,还有一些简单的测试方法也能对 CPU 性能进行评估,比如通过计算圆周率来测试 CPU 的计算能力和稳定性。在 Linux 中,可以使用bc命令结合数学库来实现。bc是一个基本的计算器,支持高精度数学运算,通过它可以执行复杂的数学表达式。计算圆周率的命令如下:
这条命令中,scale=5000表示设置计算结果的精度为小数点后 5000 位,4*a(1)则是利用反正切函数计算圆周率的公式(因为a(1)表示反正切函数arctan(1),而π = 4 * arctan(1)),bc -l -q中的-l选项表示加载数学库,-q选项表示安静模式,不输出欢迎信息。执行这个命令后,CPU 会全力进行圆周率的计算,我们可以通过观察计算所需的时间以及系统的响应情况来大致评估 CPU 的性能。
与stress命令相比,计算圆周率这种测试方式更加侧重于考验 CPU 的浮点运算能力,而stress命令则更全面地模拟了多线程并发的工作负载场景。在实际应用中,计算圆周率的测试方法适用于对 CPU 浮点运算性能有特定需求的场景,比如科学计算、数据分析等领域,通过这种测试可以了解 CPU 在处理复杂数学运算时的能力和稳定性。
而stress命令则更广泛地应用于一般性的系统性能评估和压力测试,能够帮助我们全面了解系统在多任务高负载情况下的整体表现,包括 CPU、内存、I/O 等资源的协同工作情况 。例如,在服务器上线前,使用stress命令进行全面的压力测试,可以提前发现系统可能存在的性能瓶颈,为优化系统配置提供依据;而在开发科学计算软件时,通过计算圆周率的测试,可以针对性地选择适合的 CPU,确保软件在运行时能够高效地完成复杂的数学计算任务。
Part2.内存压力测试:探寻内存极限
2.1 StressAppTest 工具
在进行内存压力测试时,StressAppTest是一款非常实用的工具。它就像一个严格的 “内存质检员”,能够通过模拟高负载场景,对系统内存进行全方位的考验,帮助我们检测内存的稳定性与性能 。
StressAppTest的特点十分显著。它是一个免费且开源的命令行内存测试工具,已经被 Google 等知名企业使用过一段时间,采用的是 Apache 2.0 协议。其核心优势在于能够将处理器和 I/O 到内存的数据塞满,从而创建一个真实的高负载场景去测试电脑内存,让我们在接近实际使用的环境下评估内存性能 。
不同 Linux 发行版上的安装方式略有不同。在 Debian、Ubuntu、Linux Mint 系统中,安装命令简洁明了 :
对于 Fedora、RHEL、Rocky Linux 系统,则使用以下命令安装 :
在 Gentoo Linux 系统上,安装命令为 :
openSUSE Linux 系统的安装命令是 :
而 Arch、Manjaro Linux 系统可以去 AUR 仓库里面获取下载。
安装完成后,就可以使用StressAppTest进行内存压力测试了。它有许多常用参数,这些参数就像是调节测试强度的 “旋钮”,让我们可以根据不同的测试需求进行灵活配置。
-M参数用于指定测试内存的大小,单位为MB。比如,想要测试系统在占用1GB内存时的表现,可以使用-M 1024。这就好比给内存安排了一个 “工作任务”,让它在特定的内存使用量下运行,以此来观察内存的工作状态 。-s参数用于设置测试的运行时间,单位为秒。如果我们希望测试持续 300 秒,可以使用-s 300。通过控制运行时间,我们能够了解内存的长期稳定性,就像观察一个运动员在不同时长比赛中的耐力表现一样 。-m参数用来指定运行所需的线程数量。例如,设置-m 4,表示会创建 4 个线程来同时对内存进行操作,模拟多线程环境下内存的工作情况,考察内存能否在多任务并发时稳定运行 。-W参数的作用是增加 CPU 压力去测压。当我们不仅想测试内存,还想看看在 CPU 也处于高负载的情况下内存的性能时,就可以加上这个参数。这就像是给内存和 CPU 同时布置了艰巨的任务,考验它们在双重压力下的协同工作能力 。假设我们要进行一次自定义参数的内存压力测试,想让系统分配 2GB 内存,使用 8 个线程,运行 1 小时,同时增加 CPU 压力。可以使用以下命令 :
在测试过程中,我们可以使用top命令来监控 CPU 使用率,按下数字1,可以显示每个 CPU 核心的使用率,观察 CPU 在内存压力测试下的负载变化 。使用free -s 5命令,每 5 秒更新一次系统的内存使用情况,实时掌握内存的使用状态,包括已用内存、空闲内存、缓存等信息,从而全面评估内存的性能 。
2.2 Valgrind 工具
Valgrind是一款功能强大的工具,它在内存调试、内存泄漏检测以及性能分析等方面都有着出色的表现,就像是一个专业的 “内存医生”,能够精准地诊断出内存中存在的各种问题 。
Valgrind的功能基于其独特的原理。它通过建立两个全局表来实现对内存的检测。一个是Valid-Value表,对于进程的整个地址空间中的每一个字节,都有与之对应的 8 个 bits;对于 CPU 的每个寄存器,也有一个与之对应的 bit 向量,这些 bits 负责记录该字节或者寄存器值是否具有有效的、已初始化的值 。
另一个是Valid-Address表,对于进程整个地址空间中的每一个字节,还有与之对应的 1 个 bit,负责记录该地址是否能够被读写 。当程序读写内存时,Valgrind会检查这两个表,以此来判断内存操作是否合法,是否存在未初始化值的使用、内存越界、内存泄漏等问题 。
Valgrind包含了多个实用工具 :
memcheck是其中最常用的工具,主要用于检测内存问题,如使用未初始化的内存、读 / 写已经被释放的内存、读 / 写内存越界、内存泄露、使用malloc/new/new[]和free/delete/delete[]不匹配等。它就像是一个 “内存警察”,严格监督着内存的使用情况,一旦发现违规操作,就会及时发出警报 。callgrind主要用于分析函数调用关系,收集程序运行时的函数调用信息,包括函数的调用次数、执行时间等。通过这些信息,我们可以了解程序的执行流程,找出函数调用中可能存在的性能瓶颈,就像绘制一幅程序执行的 “路线图”,帮助我们优化程序性能 。cachegrind是一个缓存分析工具,它能够模拟执行 CPU 中的 L1、D1 和 L2 cache,精准地指出程序中的 cache 未命中情况。可以打印 cache 未命中的次数、内存引用和发生 cache 未命中的每一行代码、每一个函数、每一个模块,甚至可以打印每一行机器码的未命中次数。这对于优化程序的缓存使用,提高程序运行速度非常有帮助,就像给程序的缓存系统做了一次详细的 “体检” 。helgrind用于检测多线程竞争,寻找内存中被多个线程访问,而又没有一贯加锁的区域。这些区域往往是线程之间失去同步的地方,容易导致难以发现的错误。helgrind就像是一个 “线程协调员”,帮助我们找出多线程程序中的潜在问题,确保线程之间的协同工作正常 。massif是一个堆栈分析器,能测量程序在堆栈中使用了多少内存。它可以帮助我们了解程序的内存使用模式,判断是否存在堆栈溢出等问题,为优化程序的内存布局提供依据,就像一个 “内存用量秤”,精确测量程序在堆栈方面的内存开销 。下面通过一个简单的代码示例来展示memcheck检测内存泄漏和越界等问题的过程 :
首先,使用g++ -g -O0 demo.cpp -o demo命令进行编译,其中-g选项用于生成调试信息,-O0表示不进行优化,这样可以确保Valgrind能够准确地定位问题 。然后,运行valgrind --tool=memcheck --leak-check=full ./demo命令来进行内存检测 。--tool=memcheck指定使用memcheck工具,--leak-check=full表示全面检查内存泄漏情况 。
运行结果会详细地输出内存问题的相关信息,例如 :
从结果中可以清晰地看到,Valgrind指出了uninit函数中使用未初始化变量x的问题,main函数中数组越界访问的问题,以及leak函数中内存泄漏的问题,并给出了具体的代码行数和内存地址等详细信息,帮助我们快速定位和解决问题 。
Part3网络压力测试:评估网络性能
3.1 Apache Bench(ab)工具
在网络性能测试的领域中,Apache Bench(简称 ab)工具就像是一把精准的 “性能手术刀”,能够帮助我们深入剖析 Web 服务器在不同负载下的性能表现 。它的主要作用是模拟多个并发用户对 Web 服务器发起请求,通过收集和分析服务器的响应时间、吞吐量等关键性能指标,让我们清晰地了解服务器的性能状况,判断其是否能够满足实际业务的需求 。
安装 ab 工具的过程在不同的 Linux 发行版上略有不同。在基于 Debian 或 Ubuntu 的系统中,安装操作非常便捷,只需在终端中输入以下命令 :
这个命令会自动从软件源中下载并安装apache2 - utils软件包,ab 工具就包含在其中 。
对于 CentOS 系统,安装命令如下 :
通过这条命令,系统会从相应的软件源获取httpd - tools包并完成安装,从而使我们能够使用 ab 工具 。
ab 工具的基本语法如下 :
其中,[options]是一系列可选参数,用于对测试进行详细的配置;[http[s]://]hostname[:port]/path则指定了目标 URL,包括协议(HTTP 或 HTTPS)、服务器主机名或 IP 地址、端口号(默认为 80)以及请求的路径 。
常用参数的含义和作用丰富多样 :
-n requests:用于指定本次测试发起的总请求数。例如,-n 1000表示总共会发送 1000 个请求到目标服务器,这个参数决定了测试的工作量大小 。-c concurrency:指定一次产生的请求数,也就是并发数。比如,-c 50表示同时会有 50 个请求并发访问服务器,它模拟了多用户同时访问的场景,帮助我们了解服务器在高并发情况下的处理能力 。-t timelimit:设置测试所进行的最大秒数。例如,-t 60表示测试会在 60 秒内完成,无论是否达到指定的总请求数,这对于限制测试时间非常有用,特别是在对服务器性能有时间要求的场景下 。-r:这个参数的作用是在遇到套接字接收错误时,不退出测试任务,而是继续执行,确保测试的完整性 。-p postfile:如果需要进行 POST 请求,-p参数用于指定包含 POST 数据的文件。例如,-p data.txt表示使用data.txt文件中的数据作为 POST 请求的内容 。-T content - type:用于指定 POST 数据所使用的 Content - type 头信息。比如,-T "application/json"表示 POST 的数据类型是 JSON 格式,它确保服务器能够正确解析接收到的数据 。下面通过一个实际测试案例来深入了解 ab 命令的使用方法和结果分析 。假设我们要对一个本地运行的 Web 服务器进行压力测试,目标 URL 为http://localhost:8080/index.html,希望模拟 100 个并发用户,总共发送 1000 个请求,可以使用以下命令 :
执行这条命令后,ab 工具会迅速开始工作,向目标服务器发送大量请求,并收集相关数据 。测试完成后,会输出一系列详细的性能统计信息 :
对这些输出信息进行详细分析,可以获取到许多关键的性能指标 :
Requests per second:每秒处理的请求数,也称为吞吐量。在这个例子中,平均值为 191.00 [#/sec],它反映了服务器在单位时间内能够处理的请求数量,数值越高,说明服务器的处理能力越强 。Time per request:从客户端角度看,每个请求的平均响应时间。这里的平均值为 523.560 [ms],它表示每个并发请求从发送到接收到响应所花费的平均时间,这个时间越短,用户体验就越好 。Time per request (mean, across all concurrent requests):从服务器角度看,每个请求的平均响应时间。平均值为 5.236 [ms],它体现了服务器处理每个请求的平均耗时,是评估服务器性能的重要指标之一 。Transfer rate:数据传输速率,表示每秒从服务器接收的数据量。在本案例中为 291.93 [Kbytes/sec],这个指标可以帮助我们判断网络带宽是否足够,以及数据传输过程中是否存在瓶颈 。Connection Times:包含了建立连接的时间(Connect)、服务器处理请求的时间(Processing)、客户端等待服务器响应的时间(Waiting)以及从建立连接到接收完数据的总时间(Total)的统计信息,通过这些信息,我们可以进一步分析服务器和网络的性能瓶颈所在 。例如,如果建立连接的时间过长,可能是网络连接存在问题;如果处理请求的时间过长,可能是服务器的处理能力不足或者应用程序存在性能问题 。通过对这些性能指标的分析,我们可以全面了解 Web 服务器在高并发负载下的性能表现,从而有针对性地进行优化和改进 。
3.2其他网络测试工具
除了 ab 工具,Linux 系统下还有许多其他优秀的网络测试工具,它们各自具有独特的特点和优势,能够满足不同场景下的网络性能测试需求 。
JMeter 是一款开源的负载测试工具,基于 Java 开发,功能十分强大。它最大的特点就是支持多种协议,除了常见的 HTTP/HTTPS 协议外,还支持 FTP、JDBC、SOAP、TCP 等多种协议,这使得它可以用于测试各种类型的应用程序,包括 Web 应用、数据库应用、消息中间件等 。JMeter 提供了丰富的图形化界面操作,通过简单的拖拽和配置,就可以轻松创建复杂的测试场景。
它还能生成详细的测试报告,包含实时监控数据和性能图表,如响应时间分布、吞吐量变化曲线等,让我们能够直观地了解系统在不同负载下的性能变化趋势,为性能分析和优化提供有力支持 。例如,在测试一个电商网站的 API 接口时,可以使用 JMeter 模拟大量用户并发访问,通过设置不同的参数和断言,验证接口的正确性和性能表现,同时利用其生成的报告,快速定位性能瓶颈所在 。
wrk 是一个轻量级的高性能 HTTP 基准测试工具,它采用多线程和事件驱动的异步 I/O 模型,能够在短时间内产生大量的并发请求,从而高效地测试服务器的性能 。wrk 的命令行使用简洁明了,同时还支持 Lua 脚本扩展,通过编写 Lua 脚本,可以灵活地定制测试场景,实现对请求头、请求体、响应处理等方面的自定义操作 。比如,在测试一个需要进行用户认证的 API 时,可以通过 Lua 脚本在请求中添加认证信息,模拟真实用户的访问行为 。与 ab 工具相比,wrk 在高并发场景下的性能表现更为出色,能够更准确地评估服务器在极端负载下的性能极限 。
siege 是一个专门用于 Web 应用压力测试和评测的工具,它可以根据配置对一个 Web 站点进行多用户的并发访问,模拟真实用户的操作行为 。siege 不仅能够记录每个用户所有请求过程的响应时间,还能在一定数量的并发访问下重复进行测试,以检验系统的稳定性和可靠性 。它支持多种协议,并且可以对测试结果进行详细的统计分析,生成包括平均响应时间、事务处理速率、失败请求数等在内的多种统计数据 。例如,在对一个新闻网站进行压力测试时,siege 可以模拟大量用户同时浏览新闻、发表评论等操作,通过分析测试结果,评估网站在高并发情况下的性能和用户体验 。
httperf 是一款高性能的 HTTP 性能测试工具,它提供了灵活的方式来生成各种 HTTP 负载,以测试服务器的性能 。httperf 支持 HTTP/1.1 协议和 SSL,能够模拟不同的连接数、请求速率等参数,对服务器进行全面的性能评估 。它的输出结果详细,包含了各种性能指标的统计信息,如每秒请求数、平均响应时间、连接建立时间等 。在测试一个支持 SSL 加密的 Web 服务器时,httperf 可以通过设置相应的参数,模拟 HTTPS 请求,帮助我们了解服务器在加密通信情况下的性能表现 。
在实际应用中,我们可以根据具体的测试需求和场景来选择合适的网络测试工具 。如果只是进行简单的 Web 服务器性能测试,对测试工具的功能要求不高,ab 工具就可以满足需求,它简单易用,能够快速获取基本的性能指标 。而当需要测试多种协议的应用程序,或者需要生成详细的测试报告时,JMeter 则是一个不错的选择 。对于追求高并发性能测试,以及需要灵活定制测试场景的情况,wrk 和 siege 可能更为合适 。如果要对 HTTP/1.1 协议和 SSL 支持的服务器进行深入测试,httperf 会是一个很好的工具 。通过合理选择和使用这些网络测试工具,我们能够更全面、准确地评估网络性能,为系统的优化和改进提供有力的依据 。
Part4I/O 压力测试:洞察存储性能
4.1 stress 工具的 I/O 测试
在 I/O 压力测试的领域中,stress工具是我们的得力助手之一,它能够帮助我们快速地对系统的 I/O 性能进行初步的评估和检测 。stress工具进行 I/O 压力测试的原理是通过创建一定数量的工作线程,让这些线程对磁盘进行同步读写操作,从而模拟出高负载的 I/O 场景,以此来观察系统在这种压力下的 I/O 性能表现 。
例如,使用以下命令可以创建 4 个工作线程来进行同步读写操作,测试持续时间为 60 秒 :
在这个命令中,--io 4表示创建 4 个工作线程执行 I/O 密集型任务,这些线程会同时对磁盘进行读写操作,给 I/O 系统带来压力 。--timeout 60则指定了测试的总时长为 60 秒,当达到这个时间后,stress工具会自动停止测试 。通过这样的测试,我们可以初步了解系统在多线程 I/O 操作下的响应速度和稳定性 。比如,如果在测试过程中发现系统出现卡顿、响应延迟等情况,就可能意味着 I/O 系统存在性能瓶颈,需要进一步深入分析和优化 。
4.2 fio 工具深入剖析
fio工具在存储子系统测试中堪称 “全能选手”,它具有强大的功能和极高的灵活性,能够满足各种复杂的 I/O 性能测试需求 。
fio工具的常用参数丰富多样,每个参数都有着独特的作用 :
--name:用于指定任务名称,方便在测试结果中区分不同的测试任务 。例如,--name=test_randread,将任务命名为test_randread,这样在查看测试报告时,就能清晰地知道该结果对应的是随机读测试任务 。--direct=1:表示是否直接 I/O,设置为 1 时,测试过程会绕过机器自带的 buffer,使测试结果更真实地反映存储设备的性能 。因为绕过系统缓存后,数据直接与存储设备进行交互,避免了缓存对测试结果的干扰,能够更准确地评估存储设备的实际读写能力 。--rw:指定读写模式,常见的有read(顺序读)、write(顺序写)、randread(随机读)、randwrite(随机写)、randrw(混合随机读写)等 。比如,--rw=randwrite表示进行随机写测试,用于模拟数据库等应用中频繁的随机写入操作场景 。--bs:设置块大小,如--bs=4k表示单次 I/O 的块文件大小为 4KB 。块大小的设置对 I/O 性能有着重要影响,不同的应用场景可能适合不同的块大小 。例如,对于数据库应用,通常较小的块大小(如 4KB)比较合适,因为数据库的读写操作往往是小而频繁的;而对于文件传输等场景,较大的块大小(如 1MB)可能会提高传输效率 。--size:指定文件大小,例如--size=2G表示本次测试文件大小为 2GB 。通过设置不同的文件大小,可以测试存储设备在不同数据量下的性能表现,了解其在大数据量读写时的稳定性和效率 。--numjobs:设置并发进程数,--numjobs=8意味着开启 8 个并发进程同时进行 I/O 操作 。这个参数可以模拟多用户或多线程同时访问存储设备的场景,测试存储设备在高并发情况下的性能 。在实际应用中,服务器可能会同时处理多个用户的 I/O 请求,通过设置较高的并发进程数,可以评估存储设备是否能够满足这种高并发的需求 。--runtime:设置运行时间,--runtime=60表示测试时间为 60 秒 。如果不设置该参数,fio会一直运行直到完成指定的文件读写操作 。通过控制运行时间,可以在有限的时间内获取存储设备的性能数据,方便进行不同条件下的测试对比 。--group_reporting:用于汇总报告结果,它会将每个进程的信息进行汇总展示 。这样在测试多个并发进程时,我们可以更直观地了解整体的 I/O 性能情况,而不是分散地查看每个进程的单独结果 。下面通过几个实际脚本示例来展示如何使用fio进行不同场景的 I/O 性能测试以及如何分析测试结果 :
顺序读测试:
在这个测试中,--name=seq_read将任务命名为seq_read;--direct=1绕过系统缓存;--rw=read指定为顺序读模式;--bs=128k设置块大小为 128KB,对于顺序读操作,较大的块大小可以提高数据传输效率;--size=1G设置测试文件大小为 1GB;--numjobs=4开启 4 个并发进程;--runtime=60测试持续 60 秒;--group_reporting汇总报告结果 。
测试结果中,我们重点关注以下指标 :
bw(带宽):表示数据传输速率,单位通常为 KB/s 或 MB/s 。较高的带宽意味着存储设备能够更快地读取数据,例如,如果测试结果显示bw=500MB/s,说明在测试期间,存储设备平均每秒能够传输 500MB 的数据 。iops(每秒输入输出操作次数):反映了存储设备每秒能够处理的 I/O 请求数量 。对于顺序读测试,iops 的值相对较低,因为顺序读操作通常是连续的,每个 I/O 请求传输的数据量较大 。lat(延迟):表示 I/O 操作的响应时间,单位通常为毫秒(ms)或微秒(us) 。较低的延迟意味着存储设备能够更快地响应读请求,提供更快速的数据访问 。随机写测试:
此测试中,--name=rand_write命名任务;--direct=1绕过缓存;--rw=randwrite进行随机写操作;--bs=4k设置适合随机写的小块大小,因为随机写操作通常每次写入的数据量较小;--size=512M设置文件大小;--numjobs=8开启 8 个并发进程增加测试压力;--runtime=120测试持续 120 秒 。
在随机写测试结果中,除了关注带宽、iops 和延迟外,还需要注意延迟的分布情况 。由于随机写操作的随机性,延迟可能会有较大的波动 。例如,测试结果可能会给出不同延迟区间的百分比,如clat percentiles (msec): 1.00th=[3], 5.00th=[ 5], 10.00th=[ 6], 20.00th=[ 7],这表示 1% 的 I/O 操作延迟在 3 毫秒以内,5%的I/O操作延迟在 5 毫秒以内,以此类推 。通过分析延迟分布,可以了解存储设备在随机写操作下的稳定性 。如果延迟分布较为集中,说明存储设备的性能比较稳定;如果延迟分布范围很广,说明可能存在一些性能波动的问题,需要进一步排查 。
混合随机读写测试:
在这个混合测试中,--name=mix_randrw命名任务;--direct=1绕过缓存;--rw=randrw进行混合随机读写;--rwmixread=70 --rwmixwrite=30表示读操作占70%,写操作占 30%,用于模拟实际应用中常见的读写混合场景;--bs=8k设置块大小;--size=1G设置文件大小;--numjobs=6开启6个并发进程;--runtime=180测试持续 180 秒 。
对于混合随机读写测试结果,需要综合分析读和写的各项性能指标 。对比读和写的带宽、iops 以及延迟情况,判断存储设备在不同操作类型下的性能差异 。例如,如果读操作的带宽明显高于写操作,可能意味着存储设备在读取数据方面具有更好的性能;而如果写操作的延迟较高,可能需要进一步优化存储设备的写入性能,或者检查系统的配置是否对写操作存在限制 。通过对不同场景下的 I/O 性能测试和结果分析,我们能够全面深入地了解存储子系统的性能特点,为系统的优化和调整提供有力的依据 。