Ruby已死——必須關(guān)注的內(nèi)存問題
譯文在今天的文章中,我們將探討如何解決Ruby當(dāng)中常見的內(nèi)存使用問題。
Ruby語言當(dāng)中最為常見的就是內(nèi)存使用問題,這一點(diǎn)在其它基于JVM的語言中亦頗為普遍(是的,Java,說的就是你)。事實(shí)上,Ruby的垃圾回收(簡(jiǎn)稱GC)機(jī)制與Java非常接近。如果使用不當(dāng),其會(huì)帶來巨大的麻煩(正如下圖所示)。在這類情況下,GC會(huì)停止運(yùn)作,同時(shí)消耗服務(wù)器的整體CPU資源,甚至導(dǎo)致服務(wù)器重啟。
Unicorn與Ruby內(nèi)存泄露導(dǎo)致服務(wù)器宕機(jī)。
如何解決?
一、定期重啟您的Ruby
如果大家使用的是高人氣Unicorn Web服務(wù)器,那么內(nèi)存問題可能會(huì)更加嚴(yán)重——這是因?yàn)閁nicorn采用fork機(jī)制。在fork過程中,其會(huì)對(duì)全部父內(nèi)存內(nèi)容進(jìn)行復(fù)制(簡(jiǎn)稱CoW)。因此,大家可能需要使用“Unicorn Worker Killer” gem以監(jiān)控服務(wù)器并在內(nèi)存達(dá)到新高點(diǎn)或者請(qǐng)求數(shù)量增加至一定水平時(shí)進(jìn)行重啟。由于該gem支持隨機(jī)化,因此服務(wù)器本身很可能并不會(huì)受到影響。
二、安裝此 killer:
三、調(diào)整內(nèi)存
如果大家使用的是Ruby 2.X版本,則可通過配置Unicorn更好地使用CoW機(jī)制。
config/unicorn.rb
1)worker_processes: 1x 計(jì)算核心
2)timeout: 工作請(qǐng)求超時(shí),應(yīng)設(shè)定在15到30秒?yún)^(qū)間
3)preload_app: 啟用CoW,但要求在fork上管理連接/斷開
四)認(rèn)真考慮GC配置
總結(jié):動(dòng)態(tài)語言存在著一定短板,然而正確的設(shè)計(jì)卻能幫助其始終在線且順暢運(yùn)行。