使用在 ubuntu 上运行的 rails/unicorn 进行内存调整

使用在 ubuntu 上运行的 rails/unicorn 进行内存调整

我在 Ubuntu 11、Rails 3.0 和 Ruby 1.8.7 上运行 unicorn。

这是一台 8 核 ec2 机器,我运行着 15 个工作器。CPU 似乎从未被卡住,而且我似乎能很好地处理请求。

我的问题涉及内存使用情况,以及我应该对所看到的内容有什么关注。(如果有的话)

场景如下:

在恒定负载下(大约每秒 15 个来自 nginx 的请求),在一小时内,3 个服务器集群中的每台服务器每小时损失约 100MB。这是一个大约 6 小时的线性斜率,然后它似乎趋于平稳,但仍然可能看起来每小时损失约 10MB。

如果我使用 linux 命令 echo 1 > /proc/sys/vm/drop_caches 删除页面缓存,可用的空闲内存就会回升到我启动独角兽时的水平,并且内存丢失模式会在几个小时内再次开始。

前:

             已使用的、可用的、缓存的共享缓冲区总数
内存:7130244 5005376 2124868 0 113628 422856
-/+ 缓冲区/缓存:4468892 2661352
交换:33554428 0 33554428

后:

             已使用的、可用的、缓存的共享缓冲区总数
内存:7130244 4467144 2663100 0 228 11172
-/+ 缓冲区/缓存:4455744 2674500
交换:33554428 0 33554428

我的 Ruby 代码确实使用了记忆功能,并且我假设 Ruby/Rails/Unicorn 保留了它自己的缓存……我想知道我是否应该担心这种行为?

FWIW,我的 Unicorn 配置:

worker_processes 15

听“#{CAPISTRANO_ROOT}/shared/pids/unicorn_socket”,:backlog => 1024
监听 8080,:tcp_nopush => true
超时 180

pid“#{CAPISTRANO_ROOT}/shared/pids/unicorn.pid”

GC.respond_to?(:copy_on_write_friendly=) 和 GC.copy_on_write_friendly = true

before_fork 执行 |服务器,工作者|
  STDERR.puts“XXXXXXXXXXXXXXXXXXX FORK之前”
  打印 gemfile 的位置

  定义?(ActiveRecord::Base)和ActiveRecord::Base.connection.disconnect!
  定义?(Resque)和Resque.redis.client.disconnect

  old_pid =“#{CAPISTRANO_ROOT}/shared/pids/unicorn.pid.oldbin”
  如果 File.exists?(old_pid) && server.pid != old_pid
    开始
      Process.kill("退出", File.read(old_pid).to_i)
    救援 Errno::ENOENT、Errno::ESRCH
      # 已被杀死
    结尾
  结尾

  文件.打开(“#{CAPISTRANO_ROOT}/shared/pids/unicorn.pid.ok”,“w”){|f| f.打印($$.to_s)}

结尾

after_fork 执行 |服务器,工作者|
  定义?(ActiveRecord::Base)和ActiveRecord::Base.establish_connection
  定义?(Resque)和Resque.redis.client.connect
结尾

是否需要尝试使用 OobGC 来执行更严格的垃圾收集?http://unicorn.bogomips.org/Unicorn/OobGC.html)?或者这只是正常行为,当系统需要更多内存时,它会自行清空缓存,而无需我手动运行该缓存命令?基本上,这是正常的、预期的行为吗?

蒂亚

答案1

这是重要的一行(特别是最后一列):

-/+ buffers/cache: 4468892 2661352

您会注意到,当您删除缓存时,这个数字实际上并没有改变。

当正在运行的应用程序需要更多内存时,操作系统将处理释放缓冲区。对于您正在做的事情,尝试非常谨慎地处理操作系统处理内存的方式是没有成效的,特别是考虑到您似乎有足够的内存。

相关内容