探讨如何统计Ruby应用服务器使用内存方法

Python09

探讨如何统计Ruby应用服务器使用内存方法,第1张

最近在解决探针获取Ruby应用服务器内存使用的情况,将解决的思路总结一下,希望对此感兴趣的伙伴一起探讨。

先对比应用服务器: Puma 和 Passenger ,下面对比这2个服务器内存统计,

进程模式:直接获取进程id: Process.pid

cluster模式:以启动2个worker进程为例:

从上面截图可以看到,Puma启动后会出现3个进程:1个master进程和2个worker进程。

内存的使用情况(见 RSS 列):

而对于探针来说,一个探针实例是伴随进程一起启动的,也就说一个探针只能识别自己所在的进程id,那如何获取应用服务器使用的内存?我们用其中1个woker进程所在的进程组[ PGID ]看一下:(为啥不是父进程?, 见下文Passenger)

这3个进程都在相同的进程组里,而且进程组号为master的进程id,那我们就可以用这个信息获取应用服务器的所使用的内存:

4.累加进程组内进程内存和即为应用服务器使用内存:

启动Passenger后的Process信息:

对Passenger架构感兴趣的请移步到 这儿 .

查看一下worker所在进程组和父进程:

通过PPID可以看出

Passenger core —>Passenger AppPreloader —>Passenger RubyApp

三者为爷-父-子关系,当服务器请求量增大时 AppPreloader 会产生新的进程来响应请求,从而新的 RubyApp 进程的 PPID 即为 AppPreloader 的 PID ,这样看来就可以将同一个 PPID 的进程加起来得到应用服务器的内存?

由于Passenger会根据服务器的负载量动态调整进程数,当服务器请求量较小时,Passenger会kill多余的进程,会出现下面的情况:

AppPreloader 也被Passenger杀掉了。原 RubyApp 进程的 PPID 变成了1。这时如果服务器的请求量增大,应用服务器进程会成为这样:

Passenger core 产生新的 AppPreloader 进程,并且 AppPreloader 产生新的 RubyApp 进程,这时如果只用 PPID 统计应用服务器内存就会不准确,所以要统计Passenger的使用的内存还得通过累加在同一个进程组( PGID )的所有进程使用的内存和得到。

由于 Unicorn 和 Rainbows 都与Puma的cluster模式[master+worker模式]类似,内存统计的方式可以参考上文的Puma。

由于 Thin 启动多个server后没有类似的特点,上面方法不适用于Thin,有好方法的伙伴们可以告知:smile:

在解决探针统计应用服务器的内存问题上,摸索出了上面的一条路子,如果小伙伴们有其他更好的方式,可以一起探讨一下。

Java:面向对象,开源,不说跨平台了哈,恶心;不直接支持硬件级别的处理等。C/CPP:C面向过程,CPP面向对象(部分比较怪异),分裂比较严重,支持硬件级别的处理。ptyhon:动态解释型,开发效率高,开源,灵活,入门低。上面只是简单的说了下一些比较明显的特点。你问哪门语言更强大,我不知道,都很强大吧,嵌入式C/CPP用的比较多,虽说java也掺和过,但貌似J2ME半死不活的。J2SE(现在改名javaSE)也没多大前景,无论UI还是性能比不上C#,CPP,论开发效率,也就那么回事吧。但j2ee在B/S领域比较强大(不是说网站哈),百万级别的大部分java写的。python也很有优势,在快速建模和web方面。大项目我还真没见过几个,ruby到见的不少。学哪个更有前途,这么说吧,你就是把所有语言都学了,也就那么回事。重要的是是否善于思考,爱好学习,将学会的东西应用到实际的业务场景中去。实际工作中编程可不是声明几个变量,排排序,冒冒泡,打印打印字符。学习语言只是个开始,祝你好用!附:java,C/C++随便挑吧,python相对入门比较简单。