Ruby語(yǔ)言傍邊最為常見的就是內(nèi)存利用問(wèn)題,這一點(diǎn)在其它基于JVM的語(yǔ)言中亦頗為普遍(是的,Java,說(shuō)的就是你)。事實(shí)上,,Ruby的垃圾接納(簡(jiǎn)稱GC)機(jī)制與Java很是靠近。假如利用不妥,其會(huì)帶來(lái)龐大的貧苦(正如下圖所示)。在這類環(huán)境下,GC會(huì)遏制運(yùn)作,同時(shí)耗損處事器的整體CPU資源,甚至導(dǎo)致處事器重啟。
Unicorn與Ruby內(nèi)存泄露導(dǎo)致處事器宕機(jī)。
如何辦理?
一、按期重啟您的Ruby
假如各人利用的是高人氣Unicorn Web處事器,那么內(nèi)存問(wèn)題大概會(huì)越發(fā)嚴(yán)重——這是因?yàn)閁nicorn回收f(shuō)ork機(jī)制。在fork進(jìn)程中,其會(huì)對(duì)全部父內(nèi)存內(nèi)容舉辦復(fù)制(簡(jiǎn)稱CoW)。因此,各人大概需要利用“Unicorn Worker Killer” gem以監(jiān)控處事器并在內(nèi)存到達(dá)新高點(diǎn)可能請(qǐng)求數(shù)量增加至必然程度時(shí)舉辦重啟。由于該gem支持隨機(jī)化,因此處事器自己很大概并不會(huì)受到影響。
二、安裝此 killer:
三、調(diào)解內(nèi)存
假如各人利用的是Ruby 2.X版本,則可通過(guò)設(shè)置Unicorn更好地利用CoW機(jī)制。config/unicorn.rb
1)worker_processes: 1x 計(jì)較焦點(diǎn)
2)timeout: 事情請(qǐng)求超時(shí),應(yīng)設(shè)定在15到30秒?yún)^(qū)間
3)preload_app: 啟用CoW,但要求在fork上打點(diǎn)毗連/斷開
四、當(dāng)真思量GC設(shè)置
總結(jié):動(dòng)態(tài)語(yǔ)言存在著必然短板,然而正確的設(shè)計(jì)卻能輔佐其始終在線且順暢運(yùn)行。