You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu服务器Python+Flask应用弹性资源分配方案咨询

学生Flask应用动态资源分配实现方案(Ubuntu环境)

针对你提出的资源分配规则,结合Ubuntu系统的特性,推荐采用Docker容器化隔离+动态资源调整脚本的方案,既满足轻量需求,又能精准控制资源优先级与分配逻辑。

核心思路

  1. 用Docker将每个学生的Flask应用打包为独立容器,实现进程级资源隔离;
  2. 通过定时脚本监控活跃应用(有用户访问的容器),动态调整容器的CPU/内存限制;
  3. 为高优先级应用设置特殊规则,优先保障其资源占用。

具体实现步骤

1. 基础环境部署

先完成Docker和反向代理的安装配置,这是资源控制的基础:

  • 安装Docker与Docker Compose:
    sudo apt update && sudo apt install docker.io docker-compose -y
    sudo usermod -aG docker $USER
    
  • 配置Nginx作为反向代理:
    给每个学生应用分配独立的子域名或路径(如student01.yourdomain.com),指向对应容器的Flask服务端口(默认5000)。同时开启Nginx访问日志,用于后续检测活跃应用。

2. 编写资源动态调整脚本

以下是Shell脚本示例,实现你的三条资源分配规则,可根据服务器实际配置修改参数:

#!/bin/bash
# 服务器总资源配置
TOTAL_MEM="4g"
TOTAL_CPUS=2

# 1. 检测最近1分钟内有访问的活跃容器(从Nginx日志提取)
ACTIVE_CONTAINERS=$(grep -E 'student[0-9]+|priority-' /var/log/nginx/access.log | awk '{print $7}' | cut -d'/' -f2 | sort | uniq)
ACTIVE_COUNT=$(echo "$ACTIVE_CONTAINERS" | wc -l)

# 2. 处理高优先级应用(容器名称含"priority-"标识)
PRIORITY_CONTAINERS=$(echo "$ACTIVE_CONTAINERS" | grep "priority-")
if [ -n "$PRIORITY_CONTAINERS" ]; then
    # 高优先级容器直接分配全部资源
    for container in $PRIORITY_CONTAINERS; do
        docker update --memory="$TOTAL_MEM" --cpus="$TOTAL_CPUS" "$container"
    done
    # 普通活跃容器分配剩余资源(若存在)
    NORMAL_ACTIVE=$(echo "$ACTIVE_CONTAINERS" | grep -v "priority-")
    NORMAL_COUNT=$(echo "$NORMAL_ACTIVE" | wc -l)
    if [ $NORMAL_COUNT -gt 0 ]; then
        ALLOC_MEM=$(echo "$TOTAL_MEM" | sed 's/g//' | awk -v n="$NORMAL_COUNT" '{print $1/n"g"}')
        ALLOC_CPUS=$(echo "$TOTAL_CPUS / $NORMAL_COUNT" | bc -l)
        for container in $NORMAL_ACTIVE; do
            docker update --memory="$ALLOC_MEM" --cpus="$ALLOC_CPUS" "$container"
        done
    fi
else
    # 无高优先级应用时,按普通规则分配
    if [ $ACTIVE_COUNT -eq 1 ]; then
        # 单个活跃应用分配全部资源
        for container in $ACTIVE_CONTAINERS; do
            docker update --memory="$TOTAL_MEM" --cpus="$TOTAL_CPUS" "$container"
        done
    elif [ $ACTIVE_COUNT -ge 2 ]; then
        # 多个活跃应用平均分配资源
        ALLOC_MEM=$(echo "$TOTAL_MEM" | sed 's/g//' | awk -v n="$ACTIVE_COUNT" '{print $1/n"g"}')
        ALLOC_CPUS=$(echo "$TOTAL_CPUS / $ACTIVE_COUNT" | bc -l)
        for container in $ACTIVE_CONTAINERS; do
            docker update --memory="$ALLOC_MEM" --cpus="$ALLOC_CPUS" "$container"
        done
    fi
fi

# 3. 非活跃容器重置为低资源占用
ALL_CONTAINERS=$(docker ps --format "{{.Names}}")
for container in $ALL_CONTAINERS; do
    if ! echo "$ACTIVE_CONTAINERS" | grep -q "$container"; then
        docker update --memory="100m" --cpus="0.1" "$container"
    fi
done

3. 定时执行脚本

由于Crontab最小执行间隔为1分钟,可通过拆分脚本执行频率实现10秒级检测:

# 编辑Crontab配置
crontab -e
# 添加以下内容(替换脚本路径为实际路径)
* * * * * sleep 0 && /opt/resource-adjust.sh; sleep 10 && /opt/resource-adjust.sh; sleep 10 && /opt/resource-adjust.sh; sleep 10 && /opt/resource-adjust.sh; sleep 10 && /opt/resource-adjust.sh; sleep 10 && /opt/resource-adjust.sh

4. 高优先级应用标记

创建高优先级应用容器时,在名称中加入priority-前缀,例如:

docker run -d --name priority-student05-flask -p 5005:5000 student-flask-image

优化建议

  • 若需要更精准的活跃检测,可替换Nginx日志检测为Prometheus监控容器网络流量,当流量超过阈值时判定为活跃;
  • 给容器设置内存软限制(--memory-reservation),避免突发流量导致的资源耗尽;
  • 对于批量容器管理,可使用Docker Compose统一配置学生应用的基础镜像与端口映射。

内容的提问来源于stack exchange,提问作者Erel Segal-Halevi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 17:05:32