redis持久化過(guò)程一直是影響redis性能的常見(jiàn)因素,如何監(jiān)控持久化以及如何優(yōu)化持久化過(guò)程呢?下面我們就一起來(lái)看看吧。
創(chuàng)新互聯(lián)是一家專注于網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)與策劃設(shè)計(jì),南譙網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:南譙等地區(qū)。南譙做網(wǎng)站價(jià)格咨詢:18980820575
fork的監(jiān)控及優(yōu)化
不管是使用哪種持久化,RDB持久化或AOF重寫(xiě),主進(jìn)程都會(huì)fork出一個(gè)子進(jìn)程,在子進(jìn)程里完成rdb文件的生成或aof的重寫(xiě)。fork操作對(duì)于操作系統(tǒng)來(lái)說(shuō)屬于比較重的操作。fork階段,redis會(huì)阻塞一段時(shí)間。阻塞時(shí)間和redis數(shù)據(jù)占用的內(nèi)存大小成正比關(guān)系,每1G內(nèi)存fork耗時(shí)在20毫秒。
如想知道fork階段的阻塞時(shí)間,可以使用info stats命令,查看latest_fork_usec選項(xiàng)的值,單位是微秒。記住是微秒,不是毫秒。
# redis-cli info stats | grep latest latest_fork_usec:323
優(yōu)化fork的方法:
控制redis占用的內(nèi)存大小。若占用內(nèi)存過(guò)大的話,可以將應(yīng)用拆分開(kāi),在多個(gè)服務(wù)器上部署,分?jǐn)俽edis的內(nèi)存占用。
適當(dāng)降低fork的操作頻率。
內(nèi)存的監(jiān)控
RDB持久化的日志如下:
…… 21692:C 15 May 2020 14:17:06.935 * DB saved on disk 21692:C 15 May 2020 14:17:06.936 * RDB: 2 MB of memory used by copy-on-write ……
可以看到RDB持久化過(guò)程消耗了2M內(nèi)存。
AOF持久化日志如下:
…… 15786:C 23 May 2020 07:39:59.145 * AOF rewrite: 2MB of memory used by copy-on-write 10679:M 23 May 2020 07:39:59.201 * Background AOF rewrite terminated with success 10679:M 23 May 2020 07:39:59.201 * Residual parent diff successfully flushed to the rewritten AOF (0.02 MB) 10679:M 23 May 2020 07:39:59.201 * Background AOF rewrite finished successfully
可以看到,aof重寫(xiě)占用的內(nèi)存為2MB+0.02MB=2.02MB
如想監(jiān)控持久化過(guò)程中內(nèi)存占用情況,可以編寫(xiě)shell腳本,統(tǒng)計(jì)出redis日志里相關(guān)信息。
硬盤(pán)的監(jiān)控
Redis持久化過(guò)程會(huì)對(duì)硬盤(pán)造成壓力,因?yàn)槌志没?,?nèi)存的數(shù)據(jù)會(huì)保存到硬盤(pán)中。
linux系統(tǒng)監(jiān)控硬盤(pán)的命令有sar、iostat等,如發(fā)現(xiàn)硬盤(pán)io壓力超過(guò)閥值,再根據(jù)redis的日志對(duì)比下持久化的時(shí)間,看看是不是由于redis持久化造成的壓力。
優(yōu)化方法這里提兩點(diǎn):
使用性能好的磁盤(pán),機(jī)械硬盤(pán)肯定比不了固態(tài)硬盤(pán)。
如果是單機(jī)上配置了好幾個(gè)redis實(shí)例,可以分別寫(xiě)入不同的磁盤(pán)里,減輕磁盤(pán)的寫(xiě)入壓力。
單機(jī)多實(shí)例部署
因?yàn)閞edis是單線程架構(gòu),如果一個(gè)服務(wù)器上只部署一個(gè)redis實(shí)例,那么對(duì)于多核cpu來(lái)說(shuō)是一種浪費(fèi)。所以,通常會(huì)在一個(gè)服務(wù)器上部署多個(gè)redis應(yīng)用,比如開(kāi)啟三個(gè)redis服務(wù),端口號(hào)分別為6379,6380,6381。6379用來(lái)做緩存服務(wù),6380用來(lái)做消息隊(duì)列,6381用來(lái)做標(biāo)簽及推薦系統(tǒng)。
這樣確實(shí)可以充分利用cpu,但會(huì)容易產(chǎn)生問(wèn)題。如果多個(gè)實(shí)例同時(shí)在進(jìn)行持久化,那么對(duì)于cpu、內(nèi)存及影片的壓力是非常大的。好的做法是將他們隔離開(kāi)來(lái),同一時(shí)間只有一個(gè)實(shí)例在進(jìn)行持久化。
實(shí)現(xiàn)該效果的偽代碼如下:
while (true) { $redisObj = [6379,6380,……]; foreach ($redisObj as $obj) { // 該實(shí)例是否構(gòu)成重寫(xiě)的要求 if (rewriteConf($ojb)) { // 該實(shí)例進(jìn)行持久化 } } }
foreach用來(lái)遍歷每一個(gè)redis實(shí)例,然后對(duì)該實(shí)例是否達(dá)到重寫(xiě)的條件做判斷,滿足就開(kāi)始進(jìn)行重寫(xiě)。這樣就可以將多redis實(shí)例持久化進(jìn)行隔離。
以上就是Redis持久化過(guò)程的監(jiān)控及優(yōu)化的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注創(chuàng)新互聯(lián)其它相關(guān)文章!
當(dāng)前題目:Redis如何監(jiān)控持久化和優(yōu)化持久化?
網(wǎng)頁(yè)地址:http://aaarwkj.com/article30/gghpso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、網(wǎng)站營(yíng)銷、品牌網(wǎng)站制作、云服務(wù)器、App開(kāi)發(fā)、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)