当前位置: 首页 > news >正文

Linux系统硬件老化测试脚本:自动化负载与监控

简介:

  这篇文章介绍了一款用于Linux系统的自动化硬件老化测试脚本。该脚本能够通过对CPU、内存、硬盘和GPU进行高强度负载测试,持续运行设定的时长(如1小时),以模拟长时间高负荷运行的环境,从而验证硬件的稳定性与可靠性。脚本还包括了系统资源监控,实时显示CPU温度、频率、内存使用情况等信息,并将测试结果记录到日志文件中。测试完成后,脚本会提供详细的反馈,并允许用户选择是否重新执行测试。通过这种方式,用户可以轻松地评估设备的性能和健康状况。

#!/bin/bash# 请设置老化时长(小时)
set_aging_time=1# 获取脚本绝对路径
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
# echo "脚本所在的绝对路径是: ${SCRIPT_DIR}"# 日志存放路径
log_file=${SCRIPT_DIR}/log_file.log
stress_ng=${SCRIPT_DIR}/stress_ng.log# 安装stress-ng、figlet和glmark2-es2工具,当前环境为Ubuntu系统,根据系统替换相关安装命令
install_packages() {if command -v stress-ng > /dev/null 2>&1 && command -v figlet > /dev/null 2>&1 && command -v glmark2-es2 > /dev/null 2>&1; thenecho "All software has been installed."elsesudo apt updatesudo apt install -y stress-ngsudo apt install -y glmark2-es2sudo apt install -y figlet# 检查 stress-ng 是否缺失if ! command -v stress-ng > /dev/null 2>&1; thenecho "stress-ng is not installed"exit 1fi# 检查 figlet 是否缺失if ! command -v figlet > /dev/null 2>&1; thenecho "figlet is not installed"exit 1fi# 检查 glmark2-es2 是否缺失if ! command -v glmark2-es2 > /dev/null 2>&1; thenecho "glmark2-es2 is not installed"exit 1fifi
}# CPU stress test
run_cpu_test() {# 查看cpu信息 lscpustress-ng --cpu $(nproc) --metrics-brief --timeout ${aging_time}s >> ${stress_ng} 2>&1
}# Memory stress test
run_memory_test() {available_memory=$(free -m | grep -E 'Mem|内存' | awk '{print $7}')half_memory=$(echo "$available_memory / $(nproc)" | bc)# 运行内存分配释放模式stress-ng --vm $(nproc) --vm-bytes ${half_memory}M --metrics-brief --timeout ${aging_time}s >> ${stress_ng} 2>&1# 运行内存持续占用模式# stress-ng --vm 1 --vm-bytes ${available_memory}M --metrics-brief --vm-keep --timeout ${aging_time}s >> ${stress_ng} 2>&1
}#HDD stress test
run_disk_stress_test() {stress-ng --hdd $(nproc) -i $(nproc) --metrics-brief --timeout ${aging_time}s >> ${stress_ng} 2>&1
}# GPU stress test
run_gpu_test() {timeout ${aging_time} glmark2-es2  --run-forever --annotate > /dev/null 2>&1
}get_cpu_info() {# 当前 CPU 温度路径cpu_temp_path="/sys/class/thermal/thermal_zone1/temp"cat ${cpu_temp_path} > /dev/null 2>&1if [ $? -eq 0 ]; thencpu_temp=$(echo "scale=1; $(cat ${cpu_temp_path}) / 1000" | bc)elsecpu_temp=" ---"fi# 当前 CPU 频率路径cpu_cur_freq_path="/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_cur_freq"cat ${cpu_cur_freq_path} > /dev/null 2>&1if [ $? -eq 0 ]; thencpu_cur_freq=$(echo "scale=2; $(cat ${cpu_cur_freq_path}) / 1000" | bc)elsecpu_cur_freq=" --- "fi# 获取当前CPU使用率cpu_usage=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
}get_memory_info() {# 获取总内存、已用内存、缓存memory_info=$(free -m)total_mem=$(echo "$memory_info" | grep -E 'Mem|内存' | awk '{print $2}')used_mem=$(echo "$memory_info" | grep -E 'Mem|内存' | awk '{print $3}')# 计算内存使用百分比(保留一位小数)used_percent=$(echo "scale=1; $used_mem * 100 / $total_mem" | bc)
}run_test() {touch ${SCRIPT_DIR}/start_state.zzecho "Device MAC: $(ip -o link show up | awk '$2 == "eth0:" {print $17}')" >> ${log_file}aging_time=$((set_aging_time * 60 * 60))echo "Aging duration: ${aging_time}S" >> ${log_file}run_cpu_test &run_memory_test &run_disk_stress_test &run_gpu_test &echo "start time: $(date)" >> ${log_file}start_time=$(date +%s)# 清屏clear# 隐藏光标:使用 ANSI 转义序列echo -e "\e[?25l"# 循环直到老化时间结束while true; docurrent_time=$(date +%s)  # 获取当前时间elapsed_time=$((current_time - start_time))  # 计算已老化时间# 将已老化时间转换为小时、分钟和秒hours=$((elapsed_time / 3600))minutes=$(( (elapsed_time % 3600) / 60 ))seconds=$((elapsed_time % 60))tput cup 0 0echo -n "Aging time: $(printf "%02d:%02d:%02d" $hours $minutes $seconds)    "get_cpu_infotput cup 2 0echo -n "CPU Usage: ${cpu_usage}%   |  CPU Temp: ${cpu_temp} °C   |  CPU Cur Freq: ${cpu_cur_freq} MHz    "get_memory_infotput cup 4 0echo -n "Total Mem: ${total_mem}M  |  Used Mem: ${used_mem}M     |  Mem Usage: ${used_percent}%    "# 检查是否已经达到老化时间if [ "$elapsed_time" -ge "$aging_time" ]; thenecho "stop time: $(date)" >> ${log_file}breakfi# 每隔1秒更新一次显示sleep 1done# 等待所有测试完成wait# 显示光标:使用 ANSI 转义序列echo -e "\e[?25h"	echo ""printf "Aging test passed, aging duration: %02d:%02d:%02d" $hours $minutes $seconds 2>&1 | tee -a ${log_file}echo ""echo -e "\033[32m$(figlet "PASS")\033[0m"touch ${SCRIPT_DIR}/end_state.zz
}install_packagesstart_state="${SCRIPT_DIR}/start_state.zz"
end_state="${SCRIPT_DIR}/end_state.zz"
if [[ -e "$start_state" ]] && [[ ! -e "$end_state" ]]; thenecho -e "\033[31m$(figlet "FAIL")\033[0m"read -p "Aging test failed, please choose whether to re-execute aging test? (y/n):" answerif [ "$answer" = "Y" ] || [ "$answer" == "y" ]; thenrm -rf ${SCRIPT_DIR}/log_file.logrm -rf ${SCRIPT_DIR}/stress_ng.logrm -rf ${SCRIPT_DIR}/start_state.zzrun_testelseexit 0fielif [[ -e "$start_state" ]] && [[ -e "$end_state" ]]; thenecho -e "\033[32m$(figlet "PASS")\033[0m"read -p "The equipment has completed the aging test and passed. Would you like to re-execute the aging test? (y/n):" answerif [ "$answer" = "Y" ] || [ "$answer" == "y" ]; thenrm -rf ${SCRIPT_DIR}/log_file.logrm -rf ${SCRIPT_DIR}/stress_ng.logrm -rf ${SCRIPT_DIR}/start_state.zzrm -rf ${SCRIPT_DIR}/end_state.zzrun_testelseexit 0fielserun_test
fi

