Linux-提高CPU、内存使用率shell脚本
'# Linux-提高CPU、内存使用率shell脚本
一、背景与问题
在Linux系统中,有时需要通过脚本临时提升CPU和内存使用率以测试系统性能极限或进行压力测试。这种场景常见于:
- 系统资源瓶颈分析
- 容器化环境资源隔离验证
- 性能调优前基准测试
- 安全性测试(如DoS攻击模拟)
然而,这类操作需要谨慎处理。不当的资源消耗可能导致系统不稳定、服务中断甚至硬件损坏。本文将深入探讨如何安全、可控地实现这一目标,并分析其技术原理与潜在风险。
二、基本原理
Linux系统通过进程调度器管理资源分配。提升资源使用率的核心在于:
- CPU占用:通过无限循环或计算密集型任务消耗CPU资源
- 内存占用:通过内存分配/释放或内存映射操作消耗物理内存
- I/O压力:通过磁盘读写操作占用I/O带宽
需要注意的是,Linux内核通过OOM Killer机制在内存不足时强制终止进程,因此需要设计合理的资源控制策略。
三、环境准备
# 安装必要的工具
sudo apt-get install -y stress-ng # 压力测试工具系统要求:
- Linux内核版本 ≥ 3.10
- 至少2GB内存
- 磁盘空间 ≥ 10GB(用于I/O测试)
四、核心实现
1. CPU资源占用脚本
#!/bin/bash
# 限制进程数量
MAX_PROCESSES=4
# 创建多个CPU占用进程
for ((i=0; i<MAX_PROCESSES; i++)); do
(
while true; do
# 使用数学运算占用CPU
echo $(( (1<<20) * (1<<20) )) # 计算2^40次方
done
) &
done
# 等待所有进程完成
wait关键代码解释:
1<<20是位左移操作,相当于计算2^20while true创建无限循环- 使用
&将进程放入后台 wait等待所有子进程完成
性能分析:
- 单个进程会达到100% CPU使用率
- 多进程并发可提升整体CPU负载
- 内存占用接近0(仅需栈空间)
2. 内存资源占用脚本
#!/bin/bash
# 内存占用参数
MEMORY_GB=2 # 占用2GB内存
# 创建内存占用进程
(
while true; do
# 分配内存并填充
buffer=$(yes | head -c $((MEMORY_GB * 1024 * 1024)))
# 保持内存占用
sleep 1
done
) &关键代码解释:
yes命令持续输出"y"字符head -c限制输出长度sleep保持内存占用- 进程会持续增长内存使用量
安全风险:
- 可能导致系统内存耗尽
- 触发OOM Killer强制终止进程
- 可能导致其他服务OOM(如数据库)
3. I/O资源占用脚本
#!/bin/bash
# 磁盘空间参数
DISK_SPACE_GB=5 # 占用5GB磁盘空间
# 创建临时文件
TEMP_DIR=/tmp/io_test
mkdir -p $TEMP_DIR
# 写入磁盘
dd if=/dev/zero of=$TEMP_DIR/io_file bs=1M count=$DISK_SPACE_GB
# 读取磁盘
dd if=$TEMP_DIR/io_file of=/dev/null bs=1M关键代码解释:
dd命令进行磁盘读写bs=1M指定块大小count控制数据量of=/dev/null防止数据保留
性能优化建议:
- 使用
ionice控制I/O优先级 - 使用
nice调整CPU优先级 - 使用
ionice -c2限制I/O带宽
五、完整案例:系统压力测试
#!/bin/bash
# 压力测试参数
CPU_THREADS=4
MEMORY_GB=2
DISK_SPACE_GB=5
DURATION=60 # 测试时长(秒)
# 创建临时目录
TEMP_DIR=/tmp/sys_stress
mkdir -p $TEMP_DIR
# 启动压力测试
(
# 启动CPU压力
for ((i=0; i<CPU_THREADS; i++)); do
while true; do
echo $(( (1<<20) * (1<<20) ))
done
done
# 启动内存压力
while true; do
buffer=$(yes | head -c $((MEMORY_GB * 1024 * 1024)))
sleep 1
done
# 启动I/O压力
dd if=/dev/zero of=$TEMP_DIR/io_file bs=1M count=$DISK_SPACE_GB
dd if=$TEMP_DIR/io_file of=/dev/null bs=1M
) &
# 监控资源使用情况
while [ $DURATION -gt 0 ]; do
echo "当前时间:$(date)"
top -b -n 1 | grep "Cpu(s)"
free -h
df -h
sleep 1
DURATION=$((DURATION - 1))
done
# 清理
rm -rf $TEMP_DIR实际应用场景:
- 系统性能基准测试
- 容器资源限制验证
- 网络服务压力测试
- 安全性测试(如DoS攻击模拟)
注意事项:
- 需在测试环境中运行
- 建议使用
stress-ng工具代替手动脚本 - 需要提前备份重要数据
- 建议设置超时机制防止意外运行
六、源码解析
以CPU资源占用脚本为例,关键代码分析:
while true; do
echo $(( (1<<20) * (1<<20) ))
done1<<20表示2^20,计算时会触发大量计算- 每次循环都会进行大整数运算
- 由于没有sleep,会持续占用CPU
- 可通过
nice -n 19降低优先级
性能分析:
- 单个进程可达100% CPU使用率
- 多进程并发可提升整体负载
- 内存占用极低(仅栈空间)
七、进阶使用
1. 资源控制策略
# 使用nice控制优先级
nice -n 19 ./cpu_stress.sh
# 使用ionice控制I/O优先级
ionice -c2 -n0 -t ./io_stress.sh
# 使用cgroups限制资源
sudo cgcreate -g cpu,mem,blkdev:stress
sudo cgexec -g cpu,mem,blkdev:stress ./stress-ng --cpu $(nproc) --io 1 --vm 1 --duration 602. 动态资源调整
#!/bin/bash
# 动态调整资源占用
while true; do
current_cpu=$(top -b -n1 | grep "Cpu(s)" | awk '{print $2}')
current_mem=$(free | grep Mem | awk '{print $3}')
if (( $(echo "$current_cpu < 90" | bc -l) )); then
# 增加CPU占用
echo "增加CPU负载..."
(while true; do echo $(( (1<<20) * (1<<20) )); done) &
elif (( $(echo "$current_mem < 80" | bc -l) )); then
# 增加内存占用
echo "增加内存负载..."
buffer=$(yes | head -c 1024M)
fi
sleep 1
done八、性能与工程实践
1. 性能优化
- 使用
stress-ng代替自定义脚本 - 使用
perf工具进行性能分析 - 使用
cgroups实现资源隔离 - 使用
nice/renice调整优先级 - 使用
ionice控制I/O优先级
2. 异常处理
# 异常处理示例
trap 'kill $(jobs -p)' EXIT
# 增加超时机制
timeout 300 ./stress_script.sh3. 安全措施
- 限制脚本执行权限
- 使用
sudo控制执行 - 设置资源上限
- 记录执行日志
- 设置超时机制
九、常见问题与踩坑
1. 常见错误
| 错误类型 | 原因 | 解决方案 |
|---|---|---|
| 进程僵死 | 未正确终止进程 | 使用kill或pkill |
| 系统崩溃 | 资源耗尽 | 设置资源上限 |
| 日志满载 | 未清理日志 | 设置日志轮转 |
| 权限不足 | 无执行权限 | 使用sudo |
2. 典型问题
问题:脚本无法终止
# 错误示例
kill -9 12345 # 直接终止进程改进方案:
# 正确终止
kill 12345
# 如果仍无法终止
kill -9 12345问题:内存占用未释放
# 错误示例
buffer=$(yes | head -c 1024M) # 未清理内存改进方案:
buffer=$(yes | head -c 1024M)
unset buffer # 显式释放内存十、最佳实践
- 生产环境禁用:切勿在生产环境运行此类脚本
- 测试环境使用:仅在隔离的测试环境中运行
- 资源监控:实时监控系统资源使用情况
- 超时机制:设置合理的运行时长限制
- 权限控制:严格限制脚本执行权限
- 日志记录:记录所有操作日志以便审计
- 资源隔离:使用cgroups进行资源隔离
- 代码审查:对脚本进行代码审查
- 安全审计:定期进行安全审计
- 文档记录:详细记录使用场景和注意事项
十一、总结
Linux系统通过进程调度器管理资源分配,提升CPU和内存使用率的脚本需要结合系统原理进行设计。本文深入分析了多种实现方式,包括CPU资源占用、内存资源占用和I/O资源占用,并提供了完整的测试案例。需要注意的是,这类操作存在显著风险,必须在安全的测试环境中谨慎使用。实际开发中应优先使用专业的压力测试工具(如stress-ng),并结合cgroups等资源控制机制实现安全、可控的资源测试。
评论已关闭