Linux-提高CPU、内存使用率shell脚本

'# Linux-提高CPU、内存使用率shell脚本

一、背景与问题

在Linux系统中,有时需要通过脚本临时提升CPU和内存使用率以测试系统性能极限或进行压力测试。这种场景常见于:

  1. 系统资源瓶颈分析
  2. 容器化环境资源隔离验证
  3. 性能调优前基准测试
  4. 安全性测试(如DoS攻击模拟)

然而,这类操作需要谨慎处理。不当的资源消耗可能导致系统不稳定、服务中断甚至硬件损坏。本文将深入探讨如何安全、可控地实现这一目标,并分析其技术原理与潜在风险。

二、基本原理

Linux系统通过进程调度器管理资源分配。提升资源使用率的核心在于:

  1. CPU占用:通过无限循环或计算密集型任务消耗CPU资源
  2. 内存占用:通过内存分配/释放或内存映射操作消耗物理内存
  3. 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^20
  • while 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) ))
done
  • 1<<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 60

2. 动态资源调整

#!/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.sh

3. 安全措施

  • 限制脚本执行权限
  • 使用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  # 显式释放内存

十、最佳实践

  1. 生产环境禁用:切勿在生产环境运行此类脚本
  2. 测试环境使用:仅在隔离的测试环境中运行
  3. 资源监控:实时监控系统资源使用情况
  4. 超时机制:设置合理的运行时长限制
  5. 权限控制:严格限制脚本执行权限
  6. 日志记录:记录所有操作日志以便审计
  7. 资源隔离:使用cgroups进行资源隔离
  8. 代码审查:对脚本进行代码审查
  9. 安全审计:定期进行安全审计
  10. 文档记录:详细记录使用场景和注意事项

十一、总结

Linux系统通过进程调度器管理资源分配,提升CPU和内存使用率的脚本需要结合系统原理进行设计。本文深入分析了多种实现方式,包括CPU资源占用、内存资源占用和I/O资源占用,并提供了完整的测试案例。需要注意的是,这类操作存在显著风险,必须在安全的测试环境中谨慎使用。实际开发中应优先使用专业的压力测试工具(如stress-ng),并结合cgroups等资源控制机制实现安全、可控的资源测试。

最后修改于:2026年09月22日 21:30

评论已关闭

推荐阅读

AIGC实战——Transformer模型
2024年12月01日
Socket TCP 和 UDP 编程基础(Python)
2024年11月30日
python , tcp , udp
如何使用 ChatGPT 进行学术润色?你需要这些指令
2024年12月01日
AI
最新 Python 调用 OpenAi 详细教程实现问答、图像合成、图像理解、语音合成、语音识别(详细教程)
2024年11月24日
ChatGPT 和 DALL·E 2 配合生成故事绘本
2024年12月01日
omegaconf,一个超强的 Python 库!
2024年11月24日
【视觉AIGC识别】误差特征、人脸伪造检测、其他类型假图检测
2024年12月01日
[超级详细]如何在深度学习训练模型过程中使用 GPU 加速
2024年11月29日
Python 物理引擎pymunk最完整教程
2024年11月27日
MediaPipe 人体姿态与手指关键点检测教程
2024年11月27日
深入了解 Taipy:Python 打造 Web 应用的全面教程
2024年11月26日
基于Transformer的时间序列预测模型
2024年11月25日
Python在金融大数据分析中的AI应用(股价分析、量化交易)实战
2024年11月25日
AIGC Gradio系列学习教程之Components
2024年12月01日
Python3 `asyncio` — 异步 I/O,事件循环和并发工具
2024年11月30日
llama-factory SFT系列教程:大模型在自定义数据集 LoRA 训练与部署
2024年12月01日
Python 多线程和多进程用法
2024年11月24日
Python socket详解,全网最全教程
2024年11月27日
python之plot()和subplot()画图
2024年11月26日
理解 DALL·E 2、Stable Diffusion 和 Midjourney 工作原理
2024年12月01日