相关文章:

Linux系统硬件老化测试脚本:自动化负载与监控

简介: 这篇文章介绍了一款用于Linux系统的自动化硬件老化测试脚本。该脚本能够通过对CPU、内存、硬盘和GPU进行高强度负载测试,持续运行设定的时长(如1小时),以模拟长时间高负荷运行的环境,从而验证硬件的稳…...

搭建一个基于Web的文档管理系统,用于存储、共享和协作编辑文档

搭建一个基于Web的文档管理系统,用于存储、共享和协作编辑文档 本项目采用以下架构: NFS服务器: 负责存储文档资料。Web服务器: 负责提供文档访问和编辑功能。SELinux: 负责权限控制,确保文档安全。Git服务器: 负责存储文档版本历史&#x…...

排序学习整理(1)

1.排序的概念及运用 1.1概念 排序:所谓排序,就是使⼀串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作,以便更容易查找、组织或分析数据。 1.2运用 购物筛选排序 院校排名 1.3常见排序算法 2.实…...

《深入探究 Java 中的 boolean 类型》

在 Java 编程语言的世界里,boolean 类型虽然看似简单,却在程序的逻辑控制和决策中起着至关重要的作用。本文将带你深入了解 Java 中的 boolean 类型,从其基本概念、用法到实际应用场景,以及一些常见的注意事项。 一、boolean 类型…...

智享 AI 自动无人直播系统:打破地域与时间枷锁中小微企业的营销破局利器

中小微企业,在商业浪潮中恰似逐浪扁舟,常面临营销成本高、推广渠道窄、专业人才缺等 “暗礁”,而智享 AI 自动无人直播系统恰如精准导航的灯塔,助其破浪前行、突出重围。 成本维度,传统直播人力成本让中小微企业望而却…...

接口测试工具:reqable

背景 在众多接口测试工具中挑选出一个比较好用的接口测试工具。使用过很多工具,如Postman、Apifox、ApiPost等,基本上是同类产品,一般主要使用到的功能就是API接口和cURL,其他的功能目前还暂未使用到。 对比 性能方面&#xff…...

