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

相关推荐
用户97183563346617 小时前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪19 小时前
linux 拷贝文件或目录到指定的位置
linux
大树881 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠1 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质1 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush41 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5201 天前
Linux 11 动态监控指令top
linux
小宇宙Zz1 天前
Maven依赖冲突
java·服务器·maven
Inhand陈工1 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智2 天前
ARP代理--工作原理
运维·网络·arp·arp代理