如何在Dockerfile中运行可提升资源统计的无限循环?
模拟Docker容器资源持续增长的实现方案
1. 组合版Dockerfile(同时模拟CPU、内存、块IO增长)
FROM alpine:latest # 安装压测所需工具 RUN apk add --no-cache bc coreutils # 复制资源压测脚本 COPY stress.sh /stress.sh RUN chmod +x /stress.sh # 启动压测脚本 CMD ["/stress.sh"]
配套的stress.sh脚本内容:
#!/bin/sh # 内存持续增长:不断往变量里塞数据,避免被系统回收 mem_stress() { MEM_DATA="" while true; do # 每次追加10MB随机数据,可调整大小控制增长速度 MEM_DATA="$MEM_DATA$(dd if=/dev/urandom bs=10M count=1 2>/dev/null)" sleep 0.5 done } # CPU持续占用:跑高精度数学运算,榨干CPU cpu_stress() { while true; do # 用bc计算高次自然指数,持续消耗CPU资源 echo "scale=10000; e(1000)" | bc -l > /dev/null done } # 块IO持续增长:不断写大文件再读取,产生读写IO io_stress() { while true; do # 写入1GB临时文件,不删除的话磁盘占用也会持续上升 dd if=/dev/zero of=/tmp/io_stress_$(date +%s) bs=1G count=1 2>/dev/null # 读取文件,增加读IO负载 cat /tmp/io_stress_* > /dev/null sleep 1 done } # 后台启动所有压测任务 mem_stress & cpu_stress & io_stress & # 保持容器运行 wait
2. 各资源增长的核心逻辑
CPU持续占用
- 用
bc执行高精度数学运算,这类运算会持续占用CPU;如果需要多核负载,多启动几个cpu_stress进程即可。 - 可以调整计算复杂度(比如修改
scale值或运算公式)来控制CPU占用率。
内存持续增长
- 通过不断往活跃变量里追加数据,让内存被持续占用且不会被系统GC回收;调整
bs参数大小可以控制内存增长速度。
块IO持续增长
- 用
dd循环写入大文件,配合读取操作同时产生读写IO;如果需要磁盘空间持续上涨,不要删除生成的临时文件,反之则可以写完就删。
3. 使用步骤
- 把
Dockerfile和stress.sh放在同一目录 - 构建镜像:
docker build -t resource-stress . - 启动容器:
docker run -d --name stress-test resource-stress - 实时查看资源统计:
docker stats stress-test
4. 可选优化(Python版本)
如果觉得shell脚本的内存增长不够稳定,可以改用Python实现内存压测:
# stress.py import random mem_list = [] while True: # 每次追加10MB数据到列表,内存会持续增长 mem_list.append(random.randbytes(10 * 1024 * 1024))
对应的Dockerfile改成:
FROM python:3.11-alpine COPY stress.py /stress.py CMD ["python", "/stress.py"]
内容的提问来源于stack exchange,提问作者Sumeet Chaudhari
相关产品推荐
相关产品推荐

