最新消息:

supervisord 未生成 core 文件

core admin 5浏览

同事反映一个非常奇怪的现象, supervisor接管应用程序后, 应用程序不能产生core文件。

  1. 登上服务器上查看,果然存在这样的现象,test进程崩溃后,仅仅在系统日志中存在报错日志,(指令地址信息 ,文件的装载地址信息), 但是没有core文件。sysctl -a | g core_pattern 也设置相应 目录
  2. 然后手工执行该程序, 可以产生core文件。

现象明显

  1. 开始检查和对比 接管后的进程中环境变量 和 手工执行程序的环境变量 【具体手法可以借助gdb , 和 查看进程相关的内存文件】
  2. 具体确实差异, supervisor接管后 core file size 依然是0【不能产生core文件】, 手工执行的时候,进程中的core file size 为ulimited【可以产生core文件】
  3. 快下班了,要赶紧解决掉这个,原因可以后面再细查, 确定解决问题办法,只需要将当前进程的这个值更改掉即可, 下面是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
  4. 为了排除环境的变量的原因, 用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)

  1. core文件能够正常产生,排除了一些环境变量的因数,就是supervidoer程序本身了,
  2. 顺着/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 文件

转载请注明:爱开源 » supervisord 未生成 core 文件