《Linux运维实战:使用脚本模拟服务器CPU内存磁盘使用率》

总结:整理不易,如果对你有帮助,可否点赞关注一下?

更多详细内容请参考:Linux运维实战总结


一、模拟CPU使用率

说明:在Linux系统上模拟一个指定的CPU 负载(目标 70%),持续运行30分钟,并且所有负载线程都以最低优先级(nice 19) 运行。

bash 复制代码
#!/bin/bash

# 设置目标CPU占用率(40%)
TARGET_LOAD=70
# 设置持续时间(120秒)
DURATION=1800

# 获取CPU核心数
CORES=$(nproc)

# 计算需要的线程数
THREADS=$(( CORES * TARGET_LOAD / 100 ))
THREADS=$(( THREADS > 0 ? THREADS : 1 ))

echo "启动 $THREADS 个最低优先级线程模拟 ${TARGET_LOAD}% CPU负载(持续 $DURATION 秒)"

# 工作负载函数(设置为最低优先级)
low_priority_worker() {
    # 将当前进程设为最低优先级(nice 19)
    renice 19 -p $$ > /dev/null
    
    local end=$((SECONDS + DURATION))
    while [ $SECONDS -lt $end ]; do
        # 替代方案1:使用内置shell计算(兼容性更好)
        # 计算斐波那契数列产生计算负载
        a=0; b=1
        for i in {1..50000}; do
            c=$((a + b))
            a=$b
            b=$c
        done
        
        # 替代方案2:使用awk(如果系统有awk)
        # awk 'BEGIN {for(i=0;i<1000000;i++){}}' > /dev/null
        
        # 替代方案3:使用dd和哈希计算
        # dd if=/dev/urandom bs=4K count=1000 2>/dev/null | sha1sum > /dev/null
        
        # 适当休眠以控制总体负载比例
        sleep 0.2
    done
}

# 启动所有工作线程
for i in $(seq 1 $THREADS); do
    low_priority_worker &
done

# 等待持续时间结束
sleep $DURATION

# 清理所有后台进程
kill $(jobs -p) 2>/dev/null
wait
echo "任务完成,所有低优先级负载线程已终止"

二、模拟内存使用率

说明:启动一个占用 9GB内存的stress进程,然后持续监控系统的整体内存使用率;当内存使用率首次达到或超过50%时,并不立即终止该进程,而是再等待5分钟(300 秒),随后才强制终止stress进程并退出监控。

bash 复制代码
#!/bin/bash

# 需要预先安装 stress(如未安装:sudo apt install stress 或 sudo yum install stress)

echo "启动 stress 进程,占用 9GB 内存(放入后台)..."
stress --vm 1 --vm-bytes 9G --vm-keep &
STRESS_PID=$!
echo "stress 进程 PID: $STRESS_PID"

# 监控内存使用率,达到 50% 时自动终止
THRESHOLD=50
INTERVAL=2   # 检查间隔(秒)

echo "开始监控内存使用率,目标阈值: ${THRESHOLD}%"

while true; do
    # 获取当前内存使用率(%),保留整数
    MEM_PERCENT=$(free | awk '/^Mem/ {printf "%.0f", $3/$2 * 100}')
    echo "$(date '+%H:%M:%S') - 当前内存使用率: ${MEM_PERCENT}%"

    if [ "$MEM_PERCENT" -ge "$THRESHOLD" ]; then
        sleep 300
        echo "已达到阈值 ${THRESHOLD}%,正在终止 stress 进程 (PID: $STRESS_PID)..."
        kill $STRESS_PID
        # 同时清理可能残留的 stress 子进程
        pkill -P $STRESS_PID 2>/dev/null
        echo "stress 进程已停止。"
        break
    fi

    sleep $INTERVAL
done

echo "监控结束。"

三、模拟磁盘使用率

bash 复制代码
#!/bin/bash
for i in {1..14}; do
    dd if=/dev/zero of="file$i" bs=1G count=10 status=progress
done

总结:整理不易,如果对你有帮助,可否点赞关注一下?

更多详细内容请参考:Linux运维实战总结

相关推荐
垂钓的小鱼17 分钟前
用关联图谱做量化选股:让基本面惊喜沿着网络扩散
服务器·php·apache
Lonely 净土6 小时前
Linux 运维文件写入操作
linux·运维·服务器·文件管理
城管不管6 小时前
重生——第十一次面试之挖财一面2026.8.19已OC
java·服务器·jvm·数据库·spring·面试·职场和发展
飞英思特无线充电7 小时前
严苛场景巡检机器人的无线补能设计:点位、BMS、认证与运维边界
运维·机器人
Jimmy_jimi7 小时前
利用nginx代理完成url重定位
运维·nginx
liuyicenysabel8 小时前
多服务上线日记三:
运维·服务器·笔记·学习
吠品9 小时前
Wine 在 Linux 上运行 Windows 软件完整指南
java·linux·服务器
一只鹿鹿鹿9 小时前
大数据中心安全系统解决方案(Word文件)
大数据·运维·物联网·安全·政务
深念Y11 小时前
从 Windows 迁移到 Linux 开发环境的记录
linux·windows·链接·bun·ram·imdisk
AuTumn-L11 小时前
使用 SSH 密钥认证实现安全免密登录
服务器·安全·ssh