一、 supervisor 自启动问题
1.1 Supervisor自启动导致无法使用环境变量
编写systemd文件,使用systemd启动。 在supervisord.conf配置文件中使用/etc/profile中的环境变量则无法正常启动。
如进程启动命令为 command = %(ENV_JDK_PATH)s %(ENV_SMALL_JVM_MEMORY)s -jar %(ENV_ONESRM_PATH)s/libs/%(program_name)s-%(ENV_PROGRAM_VERSION)s.jar %(ENV_RUN_PARAM)s
其中JDK_PATH等变量为/etc/profile中的环境变量。若使用systemd开机自启,无法载入环境变量,supervisor启动报错。
解决方式: 使用/etc/init.d/after.local文件自启,在文件中首先source /etc/profile,然后使用命令启动supervisor,即可开机自启并载入环境变量。
1.2 Supervisor管理java出现OOM问题( 非CentOS7系统 )
supervisor管理java进程, 启动报错:java.lang.OutOfMemoryError: unable to create new native thread
如果不设置supervisor开机自启,开机后手动使用命令启动supervisor,再启动java,所有java进程都可稳定运行,只有supervisor开机自启时,java进程才会出现OOM的问题。
对比手动启动与开机自启supervisor两个进程有什么区别,发现只有Control Group不一样,手动启动为user.slice,开机自启为system.slice。
开机自启supervisor的控制组/system.slice/after-local.service的最大任务数被限制为512个,
使用systemd-cgtop监控java进程启动时的task情况,发现java进程启动到7-9个时,task数量刚好到512个,一旦超过512个task,整个java进程都会被强行停止,并且重启,反复重启无法启动时,java进程便会报OOM的异常。
因为开机自启的进程较多,/system.slice/after-local.service控制组除java进程外的task数量较多,
而手动启动supervisor时,/user.slice/user-0.slice除java进程外的task数量少,所以即使java全部启动,也达不到/user.slice/user-0.slice的512task限制,所以手动启动supervisor无OOM的问题。
task数量为512限制可在文件/sys/fs/cgroup/pids/system.slice/after-local.service/pids.max中查看,
将 DefaultTasksMax=2048 添加至/etc/systemd/system.conf文件,可永久修改cgroup最大task限制。
修改为2048后,supervisor开机自启,启动java进程再无OOM问题,至此问题解决。