模块简介

新人接触线上的时候一般都会碰到supervise这个工具,导师对这个模块的解释一般就是,这个模块是监控进程,当进程挂掉之后,supervise会将进程启动。这样当进程出

现问题,如因出core而导致进程down掉的时候,supervise会马上将进程起起来,从而快速恢复服务。

新人一般就会记住这一点,然后就一直没有去深入理解,supervise具体是怎么做的这一点的,以及从supervise我们能获得什么信息。

实际上supervise是开源工具集daemontools( http://cr.yp.to/daemontools.html )其中的一个工具,公司将这个工具单独从daemontools剥离,

并且根据公司的需求更改了源代码,这个工作是逢春同学负责

模块工具原理

模块的工作原理实际上很简单,supervise启动的时候fork一个子进程,子进程执行execvp系统调用,将自己替换成执行的模块,

模块变成supervise的子进程在运行,而supervise则死循环运行,并通过waitpid或者wait3系统调用选择非阻塞的方式去侦听子进程的运行情况,

当然同时也会读取pipe文件svcontrol的命令,然后根据命令去执行不同的动作,

如果子进程因某种原因导致退出,则supervise通过waitpid或者wait3获知,并继续启动模块,如果模块异常导致无法启动,则会使supervise陷入死循环,不断的启动模块

原理总结下来就是导师给新人所介绍的那样。

supervise使用的文件,以及我们可以利用的

supervise要求在当前目录下有status目录,同时status目录下面会有通过supervise启动的模块名的目录,而该目录下会有三个文件,分别为lock status svcontrol,对应的功能和我们可以从中获取的信息如下

  • lock

    • 作用:supervise的文件锁,通过该文件锁去控制并发,防止同一个status目录下启动多个进程,造成混乱
    • 可以利用的信息:可以通过/sbin/fuser这个命令去获取lock文件的使用信息,如果fuser返回值为0,表示supervise已经启动,同时fuser返回了supervise的进程pid
  • status

    • 作用:这个文件是supervise用来记录一些信息之用,可以简单的理解为 char status[20],其中status[16]记录了supervise所启动的子进程的pid,status[17]-status[19] 是子进程pid别右移8位,没搞懂为什么supervise要这么做,而status[0]-status[11] 没有用,status[12]-status[14] 是标志位,一般没啥用,status[15] 直接为0
    • 可以利用的信息:可以直接通过od命令去读取该文件,一般有用的就是od -An -j16 -N2 -tu2 status可以直接拿到 supervise所负责的子进程的pid
  • svcontrol

    • 作用:可以理解为一个控制接口,supervise读取这个管道的信息,进而根据管道的信息去控制子进程,而通过控制子进程的方式实际上就是给子进程发信号,因此实际上跟自己通过kill命令给supervise所在的子进程发信号从功能上没有本质的区别,但是通过控制接口的方式的话,准确性会非常的高
    • 可以利用的信息:直接写命令到该文件中,如echo 'd' > svcontorl, 让supervise去控制子进程,比较常用的命令如下
      • d: 停掉子进程,并且不启动
      • u: 相对于d,启动子进程
      • k: 发送一个kill信号,因kill之后supervise马上又重启,因此可以认为是一个重启的动作
      • x: 标志supervise退出

对于以上三个文件,从中获取的信息的用处,我认为主要在优化模块的控制脚本上面,

现有的控制模块起停脚本一般都是通过grep命令去获取对应的进程的pid,然后发送信号给对应的pid,

这种方式是从外部方式获取信息,在准确性上面会差一点,可能会造成误杀,而如果通过status目录的三个文件去获取模块的信息,

并且通过svcontrol控制接口去控制,这种方式是从内部方式去获取模块运行的一些信息,能够保证准确性

space现在部分模块的起停脚本已经更改过,但是没有全面推广,因现在推广的需求不强烈,因此推广也没有排期

transmit和memcached使用supervise的问题

OP同学会发现,使用supervise去启动transmit的时候,然后通过pstree space(或者其他工作帐号)去观察进程的时候,会发现进程打印的不规范,如下

supervise.trans---supervise.trans

transmit---2*[transmit]

具体原因是这样子的,supervise通过waitpid或者wait3去侦擦子进程的情况,但是由于transmit这个模块在内部逻辑里面要求自己形成守护进程,

进而脱离了supervise这个父进程,成为init的子进程,此时waitpid或者wait3返回的不是预期的,supervise就认为子进程异常

从而进入了启动transmit的阶段,去重启启动一个transmit,但是新启动的transmit因为端口已经被占用,因此无法启动

自己进程退出,supervise又认为子进程异常,从而陷入死循环,不断的重启transmit,因此通过pstree 去看就形成那种格式

因为此时transmit和superivse.transmit已经不是父子关系了。当然需要提一下的是,supervise在死循环重启子进程的时候,

每次重启前都会sleep 一段时间,因此可以认为几乎不耗机器的资源

memcached如果使用了-d选项,也会出现如上的问题,-d选项为memcached自己形成守护进程,

因此现在space的memcached一般都把-d选项关闭,理论上只要形成守护进程的程序,使用supervise去启动的时候都会有这个问题

这个跟rd有很大的关系,个人建议rd写程序的时候不要自己去把程序写成守护进程,没啥意义

[转载] 深入 superviser的更多相关文章

  1. Crystal Clear Applied: The Seven Properties of Running an Agile Project (转载)

    作者Alistair Cockburn, Crystal Clear的7个成功要素,写得挺好. 敏捷方法的关注点,大家可以参考,太激动所以转载了. 原文:http://www.informit.com ...

  2. RTP与RTCP协议介绍(转载)

    RTSP发起/终结流媒体.RTP传输流媒体数据 .RTCP对RTP进行控制,同步.RTP中没有连接的概念,本身并不能为按序传输数据包提供可靠的保证,也不提供流量控制和拥塞控制,这些都由RTCP来负责完 ...

  3. 《Walking the callstack(转载)》

    本文转载自:https://www.codeproject.com/articles/11132/walking-the-callstack Download demo project with so ...

  4. [转载]MVVM模式原理分析及实践

    没有找到很好的MVVM模式介绍文章,简单找了一篇,分享一下.MVVM实现了UI\UE设计师(Expression Blend 4设计界面)和软件工程师的合理分工,在SilverLight.WPF.Wi ...

  5. [转载]:STM32为什么必须先配置时钟再配置GPIO

    转载来源 :http://blog.csdn.net/fushiqianxun/article/details/7926442 [原创]:我来添两句,就是很多同学(包括我)之前搞低端单片机,到了stm ...

  6. [转载]从MyEclipse到IntelliJ IDEA-让你摆脱鼠标,全键盘操作

    从MyEclipse转战到IntelliJ IDEA的经历 注转载址:http://blog.csdn.net/luoweifu/article/details/13985835 我一个朋友写了一篇“ ...

  7. TCP同步与异步,长连接与短连接【转载】

    原文地址:TCP同步与异步,长连接与短连接作者:1984346023 [转载说明:http://zjj1211.blog.51cto.com/1812544/373896   这是今天看到的一篇讲到T ...

  8. 在CentOS 7/6.5/6.4 中安装Java JDK 8(转载)

    转载在CentOS 7/6.5/6.4 中安装Java JDK 8 首先,在你的服务器上运行一下更新. yum update 然后,在您的系统上搜索,任何版本的已安装的JDK组件. rpm -qa | ...

  9. 用C#实现MD5的加密(转载)

    方法一 首先,先简单介绍一下MD5 MD5的全称是message-digest algorithm 5(信息-摘要算法,在90年代初由mit laboratory for computer scien ...

随机推荐

  1. run loop 输入源

    做了一年多的IOS开发,对IOS和Objective-C深层次的了解还十分有限,大多还停留在会用API的级别,这是件挺可悲的事情.想学好一门语言还是需要深层次的了解它,这样才能在使用的时候得心应手,出 ...

  2. java.lang.VerifyError异常

    以前遇到过java.lang.VerifyError 原因是jar包冲突 tomcat6自带jsp.jar.servlet.jar所以项目中不用引入 tomcat5不带jsp.jar.servlet. ...

  3. sprint2(第七天)

    因为GitHub有时候我们更新不上,然后浪费很多时间,所以我们决定几天上传一次,而且有时候我们的功能在做,不一定一天能做完,所以几天做完一个模块再一起上传比较好.昨天的燃尽图有点错,有个功能做了没有把 ...

  4. c#委托之最大

    public delegate int ceshi(object o1, object o2); static void Main(string[] args) { string[] a = { &q ...

  5. 数据库连接池(DBCP:为数据统一建立一个缓冲池,现在企业开发使用)

    数据库连接池:(里面放了许多连接数据的链接,负责分配,管理,释放数据库连接,可重复使用连接,而不新建  )为数据统一连接建立一个缓冲池,放好了一定数据库连接,使用时在缓冲池里面拿,用完之后再还给缓冲池 ...

  6. 为Apache配置虚拟机Virtual Host

    配置虚拟机最少需要修改两个文件,即httpd-vhosts.conf 和 hosts (记住修改任何配置前先备份哦,这才是个好习惯) 第一步,修改httpd-vhosts.conf文件, 文件路径 \ ...

  7. hdu Interesting Fibonacci

    Interesting Fibonacci Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  8. 2016年11月12日 星期六 --出埃及记 Exodus 20:3

    2016年11月12日 星期六 --出埃及记 Exodus 20:3 "You shall have no other gods before me.除了我以外,你不可有别的 神.

  9. 详细Java中的内存泄漏

    1.Java内存回收机制 不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址.Java中对象是采用new或者反射的方法创建的,这些对象的创建都是在堆(Hea ...

  10. C++ 去掉字符串首尾的 \x20 \r \n 字符

    转载:http://www.sharejs.com/codes/cpp/5780 /* 去掉字符串首尾的 \x20 \r \n 字符 by sincoder */ void clean_string( ...