《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运维实战总结

相关推荐
wtblszn3 分钟前
实验室通风设备远程监控运维管理系统方案
运维
syagain_zsx1 小时前
spdlog实战:日志分级、滚动与性能调优
linux·c++·日志库·二次开发日志库
GeW13 小时前
新质生产力路线图Linux、数据库、国产化替代一次讲透
linux
aningx15 小时前
cachyos 从 GRUB 切换到 rEFInd
linux
第404号工位17 小时前
40块钱二手瘦客户端,如何跑满家庭物联网中枢?(拒绝Docker爆盘实录)
linux·架构·node.js
对象存储与RustFS17 小时前
网盘限速逼你开会员?用 RustFS 自己搭一个不限速的“私人网盘
服务器·后端·docker
骑着蜗牛撵大象32719 小时前
Linux 进程间通信之管道:从 pipe() 的内核语义到 FIFO 落地排错
android·java·linux·系统编程·fifo·管道·进程间通信
众壹新能源科技19 小时前
逆变器自带无功不够用,加装5MVar SVG后功率因数从0.85回到0.99
运维·人工智能·自动化
..Dauntless..19 小时前
【Linux】一切皆文件和缓冲区
linux·运维·服务器
裕晟资质规划19 小时前
三类资质变更报告时限差在哪?军工 15 日、集成印制 10 日
大数据·服务器·网络