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

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

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

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

进程模式:直接获取进程id: Processpid

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:

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

创建目录,copy配置文件

如何安装Redis集群

修改配置文件

按照此方式修改7001~7005的配置文件,注意修改端口号。

如何安装Redis集群

启动各个实例

如何安装Redis集群

创建集群

现在我们已经有了六个正在运行中的 Redis 实例, 接下来我们需要使用这些实例来创建集群, 并为每个节点编写配置文件。

通过使用 Redis 集群命令行工具redis-trib,编写节点配置文件的工作可以非常容易地完成redis-trib位于Redis 源码的src文件夹中,它是一个 Ruby 程序,这个程序通过向实例发送特殊命令来完成创建新集群,检查集群,或者对集群进行重新分片(reshared)等工作。

我们需要执行以下命令来创建集群:

[root@localhost src]# /redis-tribrb create --replicas 1 127001:7000 127001:7001 127001:7002 127001:7003 127001:7004 127001:7005

/usr/bin/env: ruby: No such file or directory

如何安装Redis集群

系统中没有安装ruby,所以报上面的错误。

先安装ruby

[root@localhost yumreposd]# yum install ruby

[root@localhost yumreposd]# yum install rubygems

[root@localhost yumreposd]# gem install redis

Successfully installed redis-322

1 gem installed

Installing ri documentation for redis-322

Installing RDoc documentation for redis-322

如何安装Redis集群

再次创建集群

[root@localhost src]# /redis-tribrb create --replicas 1 127001:7000 127001:7001 127001:7002 127001:7003 127001:7004 127001:7005

Redis自动选择主从

如何安装Redis集群

连接集群

redis-cli 也可以作为集群的客户端工具,要想访问集群,只需连接任意一个redis实例即可。使用-c参数

[root@localhost bin]# /redis-cli -c -p 7000

总结

set 命令写数据,集群将数据写到7001实例上,当你使用get命令获取数据时,客户端即自动切换到7001端口。

redis-cli对集群的支持是非常基本的, 所以它总是依靠 Redis 集群节点来将它转向(redirect)至正确的节点。一个真正的(serious)集群客户端应该做得比这更好: 它应该用缓存记录起哈希槽与节点地址之间的映射(map), 从而直接将命令发送到正确的节点上面。

sidekiq使用redis来保存所有的job和 *** 作数据,所以sidekiq依赖于redis,并且sidekiq默认会去连位于localhost:6379的redis服务器,但是生产环境中可能需要自定义地址

前提:安装并启动redis,不同机器对应的安装方式可自行百度,mac下安装redis可通过

配置sidekiq所依赖的redis位置,必须同时定义sidekiq的server和client

config/initializers/sidekiqrb

如果要使用 UNIX socket,URL 应该类似于 unix://#{Railsroot}/tmp/sockets/redissock

配置config/sidekiqyml文件,一般只有在需要配置高级选项的时候才需要配置这个文件(如果不使用这个名字,可以使用-c指定 sidekiq -c config/nameyml)

文件中会生成如下内容

将耗时的程序写到perform里

注意:perform是一个实例方法,但是在调用的时候是用类调用

adapter默认使用的adapter是Active Job Inline需要指定为sidekiq才支持异步(如果是使用worker这一步可以省略)

另外由于sidekiq的进程并不是非常稳定,可定会自己断掉,所以可以配合监控工具Monit(可以监控任何进程,只需要设定启动和重开的方式即可)使用,详情还请自行百度

gemfile添加sinatra

执行

tips:

之前直接添加 gem 'sinatra' 运行时导致报错,google之后判断可能是由于sinatra gem的版本问题,导致运行时报错,修正后的sinatra gem 的为 gem 'sinatra', '200beta2',require: false

routesrb添加

打开Sidekiq web界面,检查该作业是否被处理,浏览器中输入

(以下纯属翻译)

注:本文讲的是Sidekiq结合ActiveJob使用的方式,也可以单独使用Sidekiq Worker

文章中注释掉的是单独使用Sidekiq Worker创建任务跟使用ActiveJob的不同部分

参考

>

以上就是关于探讨如何统计Ruby应用服务器使用内存方法全部的内容,包括:探讨如何统计Ruby应用服务器使用内存方法、如何安装Redis集群、ruby on rails中sidekiq的使用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9690407.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存