您好,登錄后才能下訂單哦!
redis是經(jīng)典的單線程架構(gòu),所有的讀寫操作都是在一個(gè)主線程中完成的。當(dāng)redis處于高并發(fā)情況時(shí),如果出現(xiàn)阻塞,哪怕是很短的時(shí)間,對于應(yīng)用來說都相當(dāng)嚴(yán)重,會出現(xiàn)大量的超時(shí)問題,應(yīng)用出問題。
1. redis的阻塞主要包括兩方面:
1.1 內(nèi)在原因:不合理使用API或數(shù)據(jù)結(jié)構(gòu)、CPU飽和持久化阻塞
1.2 外在原因:CPU競爭、內(nèi)存交換、網(wǎng)絡(luò)問題
1.1內(nèi)在原因:
1.1.1:如何發(fā)現(xiàn)慢查詢:slowlog get [N] 選型:N,可選,代表獲取的日志條數(shù)
1.1.2:如何發(fā)現(xiàn)大對象:redis-cli -h {ip} -p {port} --bigkeys
1.1.3:CPU飽和問題:單線程Redis 處理命令時(shí)只能使用一個(gè)CPU,而CPU飽和是指Redis把單核CPU使用率跑到接近100%。CPU飽和導(dǎo)致Redis無法處理更多命令,嚴(yán)重影響吞吐和應(yīng)用方的穩(wěn)定。
如何發(fā)現(xiàn)CPU飽和:redis-cli -h {ip} -p {port} --stat
1.1.4:持久化相關(guān)阻塞:
a.fork阻塞: fork操作本身耗時(shí)過長,會導(dǎo)致主線程阻塞。
通過info stats中的latest_fork_usec指標(biāo)確定(單位為微秒),表示最近一次fork操作耗時(shí),如果耗時(shí)很大,比如超過1秒,則需要做優(yōu)化調(diào)整,比如不使用過大內(nèi)存實(shí)例,或者規(guī)避fork緩慢的xen虛擬機(jī)。
b.AOF刷盤阻塞:當(dāng)我們開啟AOF持久化功能時(shí),文件刷盤的方式一般采用每秒一次,后臺線程每秒對AOF文件做fsync操作。當(dāng)硬盤壓力過大時(shí),fsync操作需要等待,直到寫入完成。如果主線程發(fā)現(xiàn)距離上一次的fsync成功超過2秒,為了數(shù)據(jù)安全性它會阻塞直到后臺線程執(zhí)行fsync操作完成。這種阻塞行為主要是硬盤壓力引起。后臺日志會出現(xiàn)如下信息:
Asynchronous AOF fsync is taking too long (disk is busy). Writing the AOFbuffer without waiting for fsync to complete, this may slow down Redis.
1.2 外在原因:
1.2.1:CPU競爭:redis是經(jīng)典的CPU密集型應(yīng)用,不建議和其它的程序一起使用??梢允褂胻op命令都為問題;
1.2.2:綁定CPU:優(yōu)化把Redis綁定到CPU上,降低CPU頻繁上下文切換。
注意:對于開啟了持久化或參與復(fù)制的主節(jié)點(diǎn)不建議綁定CPU,防止父進(jìn)程與子進(jìn)程將產(chǎn)生激烈CPU競爭,影響Redis穩(wěn)定性。
1.2.3:內(nèi)存交行:定位內(nèi)存交換方法:
a.查詢r(jià)edis進(jìn)程號:redis-cli -p 6384 info server |grep process_id
b.根據(jù)進(jìn)程號查詢內(nèi)存交換信息:cat /proc/xxxx/smaps |grep Swap
c.如果交換都是0kb或者偶爾4kb屬于正?,F(xiàn)象
d. 降低系統(tǒng)使用swap優(yōu)先級: 修改swappiness
1.2.4:網(wǎng)絡(luò)問題:
a. Redis連接拒絕:Redis通過maxclients參數(shù)控制客戶端最大連接數(shù),默認(rèn)10000。查看info stats的rejected_connections統(tǒng)計(jì)指標(biāo)展示被拒絕的數(shù)量。客戶端訪問盡量采用長連接或者連接池方 式。進(jìn)程限制優(yōu)化:設(shè)置ulimit -n 65535 防止 Too many Open files
b.backlog隊(duì)列溢出:系統(tǒng)默認(rèn)backlog為128,優(yōu)化:使用echo 512>/proc/sys/net/core/somaxconn修改系統(tǒng)默認(rèn)參數(shù),如果懷疑是backlog隊(duì)列溢出,隊(duì)列溢出統(tǒng)計(jì):
netstat-s|grepoverflowed,查看是否有持續(xù)增長的連接拒絕情況。
c.網(wǎng)絡(luò)延時(shí):網(wǎng)絡(luò)延時(shí)統(tǒng)計(jì):
redis-cli -h {host} -p {port} --latency
分別統(tǒng)計(jì):最小值、最大值、平均值、采樣次數(shù)
網(wǎng)絡(luò)延時(shí)一般發(fā)生在跨機(jī)房部署
d.網(wǎng)卡軟中斷:單個(gè)網(wǎng)卡隊(duì)列只能使用一個(gè)CPU,高并發(fā)下網(wǎng)卡數(shù)據(jù)集中在一個(gè)CPU下,導(dǎo)致無法利用多核CPU。網(wǎng)卡軟中斷瓶頸一般出現(xiàn)在網(wǎng)絡(luò)高流量吞吐場景,top的si指標(biāo)過高。
使用top 命令,按下1進(jìn)行排查。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。