
每天分享技术栈,开发工具等
当您在生产环境中运行大量任务时,偶尔会遇到某个进程占用过多资源导致系统卡死,影响服务可用性。

docker-compose.yml放在项目根目录,执行 docker-compose up -d。ulimit是 Linux 内建命令,用于设置单个用户进程可使用的资源上限,例如打开文件数、最大线程数等。超出限制时,系统会拒绝分配,从而避免进程 uncontrolled growth。
# 查看所有限制
ulimit-a
在 DataGrip 的终端面板中执行同样命令,可以截取执行结果截图,如下图所示:
# 在 DataGrip 中的 Shell 窗口执行:
ulimit -n
# 临时将最大打开文件数设置为 1024
ulimit-n1024
# 验证
ulimit-n
如果某进程尝试打开超过 1024 个文件,会报错:
bash:<程序>:Too many open files
Control Groups(cgroups) 提供对进程组的整体资源限制,可更细粒度地管理 CPU、内存、块 I/O 等。
# 安装 cgroup 工具
yum install-y libcgroup-tools
# 启动服务
systemctl enable--now cgconfig
mount {
cpu=/sys/fs/cgroup/cpu;
memory=/sys/fs/cgroup/memory;
}
# 定义 mydb 组
group mydb {
cpu {
cpu.shares=512; # CPU 权重
}
memory {
memory.limit_in_bytes=1G; # 最大 1G
n }
}
# 将已有进程(PID 1234)加入 mydb
cgclassify -g cpu,memory:mydb 1234
在容器环境中,也可以通过 Compose 文件设置 cgroups 限制:
version:'3.8'
services:
db:
image: mysql:8.0
deploy:
resources:
limits:
cpus:'0.5'
memory: 512M
environment:
- MYSQL_ROOT_PASSWORD=secret
将此文件保存为 docker-compose.yml,执行:
docker-compose up -d
即可在容器层面限制数据库实例资源。
三者结合,可实现从用户到系统、进而到容器的全方位资源管控。
生产环境建议结合监控(Prometheus + Grafana)定时检测资源使用,避免盲目设置过低导致业务中断。
修改 ulimit建议写入 /etc/security/limits.conf以生效于新会话。
cgroups v2 引入更统一的管理方式,可根据分发版文档选型。
IT咸鱼原创,转载请注明公众号。