标准答案

  1. RLIMIT_NOFILE、RLIMIT_NPROC、核心文件大小等限制通常随进程继承,并由启动器决定软硬上限。
  2. cgroup 更适合限制一组进程的 CPU、内存、PIDs 和 I/O,容器运行时通常通过 cgroup 设置。
  3. 排查“宿主机能用但容器不能用”时要同时检查进程 limits、cgroup 文件、运行时参数和 service manager 配置。
  4. 修改限制后要验证目标进程实际看到的值,配置文件被改动不等于已重启并生效。

题目解析

ulimit 通常映射到进程级的 RLIMIT,例如 nofile、nproc、core 和 stack;它会在进程创建时继承,但 systemd、容器运行时和应用启动器都可能覆盖它。cgroup limits 则按进程组限制 CPU、内存和 I/O 等资源,二者是不同层次的边界。

排查时要进入服务实际运行的环境查看 /proc/<pid>/limits、cgroup 文件和管理器配置,并区分软限制与硬限制。提高 nofile 不能增加内存,提高内存 limit 也不会解决 fd 泄漏;每个限制都要对应具体资源和容量证据。

常见误区

  • 误区:只在宿主机 shell 执行 ulimit。改正:检查服务进程实际继承的 limits,以及 systemd/container 的覆盖配置。
  • 误区:把提高文件描述符上限当成提高容器内存。改正:按 RLIMIT 与 cgroup 的资源类型分别定位和调整。

作者信息