上级要求服务器的CPU和内存占用率必须达到设置的标准😄。故而找到一个神器lookbusy来满足,可以虚拟产生系统 CPU、内存、磁盘等负载,营造出系统繁忙的假象,完美满足考核要求😁

下载安装lookbusy :https://devin.com/lookbusy/

此脚本可以控制资源占用的时间以及阈值,并且在系统真正繁忙时自动关闭

#!/bin/bash

# --- 用户配置 ---
# lookbusy 的完整路径
LOOKBUSY_CMD="/usr/bin/lookbusy"

# 监控检查周期(秒)
CHECK_INTERVAL=30

# 工作时间窗口
START_HOUR=8
END_HOUR=20

# CPU 控制阈值 (单位: %)
CPU_LOWER_THRESHOLD=30
CPU_UPPER_THRESHOLD=70
CPU_CURVE_PERIOD="12h"
CPU_CURVE_PEAK="6h"

# 内存 控制阈值 (单位: %)
MEM_LOWER_THRESHOLD=60
MEM_TARGET_PERCENT=60
MEM_UPPER_THRESHOLD=80

# 日志和PID文件路径
LOG_FILE="/usr/local/lookbusy/dynamic_busy.log"      
PID_FILE="/usr/local/lookbusy/dynamic_lookbusy.pid"  


log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
}

# 获取当前系统CPU使用率 (%)
get_cpu_usage() {
    vmstat 1 2 | tail -1 | awk '{print 100 - $15}'
}

# 获取当前系统内存使用率 (%)
get_mem_usage() {
    awk '/MemTotal/ {total=$2} /MemAvailable/ {available=$2} END {printf "%.0f", (total-available)*100/total}' /proc/meminfo
}

# 启动 lookbusy
start_lookbusy() {
    local mem_to_use_mb=$1
    local cpu_needed=$2
    
    local cpu_args=""
    if [ "$cpu_needed" = "true" ]; then
        cpu_args="-c 20-50 -r curve -P ${CPU_CURVE_PERIOD} -p ${CPU_CURVE_PEAK}"
    fi

    if [ "$mem_to_use_mb" -gt 0 ] && [ "$cpu_needed" = "true" ]; then
        log "启动 lookbusy: CPU模式='${cpu_args}', 内存目标=${mem_to_use_mb}MB"
        nice -n 19 $LOOKBUSY_CMD $cpu_args -m "${mem_to_use_mb}M" &
    elif [ "$mem_to_use_mb" -gt 0 ]; then
        log "启动 lookbusy: 仅内存模式, 内存目标=${mem_to_use_mb}MB"
        nice -n 19 $LOOKBUSY_CMD -m "${mem_to_use_mb}M" &
    elif [ "$cpu_needed" = "true" ]; then
        log "启动 lookbusy: 仅CPU模式='${cpu_args}'"
        nice -n 19 $LOOKBUSY_CMD $cpu_args &
    else
        log "错误: 未指定CPU或内存模式"
        return 1
    fi
    echo $! > "$PID_FILE"
}

# 停止 lookbusy
stop_lookbusy() {
    if [ -f "$PID_FILE" ] && ps -p $(cat "$PID_FILE") > /dev/null; then
        log "停止 lookbusy (PID: $(cat $PID_FILE))."
        kill $(cat "$PID_FILE")
        rm -f "$PID_FILE"
    fi
}

log "守护进程启动。"
while true; do
    CURRENT_HOUR=$(date +%H)
    IS_LOOKBUSY_RUNNING=false
    if [ -f "$PID_FILE" ] && ps -p $(cat "$PID_FILE") > /dev/null; then
        IS_LOOKBUSY_RUNNING=true
    fi
    if [ "$CURRENT_HOUR" -ge "$START_HOUR" ] && [ "$CURRENT_HOUR" -lt "$END_HOUR" ]; then
        CPU_USAGE=$(get_cpu_usage)
        MEM_USAGE=$(get_mem_usage)
        log "当前状态: CPU=${CPU_USAGE}%, MEM=${MEM_USAGE}%. lookbusy运行状态: ${IS_LOOKBUSY_RUNNING}"
        if $IS_LOOKBUSY_RUNNING; then
            if [[ "$CPU_USAGE" -gt "$CPU_UPPER_THRESHOLD" ]] || [[ "$MEM_USAGE" -gt "$MEM_UPPER_THRESHOLD" ]]; then
                log "停止(高水位): CPU > ${CPU_UPPER_THRESHOLD}% 或 MEM > ${MEM_UPPER_THRESHOLD}%."
                stop_lookbusy
            else
                log "维持运行: 系统在安全范围内."
            fi
        else
            # 检查是否需要启动CPU模式
            CPU_NEEDED=false
            if [[ "$CPU_USAGE" -lt "$CPU_LOWER_THRESHOLD" ]]; then
                CPU_NEEDED=true
            fi
            
            # 检查是否需要启动内存模式
            MEM_TO_ALLOCATE_MB=0
            if [[ "$MEM_USAGE" -lt "$MEM_LOWER_THRESHOLD" ]]; then
                TOTAL_MEM_KB=$(awk '/MemTotal/ {print $2}' /proc/meminfo)
                CURRENT_MEM_KB=$(awk '/MemTotal/ {total=$2} /MemAvailable/ {available=$2} END {print total-available}' /proc/meminfo)
                TARGET_MEM_KB=$((TOTAL_MEM_KB * MEM_TARGET_PERCENT / 100))
                MEM_TO_ALLOCATE_KB=$((TARGET_MEM_KB - CURRENT_MEM_KB))
                if [ "$MEM_TO_ALLOCATE_KB" -gt 0 ]; then 
                    MEM_TO_ALLOCATE_MB=$((MEM_TO_ALLOCATE_KB / 1024))
                fi
            fi
            
            # 如果需要启动CPU或内存模式
            if [ "$CPU_NEEDED" = "true" ] || [ "$MEM_TO_ALLOCATE_MB" -gt 0 ]; then
                if [ "$CPU_NEEDED" = "true" ] && [ "$MEM_TO_ALLOCATE_MB" -gt 0 ]; then
                    log "启动(低水位): CPU < ${CPU_LOWER_THRESHOLD}% 且 MEM < ${MEM_LOWER_THRESHOLD}%, 启动CPU+内存模式."
                elif [ "$CPU_NEEDED" = "true" ]; then
                    log "启动(CPU低水位): CPU < ${CPU_LOWER_THRESHOLD}%, 启动仅CPU模式."
                else
                    log "启动(内存低水位): MEM < ${MEM_LOWER_THRESHOLD}%, 启动仅内存模式."
                fi
                start_lookbusy $MEM_TO_ALLOCATE_MB $CPU_NEEDED
            else
                log "维持停止: 未达到启动条件 (CPU=${CPU_USAGE}% >= ${CPU_LOWER_THRESHOLD}%, MEM=${MEM_USAGE}% >= ${MEM_LOWER_THRESHOLD}%)."
            fi
        fi
    else
        if $IS_LOOKBUSY_RUNNING; then log "停止(非工作时间)."; stop_lookbusy; fi
    fi
    sleep "$CHECK_INTERVAL"
done

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