限制进程数的意义
进程数上限限制容器内可创建的进程与线程总数,用来防止单个服务异常派生大量进程或线程,把宿主的调度资源耗尽。它属于资源限制体系里最容易被忽略的一项,却在容器内出现进程风暴时最先起作用。设置时要结合运行时的线程模型留出足够余量。
基本信息
| 用途 | 限制容器内进程与线程总数 |
|---|---|
| 语法 | 运行参数指定进程上限,取特定值表示不限 |
| 查看方式 | 统计输出的进程数列,或检查命令的对应字段 |
| 计数口径 | 线程同样计入 |
| 适用平台 | Linux 上的容器运行时 |
典型使用场景
- 防止单个服务异常派生进程拖垮宿主
- 作为加固基线的一部分与新服务一同上线
- 排查容器内大量进程导致的宿主变慢
- 压测后按峰值重新设定上限
- 审计存量容器是否缺少该项限制
设置与核对
设置与核对
docker run -d --pids-limit=256 --name api app/api:1.4.2
docker stats --no-stream --format '{{.Name}} pids={{.PIDs}}' api # 观察当前进程数
docker inspect -f '{{.HostConfig.PidsLimit}}' api # 核对设置值
docker exec api sh -c 'ls /proc | grep -c "^[0-9]"' # 容器内进程数量方面与注意
| 方面 | 说明 | 注意 |
|---|---|---|
| 计数口径 | 进程与线程合计 | 线程模型重的运行时占用较高 |
| 取值建议 | 按峰值上浮一定余量 | 过小会在高并发时报错 |
| 不限取值 | 取特定值表示不限 | 加固场景不建议使用 |
| 保护范围 | 仅限本容器 | 宿主整体饱和仍会影响所有容器 |
线程也计入该限额:线程模型较重的运行时需要按峰值线程数放大余量,否则高并发时会以创建线程失败的形式报错。
宿主的进程总量饱和时全局都会受到影响,这一限制只保护单个容器这一层,属于纵深防御的一环。
编排文件里同样有对应的进程数上限字段,把限制写进文件,比只在手工命令里设置更容易长期保持一致。