supervisor守护服务遇见的几个坑


近期在ubunt系列服务器上遇见了supervisor的几个坑,所以将服务守护都已经切换到systemd。

坑一、资源限制配额不跟随limits.conf

1.我们在用supervisor守护一个服务A的时候,发现由supervisor拉起的服务文件描述符未跟随系统limits设置。

[program:servicea]
username=root
command = bash /etc/servicea.sh
autostart = true
stopasgroup = true
autorestart = true
startsecs = 3
stdout_logfile = /var/log/servicea.log

cat /proc/$(ps ax|grep servicea|grep -v grep|awk {print $1})/limits |grep open
Max open files            1024                 4096                 files

发现最大的文件描述符还是1024,对于系统初始化优化的时候,我们都会更改/etc/security/limits.conf

root  soft   nofile  65535
root  hard   nofile  65535
root  soft   nproc    65535
root  hard   nproc    65535
* soft   nproc    65535
* hard   nproc    65535
* soft   nofile  65535
* hard   nofile  65535
root@sklinux.com:~# ulimit -SHn
65535

或者比上诉值更大,然而supervisor守护服务,资源限制配额不跟随limits.conf。

坑二、supervisor守护prometheus服务的时候吃掉重要参数

2.我们在用supervisor守护prometheus服务的时候发现,重要参数被“吃”掉。

supervisor中prometeus配置如下:

#为方便查看做了换行处理
[program:prometheus]
username=root
directory=/opt/prometheus/data
command = /opt/prometheus/prometheus 
--config.file=/opt/prometheus/prometheus.yml
--web.listen-address="8.8.8.8:9090" 
--storage.tsdb.path="/opt/prometheus/data/"
--storage.tsdb.retention.time=90d --web.enable-lifecycle 
autostart = flase
stopasgroup = true
autorestart = true
startsecs = 3
stdout_logfile = /var/log/prometheus.log

我们发现每次拉起服务的时候,–storage.tsdb.path="/opt/prometheus/data/“参数未生效,数据始终默认保存在/data下。 然后通过

command = /start.prometheus.sh


start.prometheus.sh 内容:
#为方便查看做了换行处理
/opt/prometheus/prometheus 
--config.file=/opt/prometheus/prometheus.yml
--web.listen-address="8.8.8.8:9090"
--storage.tsdb.path="/opt/prometheus/data/"
--storage.tsdb.retention.time=90d --web.enable-lifecycle

同样,参数无效。但是通过手工执行/start.prometheus.sh 可以将数据存储路径存在目标路径/opt/prometheus/data/中。
后来,我们将上诉服务切换为systemd守护,一切ok了! 比较:

Systemd

a.稳定可靠
b.支持 Before/After 依赖机制 c.支持 Notify 机制
d.支持基于 cgroup 的资源限制

Supervisord

a.支持通过 priority 配置进程启动顺序
b.日志友好方便查阅
c.跨平台使用
d.扩展开发友好,守护业务系统
e.但是bug多,资源限制不足

Devops