同时多平台git配置:GitHub和Gitee生成不同的SSH Key

文章目录 GitHub和Gitee生成不同的SSH Key步骤1:生成SSH Key步骤2:配置SSH配置文件步骤3:查看SSH公钥步骤4:将SSH公钥添加到GitHub和Gitee步骤5:测试SSH连接步骤6:添加remote远程库 GitHub和Gitee生成不同的…...

刷题计划day24 回溯(三)【复原 IP 地址】【子集】【子集 II】

⚡刷题计划day24 回溯(三)继续,回溯一共会有五个专题,敬请期待关注,可以点个免费的赞哦~ 往期可看专栏,关注不迷路, 您的支持是我的最大动力🌹~ 目录 题目一:复原 IP…...

从“找三角形”讲“等腰三角形”

【题目】 周长为11,且各边长均为整数的三角形有哪些? 【答案】 四种,边长分别为: 2 4 5 3 3 5 1 5 5 3 4 4 【解析】 讲解等腰三角形的概念时,传统方法一般向学生展示一个等腰三角形的实物模型,这…...

Java中的泛型方法和泛型类

在Java编程语言中,泛型(Generics)是一个强大的特性,它使得类、接口和方法能够灵活地操作各种数据类型,同时保持类型安全。泛型主要通过类型参数(Type Parameters)来实现,这些类型参数…...

springboot学习-spring-boot-data-jdbc分页/排序/多表查询的例子

上次使用的是JdbcTemplate实现的,是比较老的方式,重新用spring boot data jdbc和jdbc client 实现一遍。也比较一下这几种的编码差异。数据库方面JAVA给了太多选择,反而不好选了。 上次就试图直接用: public interface UserRepo…...

通信与网络基础

1.网络通信基本概念 通信:人、物通过某种介质和行为进行信息传递与交流 网络通信:终端设备之间通过计算机网络进行通信 两个终端通过网线传递文件 多个终端通过路由器传递文件 终端通过Internet下载文件 2.信息传递过程 图1-1 假定A计算机访问B的web…...

【3.存储系统】综合大题

【考点】存储系统综合大题 【2011年408真题】某计算机存储器按字节编址,虚拟(逻辑)地址空间大小为16 MB,主存(物理)地址空间大小为1 MB,页面大小为4 KB;Cache采用直接映射方式,共8行;主存与Cache之间交换的…...

【Linux】【字符设备驱动】深入解析

Linux字符设备驱动程序用于控制不支持随机访问的硬件设备,如串行端口、打印机、调制解调器等。这类设备通常以字符流的形式与用户空间程序进行交互。本节将深入探讨字符设备驱动的设计原理、实现细节及其与内核其他组件的交互。 1. 引言 字符设备驱动程序是Linux内…...

【JavaEE】多线程(2)

一、线程安全 1.1 线程安全的概念 线程是随机调度执行的,如果多线程环境下的程序运行的结果符合我们预期则说明线程安全,反之,如果遇到其他结果甚至引起了bug则说明线程不安全 1.2 经典例子与解释 下面举一个经典的线程不安全的例子&…...

mac下Gpt Chrome升级成GptBrowser书签和保存的密码恢复

cd /Users/自己的用户名/Library/Application\ Support/ 目录下有 GPT\ Chrome/ Google/ GptBrowser/ GPT\ Chrome 为原来的chrome浏览器的文件存储目录. GptBrowser 为升级后chrome浏览器存储目录 书签所在的文件 Bookmarks 登录账号Login 相关的文件 拷贝到GptBrow…...

使用Grafana K6来测测你的系统负载能力

背景 近期我们有个号称会有很高很高并发的系统要上线,为了测试一下自己开发的系统的负载能力,准备了点海克斯科技,来看看抗不抗的住。 之前笔者写过用Apache JMeter进行压力测试的文章(传送门👉:https://…...

【论文复现】基于BERT的语义分析实现

📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀ WRN: 宽度残差网络 概述语义分类文本分类情感分类 实现原理 核心逻辑pre_deal.pytrain.pytest_demo.py 实现方式&演示效果训练阶段测试阶…...

CTF-RE: STL逆向 [NewStarCTF 2023 公开赛道 STL] WP

多看看STL题就会了,很简单 int __fastcall main(int argc, const char **argv, const char **envp) {__int64 v3; // rbx__int64 v4; // raxchar v5; // bl_BYTE *v6; // rax_QWORD *v7; // rax__int64 v8; // rax__int64 v9; // raxint i; // [rsp0h] [rbp-250h]int j; // [r…...

实习冲刺第三十六天

46.全排列 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2: 输入&#…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

数据库分批入库

今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...

小木的算法日记-多叉树的递归/层序遍历

🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...

面试高频问题

文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...