ulimit -u 对 _uab 进程无效,因其通常由 systemd/supervisord/容器启动而绕过 shell 限制;需在对应服务配置中设置 LimitNPROC(systemd)、TasksMax 或容器 --ulimit 参数,并确保启动前生效。
为什么 ulimit -u 对 _uab 进程没生效?
因为 _uab(通常指用户态代理服务,如基于 go 或 node.js 的轻量网关)多数不继承父 shell 的 ulimit 设置——它往往由 systemd、supervisord 或容器 runtime 拉起,绕过了登录 shell 的限制链。
实操建议:
- 确认启动方式:
ps -o comm,pid,ppid -p $(pgrep -f _uab)看父进程是systemd、bash还是docker-init - 若由 systemd 管理,直接改
/etc/systemd/system/_uab.service中的LimitNOFILE=65536和TasksMax=infinity(注意:LimitNPROC控制线程/进程数,对应ulimit -u) - 避免在
/etc/security/limits.conf里配* soft nproc—— 容器或非 login shell 场景下基本不读这个文件
ulimit -n 调高后,_uab 仍报 too many open files
根本原因不是没调,而是调得“太晚”:如果 _uab 启动时已打开大量文件(比如加载配置、扫描插件目录),而此时 ulimit -n 还是默认值(常为 1024),后续再改也无济于事。
实操建议:
- 必须在
_uab进程启动前设置好:systemd配置中加LimitNOFILE=65536,而非在ExecStartPre里跑ulimit -n 65536 - 验证是否生效:
cat /proc/$(pgrep _uab)/limits | grep "Max open files",看Soft Limit是否匹配预期 - Go 写的
_uab可能受GOMAXPROCS和net.Conn复用影响,单连接开销小,但短连接风暴下仍会快速耗尽句柄 —— 此时需配合连接池或 keepalive 调优
Linux 6.1+ 系统里 TasksMax 和 PIDs cgroup v2 的冲突
新内核默认启用 cgroup v2,而 systemd 的 TasksMax 实际写入的是 pids.max,但若 _uab 被划进某个 slice(如 system.slice),其上级 cgroup 可能设了更严的 pids.max,导致子进程被 kill。
实操建议:
- 查当前限制:
cat /sys/fs/cgroup/system.slice/_uab.service/pids.max,若为max则没问题;若为小数值(如 512),说明被上级压制 - 解除压制:在
_uab.service中显式指定Slice=(留空)或新建专用 slice,避免继承 system.slice 的限制 - 临时调试可用:
sudo systemctl set-property _uab.service TasksMax=8192,但该命令只写 runtime,重启后失效
容器中运行 _uab 时 ulimit 的真实控制点
Docker/Kubernetes 不认宿主机的 /etc/security/limits.conf,也不自动继承 docker run 命令里的 --ulimit 给所有子进程 —— 特别是当 _uab 用 exec 方式拉起子进程时,子进程可能回落到容器默认的 rlimit(通常是 1048576 句柄但仅 1024 进程)。
实操建议:
- Docker 启动时显式传:
docker run --ulimit nofile=65536:65536 --ulimit nproc=8192:8192 ... - Kubernetes 中,在
container.securityContext下加resources.limits不管用,必须用securityContext.sysctls或容器 runtime 配置(如 containerd 的default_runtime_config) - 最稳方案:在容器启动脚本第一行执行
ulimit -n 65536 && ulimit -u 8192,并确保_uab是该 shell 的直接子进程(不用nohup或后台 &)
真正麻烦的不是调数字,而是搞清限制从哪来、被谁覆盖、何时生效。一个 _uab 进程可能同时受 shell ulimit、systemd unit、cgroup v2、容器 runtime、甚至 Go runtime 的 runtime.LockOSThread 影响 —— 查的时候得一层层 cat /proc/$PID/limits 和 cat /sys/fs/cgroup/.../pids.max 对着看。

















