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

Python015

探讨如何统计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:

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

我的第一次回答似乎没出现。

Ruby可以写游戏。

基本上Ruby可以调用Windows API和DirectX API或者使用.net,在开发能力和开发速度上拥有优势。

著名的RPG制作大师(RPG Maker VX)就是使用Ruby作为核心的(参见RGSS),使用这类引擎做出的游戏保守估计数量超过10万。

国内有人做的(信赖铃音-莫扎特之梦)可以去搜索下

Miyako是一个Ruby游戏开发库,使用了SDL。可以编写跨平台的单机或者网络游戏。

可以去Ruby社区看看。

Python是不错,可是我不喜欢这种要注意空格的程序。IronPython,Jython不成气候。

考虑到游戏的速度因素,ruby,python全完蛋。lua来了,虽然lua实在贫弱

虽然我看着C就头疼,但是我不得不承认:这东西还是开发游戏的主力。

当然也包括他那畸形的兄弟C++(畸形是指过于复杂,外加不是完全的面向对象化。当然lua,python也不完全的面向对象)

估计楼主是看中了Ruby的开发速度和前景才选择Ruby吧。