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

相关推荐
tg_xianheyun4 小时前
CDN节点分布如何影响网页加载速度和用户体验
服务器·cdn加速·全球访问优化
lsh曙光4 小时前
延时at指令和定时cron指令
linux·服务器·网络
圆山猫4 小时前
[Virtualization](四):Linux KVM/RISC-V 的 vCPU 运行路径
java·linux·risc-v
布鲁飞丝4 小时前
vivo Pulsar 万亿级消息处理实践()-Ansible运维部署
运维·ansible
XR1234567884 小时前
企业全光网络架构选型技术白皮书:从物理层到运维层的全链路分析
运维·网络·架构
似的8355 小时前
一步一步学习使用FireMonkey动画() 使用TAnimator类创建动画
linux·学习·nginx
HiDev_5 小时前
【非标自动化】2、认识元器件(直线模组)
运维·自动化
夏殇之殁6 小时前
包中创建自定义列表项。 . 使用自定义列表项进行数据绑定 . 将天气预报数据保存到本地内存表,通过LiveBindings进行显示。 ...
服务器·前端·javascript
龙仔7256 小时前
人大金仓 KingbaseES V8 只读账号创建完整运维笔记
运维·笔记·sql·人大金仓
我不管我就要叫小猪6 小时前
嵌入式Linux----网络通信
linux·运维·服务器