Linux

使用在 ubuntu 上執行的 rails/unicorn 進行記憶體調整

  • April 10, 2012

我在 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 程式碼確實使用了 memoizations,我假設 Ruby/Rails/Unicorn 保留了自己的記憶體……我想知道我應該擔心這種行為嗎?

FWIW,我的獨角獸配置:

工人程序 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 BEFORE FORK"
print_gemfile_location

定義?(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("QUIT", File.read(old_pid).to_i)
拯救 Errno::ENOENT, Errno::ESRCH
# 已經殺了
結尾
結尾

File.open("#{CAPISTRANO_ROOT}/shared/pids/unicorn.pid.ok", "w"){|f| f.print($$.to_s)}

結尾

after_fork 做 |伺服器,工人|
定義?(ActiveRecord::Base) 和 ActiveRecord::Base.establish_connection
定義?(Resque)和Resque.redis.client.connect
結尾

是否需要嘗試使用 OobGC ( http://unicorn.bogomips.org/Unicorn/OobGC.html ) 執行更嚴格的垃圾收集?或者這只是正常行為,當系統需要更多記憶體時,它會自行清空記憶體,而無需我手動執行該記憶體命令?基本上,這是正常的預期行為嗎?

蒂亞

這是重要的行(特別是最後一列):

-/+ buffers/cache: 4468892 2661352

您會注意到,當您刪除記憶體時,這個數字並沒有真正改變。

當正在執行的應用程序需要更多記憶體時,作業系統將處理釋放緩衝區。對於您正在做的事情,嘗試對作業系統如何處理其記憶體非常挑剔是沒有效率的,特別是考慮到您似乎有足夠的記憶體。

引用自:https://serverfault.com/questions/378192