✨前言:
stressapptest 是一个用于在各种系统组件上施加压力的工具,特别专注于内存和CPU。通过运行各种模式的访问测试,stressapptest 旨在模拟高负载下的系统行为,并帮助发现潜在的错误,比如硬件故障、过热或系统组件的不稳定性。
🌟下面是stressapptest命令的一些详细说明:
内存和CPU压力: stressapptest 主要用于在内存和处理器上施加压力,检查它们在高负荷情况下的可靠性。它可以通过执行读写操作、内存复制和反转等来达到这个目的。
磁盘I/O 测试: 除了内存和CPU测试之外,stressapptest 还能进行磁盘I/O测试,这通过向指定的设备或文件进行读写操作来完成。
网络测试: stressapptest 可以进行网络测试,这是通过添加指定向特定IP地址或响应网络请求的线程来实现的。
NUMA支持: NUMA系统允许将内存和处理器绑定到特定的NUMA节点上,stressapptest 支持这一点,并利用numactl工具来指定节点。
错误检测: 它包含了检测硬件错误(如ECC错误)的组件,当系统在高压力下运行时,这对于确认系统稳定性至关重要。
日志记录: stressapptest 可以记录测试期间的所有输出到日志文件中,供以后分析和故障排除。
参数调整: stressapptest 提供了许多参数,允许用户自定义测试的各个方面,包括测试持续的时间、使用的内存量、测试工作线程的数量等。
✨Centos下工具安装
🌟先下载源码(需要安装git)
git clone https://github.com/stressapptest/stressapptest.git
🌟编译和安装 stressapptest:
cd stressapptest ./configure make && make install
编译完成之后会看到这个可执行文件
🌟stressapptest – help 可以看到常用参数
🌟参数解释
-M mbytes: 指定测试时要使用的内存大小(以兆字节为单位)。
–reserve-memory: 如果不使用大页面(hugepages),则为系统保留的内存量。
-H mbytes: 要求的最小大页面内存大小(以兆字节为单位)。
-s seconds: 测试运行的时间(秒)。
-m threads: 启动进行内存复制任务的线程数目。
-i threads: 启动进行内存反转任务(即对内存中的数据取反)的线程数目。
-C threads: 启动用于CPU压力测试的线程数目。
–findfiles: 自动查找磁盘I/O操作的位置。
-d device: 添加一个直接写操作磁盘的线程,针对块设备(或文件)‘device’。
-f filename: 添加一个使用临时文件 ‘filename’ 的磁盘线程。
-l logfile: 将输出日志写入 ‘logfile’ 文件。
–no_timestamps: 日志消息中不添加时间戳前缀。
–max_errors n: 在发现 ‘n’ 个错误后早期退出。
-v level: 详细信息级别(0-20),默认是8。
–printsec secs: 指定每隔多少秒打印「剩余秒数」的信息。
-W: 使用更多CPU资源以提高内存复制任务的压力。
-A: 在不兼容的系统上以降级模式运行。
-p pagesize: 内存块的大小(字节)。
–filesize size: 磁盘I/O临时文件的大小。
-n ipaddr: 添加一个网络线程,连接到IP地址为 ‘ipaddr’ 的系统。
–listen: 运行线程来监听并响应网络线程。
–no_errors: 在不检查ECC或其他错误的情况下运行。
–force_errors: 注入假错误来测试错误处理。
–force_errors_like_crazy: 注入大量假错误来测试错误处理。
-F: 不检查每项事务的结果。
–stop_on_errors: 在发现第一个错误后停止测试。
–read-block-size: 用于读取的块大小(用于 -d 参数)。
–write-block-size: 用于写入的块大小(用于 -d 参数),如果未定义,则使用读取的块大小作为写入的块大小。
–segment-size: 分割磁盘的段大小(用于 -d 参数)。
–cache-size: 磁盘缓存的大小(用于 -d 参数)。
–blocks-per-segment: 每次迭代每个段读/写的块数量(用于 -d 参数)。
–read-threshold: 一个块读操作应该花费的最长时间(微秒)(用于 -d 参数)。
–write-threshold: 一个块写操作应该花费的最长时间(微秒)(用于 -d 参数)。
–random-threads: 每个磁盘写线程的随机线程数(用于 -d 参数)。
–destructive: 写入/擦除磁盘分区(用于 -d 参数)。
–monitor_mode: 只进行ECC错误轮询,不产生压力负载。
–cc_test: 进行缓存一致性测试。
–cc_inc_count: 增加缓存线成员的次数。
–cc_line_count: 分配的缓存线大小数据结构的数量,用于缓存一致性线程操作。
🌟工具使用
stressapptest -s 100 -M 2048 -m 4 -W
👉这条命令的含义是:
-s 100 : 测试持续100秒。
-M 2048: 使用2048MB(即2GB)内存进行测试。
-m 4: 启动4个线程执行测试。
-W: 启用更强的数据完整性验证。
⚠️注意事项
在进行内存压测时,请注意以下几点:
监控系统行为:在压测期间,监控系统的响应,以确保系统不会出现过载导致的严重问题。
确保系统稳定性:在生产环境中,确保您了解运行压测的潜在风险。压测可能会导致系统使用大量资源,从而影响到其他应用或服务。
测试结果:压测结束后,stressapptest会报告测试结果,包括是否有错误发生。仔细检查这些结果以确保内存的稳定性和可靠性。
✨numactl和stressapp的结合:
日常中如果我们要对一些numa的节点,例如cxl的memory的测试的话,
在 NUMA 架构下,我们可以将 CPU 绑定到节点 0,将内存分配绑定到节点 2,然后使用 stressapptest 工具在这种配置下运行压力测试,测试持续 100 秒,使用 2 GB 的内存,并启动 4 个执行内存操作的线程,同时应用更多的 CPU 压力。这可以帮助你观察在特定 NUMA 维度上系统组件(特别是内存和CPU)的性能表现和稳定性。
numactl -N 0 -m 2 stressapptest -s 100 -M 2048 -m 4 -W
watch -n 1 "numactl -H"
可以使用上面的命令查看numa节点的内存消耗情况。