Ruby已死——必须关注的内存问题
在今天的文章中,我們將探討如何解決Ruby當(dāng)中常見(jiàn)的內(nèi)存使用問(wèn)題。
Ruby語(yǔ)言當(dāng)中最為常見(jiàn)的就是內(nèi)存使用問(wèn)題,這一點(diǎn)在其它基于JVM的語(yǔ)言中亦頗為普遍(是的,Java,說(shuō)的就是你)。事實(shí)上,Ruby的垃圾回收(簡(jiǎn)稱GC)機(jī)制與Java非常接近。如果使用不當(dāng),其會(huì)帶來(lái)巨大的麻煩(正如下圖所示)。在這類情況下,GC會(huì)停止運(yùn)作,同時(shí)消耗服務(wù)器的整體CPU資源,甚至導(dǎo)致服務(wù)器重啟。
Unicorn與Ruby內(nèi)存泄露導(dǎo)致服務(wù)器宕機(jī)。
如何解決?
一、定期重啟您的Ruby
如果大家使用的是高人氣Unicorn Web服務(wù)器,那么內(nèi)存問(wèn)題可能會(huì)更加嚴(yán)重——這是因?yàn)閁nicorn采用fork機(jī)制。在fork過(guò)程中,其會(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版本,則可通過(guò)配置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上管理連接/斷開(kāi)
四)認(rèn)真考慮GC配置
總結(jié):動(dòng)態(tài)語(yǔ)言存在著一定短板,然而正確的設(shè)計(jì)卻能幫助其始終在線且順暢運(yùn)行。
本文作者:核子可樂(lè)
來(lái)源:51CTO
總結(jié)
以上是生活随笔為你收集整理的Ruby已死——必须关注的内存问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 9.12測试(四)——測试笔
- 下一篇: OpenStack Ocata版本国内代