supervisor中的minfds及minprocs参数用途

使用 Supervisor 遇到的一个坑

 

一、前言

 

使用 Supervisor 时遇到了一个问题,为此还撕逼了一下午,先填了再说。

 

二、minfds 及 minprocs 参数在 Supervisor 官方文档中的说明

 

 

  1. minfds
    • 含义:在 supervisord 成功启动前,最小的文件描述符数字必须是可以使用的。setrlimit 参数会试图提高软硬限制来满足 supervisord 进程的 minfds 参数值。如果 supervisord 的运行用户为 root,硬限制会被提高。supervisord 可以自由地使用文件描述符,当无法从系统获取时将进入错误模式,所以它能够指定一个最小值,用于确保它不会在执行过程中用光文件描述符。这个参数在 Solaris 中特别有用,Solaris 默认情况下具有较低的进程文件描述符限制。
    • 默认值:1024
    • 是否必需:否
    • 引入版本:3.0
  2. minprocs
    • 含义:在 supervisord 成功启动前,最小的进程描述符数字必须是可以使用的。setrlimit 参数会试图提高软硬限制来满足 supervisord 进程的 minprocs 参数值。如果 supervisord 的运行用户为 root,硬限制会被提高。当进程描述符超出系统运行的进程描述符时,supervisord 会进入错误模式,因此,在启动 supervisord 时,需要确保有足够的进程描述符可用。
    • 默认值:200
    • 是否必需:否
    • 引入版本:3.0

 

三、个人猜想

 

minfds 配置和 Max open files 有关,minprocs 配置和 max user processes 有关

 

四、深入解析的例子

 

  1. 环境说明
    • Supervisor 版本:3.1.3(epel 源安装)
    • 操作系统版本:CentOS 7.3.1611
  2. 系统 ulimit 配置(红色部分为调整配置)

 

 
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 15060
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 65535
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 65535
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

 

  1. Supervisor 配置参数

 

 
[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10 ; (num of main logfile rotation backups;default 10)
loglevel=info ; (log level;default info; others: debug,warn,trace)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false ; (start in foreground if true;default false)
minfds=1024 ; (min. avail startup file descriptors;default 1024)
minprocs=200 ; (min. avail process descriptors;default 200)

 

  1. Nginx 配置(截取部分)
 
daemon off;
user nobody nobody;
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
worker_rlimit_nofile 65535;

events {
use epoll;
worker_connections 65535;
}

 

  1. Supervisor 的 Nginx 守护配置

 

 
[program:nginx]
command=/usr/local/nginx/sbin/nginx

 

  1. 操作步骤
    • 启动 supervisord:$ systemctl start supervisord
    • 获取 supervisord 及 nginx 的 pid:$ ps aux |grep -E "supervisord|nginx: master" |grep -v grep
    • 用 pstree 来看下更加直观的进程,可以看到 nginx 是 supervisord 的子进程
  2. 查看 limit 限制情况

 

可以看到 nginx 进程的 limit 和其父进程 supervisord 是一致的(Max Processes 及 Max open files),但与系统的 ulimit 限制不一致,说明其不受系统 ulimit 限制所影响。

 

五、验证猜想

 

为了验证猜想,将 supervisord 中的 minfds 和 minprocs 参数值都改为 50000
 
[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10 ; (num of main logfile rotation backups;default 10)
loglevel=info ; (log level;default info; others: debug,warn,trace)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false ; (start in foreground if true;default false)
minfds=50000 ; (min. avail startup file descriptors;default 1024)
minprocs=50000 ; (min. avail process descriptors;default 200)

 

修改完成后重启 supervisord:$ systemctl restart supervisord

 

重新获取 supervisord 及 nginx 的 pid,再来看下 supervisord 及 nginx 进程的 limit 限制情况。此时 nginx 进程的 limit 和其父进程 supervisord 仍然是一致的(Max Processes 及 Max open files),但是其数值全变为 50000。

 

六、结论

 

这个例子很好得说明了我的猜想是正确的,supervisord中参数minfds和minprocs决定了supervisord进程及其守护的子进程的Max Processes及Max open files,并且这个limit限制不受系统ulimit所影响。
经过测试验证,supervisord守护的子进程无法在supervisord配置文件中单独修改minfds和minprocs这两个参数。下面红色部分的配置是无效的
[program:nginx]
command=/usr/local/nginx/sbin/nginx
minfds=65535
minprocs=65535

需要在[supervisord]后面加上配置参数
[supervisord]
minfds=81920
minprocs=81920


posted @ 2023-03-29 16:25  好名字可以让你的朋友更容易记住你  阅读(73)  评论(0编辑  收藏  举报