同事反映一个非常奇怪的现象, supervisor接管应用程序后, 应用程序不能产生core文件。
-
登上服务器上查看,果然存在这样的现象,test进程崩溃后,仅仅在系统日志中存在报错日志,(指令地址信息 ,文件的装载地址信息), 但是没有core文件。sysctl -a | g core_pattern 也设置相应 目录
-
然后手工执行该程序, 可以产生core文件。
现象明显
-
开始检查和对比 接管后的进程中环境变量 和 手工执行程序的环境变量 【具体手法可以借助gdb , 和 查看进程相关的内存文件】
-
具体确实差异, supervisor接管后 core file size 依然是0【不能产生core文件】, 手工执行的时候,进程中的core file size 为ulimited【可以产生core文件】
-
快下班了,要赶紧解决掉这个,原因可以后面再细查, 确定解决问题办法,只需要将当前进程的这个值更改掉即可, 下面是3种办法 :
1.借助gdb 直接修改ulimit的一些参数【不推荐】【内核>2.6】
2.直接修改/proc/xx/limits的参数,echo -n ‘Max open files=unlimited:unlimited’ >/proc/15533/limits 【内核>2.6】
3.借助prlimit工具 【内核>2.6.36】,prlimit –pid 25622 –nofile=10240:10240 -
为了排除环境的变量的原因, 用python写一个类似supervider类似的程序,父进程产生一个进程来执行目标程序,并且放入到crontab中运行, 代码如下:
#!/usr/bin/env python #coding=utf8 from time import sleep import os,signal
def chldhandler(signum,stackframe): while 1: try: result = os.waitpid(-1,os.WNOHANG) except: break print "Reaped child process %d" % result[0] signal.signal(signal.SIGCHLD,chldhandler) signal.signal(signal.SIGCHLD,chldhandler) try: pid = os.fork() if pid == 0: #os.system("/tmp/a.out") os.execv("/tmp/a.out",[]) except OSError, e: pass sleep(30)
-
core文件能够正常产生,排除了一些环境变量的因数,就是supervidoer程序本身了,
-
顺着/usr/bin/supervisord去查看源代码, 不看不知道,看了一下,真是服了,
supervisord有一个set_rlimits函数,专门处理这一块的参数, 但supervisord的set_rlimits只会获取系统环境中
RLIMIT_NOFILE 最大打开文件句柄数
RLIMIT_NOPROC 用户最大的进程数
其他全部走python.resource模块设置的默认值, https://pymotw.com/2/resource/
这一点非常好验证, 直接查看当前系统环境中 max locked memory 和 supervisor进程以及其接管的进程, 明显存在差异
当然core file size 这个参数也是使用python.resource模块设置的默认值
原因基本上确定下, 解决办法可以尝试 第5步 做法,如果内核不支持, 可以使用下面方法 修改 options.py 1293 下面加入以下代码
soft, hard = resource.getrlimit(resource.RLIMIT_CORE)
resource.setrlimit(resource.RLIMIT_CORE, (-1, hard))
vim /usr/lib/python2.6/site-packages/supervisor/options.py if hasattr(resource, 'RLIMIT_NPROC'): limits.append( { 'msg':('The minimum number of available processes required ' 'to run this program is %(min)s as per the "minprocs" ' 'command-line argument or config file setting. ' 'The current environment will only allow you ' 'to open %(hard)s processes. Either raise ' 'the number of usable processes in your ' 'environment (see README.rst) or lower the ' 'minprocs setting in the config file to allow ' 'the program to start.'), 'min':self.minprocs, 'resource':resource.RLIMIT_NPROC, 'name':'RLIMIT_NPROC', }) soft, hard = resource.getrlimit(resource.RLIMIT_CORE) resource.setrlimit(resource.RLIMIT_CORE, (-1, hard))
转载请注明:爱开源 » supervisord 未生成 core 文件