近期在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多,资源限制不足