Redis性能優(yōu)化培訓(xùn)_第1頁(yè)
Redis性能優(yōu)化培訓(xùn)_第2頁(yè)
Redis性能優(yōu)化培訓(xùn)_第3頁(yè)
Redis性能優(yōu)化培訓(xùn)_第4頁(yè)
Redis性能優(yōu)化培訓(xùn)_第5頁(yè)
已閱讀5頁(yè),還剩34頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Redis性能優(yōu)化培訓(xùn)快速掌握Redis性能優(yōu)化編輯課件目錄Redis簡(jiǎn)介Redis特性Redis性能數(shù)據(jù)指標(biāo)常見(jiàn)性能問(wèn)題分析性能優(yōu)化方案性能測(cè)試編輯課件Redis簡(jiǎn)介Redis是一個(gè)開(kāi)源的高性能Nosql數(shù)據(jù)庫(kù),也是基于內(nèi)存的Key-Value存儲(chǔ)系統(tǒng),可以用作數(shù)據(jù)庫(kù)、緩存和消息中間件支持多種數(shù)據(jù)結(jié)構(gòu):字符串、哈希表、列表、集合、有序集合、位圖、Hyperloglogs內(nèi)置了復(fù)制,LUA腳本,LRU數(shù)據(jù)淘汰,事務(wù)和不同級(jí)別的磁盤持久化等功能通過(guò)Sentinel哨兵和Cluster自動(dòng)分片集群提供高可用性編輯課件Redis特性基于單線程模型實(shí)現(xiàn),一個(gè)線程效勞所有客戶端請(qǐng)求,采用非阻塞式IO線程平安,所有操作都是原子的,不會(huì)因并發(fā)產(chǎn)生數(shù)據(jù)異常速度非常快,大局部命令算法時(shí)間復(fù)雜度都是O(1)使用高耗時(shí)Redis命令很危險(xiǎn),會(huì)占用唯一線程的大量處理時(shí)間,導(dǎo)致所有的請(qǐng)求都被拖慢編輯課件Redis性能數(shù)據(jù)指標(biāo)通過(guò)Redis-cli命令行界面訪問(wèn)到Redis效勞器,使用info命令獲取豐富的Redis性能數(shù)據(jù)指標(biāo)info命令輸出的數(shù)據(jù)可分為10個(gè)類別,分別是:serverclientsmemorypersistencestatsreplicationcpucommandstatsclusterkeyspace編輯課件重要性能指標(biāo)memory輸入infomemory命令,只返回與內(nèi)存相關(guān)的數(shù)據(jù)常用內(nèi)存數(shù)據(jù)指標(biāo)used_memory:已使用內(nèi)存used_memory_rss:從操作系統(tǒng)上顯示已經(jīng)分配的內(nèi)存總量mem_fragmentation_ratio:內(nèi)存碎片率used_memory_lua:Lua腳本引擎所使用的內(nèi)存大小mem_allocator:在編譯時(shí)指定的Redis使用的內(nèi)存分配器,可以是libc、jemalloc、tcmalloc以上指標(biāo)都是以字節(jié)〔byte〕為單位編輯課件重要性能指標(biāo)CPUused_cpu_sys:55.09

--Redis效勞器消耗的系統(tǒng)CPUused_cpu_user:26.16

--Redis效勞器消耗的用戶CPUused_cpu_sys_children:0.02

--后臺(tái)進(jìn)程消耗的系統(tǒng)CPUused_cpu_user_children:0.01

--后臺(tái)進(jìn)程消耗的用戶CPU編輯課件重要性能指標(biāo)Clients記錄了已連接客戶端的信息connected_clients:1

--已連接客戶端的數(shù)量〔不包括通過(guò)附屬效勞器連接的客戶端〕client_longest_output_list:0

--當(dāng)前連接的客戶端當(dāng)中,最長(zhǎng)的輸出列表client_biggest_input_buf:0

--當(dāng)前連接的客戶端當(dāng)中,最大輸入緩存blocked_clients:0

--正在等待阻塞命令〔BLPOP、BRPOP、BRPOPLPUSH〕的客戶端的數(shù)量編輯課件重要性能指標(biāo)Stats記錄了一般統(tǒng)計(jì)信息total_connections_received:782640

--效勞器已接受的連接請(qǐng)求數(shù)量total_commands_processed:6401614

--效勞器已執(zhí)行的命令數(shù)量instantaneous_ops_per_sec:7

--效勞器每秒鐘執(zhí)行的命令數(shù)量latest_fork_usec:475--最近一次fork()操作消耗的毫秒數(shù)編輯課件重要性能指標(biāo)Commandstats記錄了各種不同類型的命令的執(zhí)行統(tǒng)計(jì)信息記錄命令執(zhí)行的次數(shù)、命令消耗的CPU時(shí)間、執(zhí)行每個(gè)命令消耗的平均CPU時(shí)間等等編輯課件常見(jiàn)性能問(wèn)題分析一生產(chǎn)系統(tǒng)剛開(kāi)始運(yùn)行階段,系統(tǒng)穩(wěn)定。但是運(yùn)行一段時(shí)間后,發(fā)現(xiàn)局部時(shí)間段系統(tǒng)接口響應(yīng)變慢。查看客戶端日志經(jīng)常會(huì)出現(xiàn)這樣的錯(cuò)誤:redis.clients.jedis.exceptions.JedisConnectionException:.SocketTimeoutException:Readtimedout執(zhí)行slowlog查看慢查詢語(yǔ)句,發(fā)現(xiàn)有大量的keys命令操作,keys命令在大量并發(fā)情況下性能非常差正式環(huán)境中,盡量防止使用keys,接下來(lái)找出使用keys的代碼做優(yōu)化,至此,timeout問(wèn)題解決編輯課件常見(jiàn)性能問(wèn)題分析二生產(chǎn)環(huán)境長(zhǎng)時(shí)間的運(yùn)行后,經(jīng)常會(huì)有接口返回?cái)?shù)據(jù)失敗的情況,或者是從監(jiān)控上發(fā)現(xiàn)數(shù)據(jù)庫(kù)壓力某一時(shí)間暴增。查看客戶端日志發(fā)現(xiàn)這樣的錯(cuò)誤:redis.clients.jedis.exceptions.JedisConnectionException:Couldnotgetaresourcefromthepool執(zhí)行clientlist命令,發(fā)現(xiàn)大量的client的idle時(shí)間特別長(zhǎng)檢查配置發(fā)現(xiàn)timeout和tcp-keepalive均未啟用〔均為0〕,redis效勞端沒(méi)有有效的機(jī)制來(lái)確保效勞端已經(jīng)建立的連接是否已經(jīng)失效當(dāng)效勞器和客戶端網(wǎng)絡(luò)出現(xiàn)閃斷,導(dǎo)致tcp連接中斷,這種情況下的client將會(huì)一直被redis效勞端所持有,就會(huì)出現(xiàn)上idle時(shí)間特長(zhǎng)的client連接設(shè)置timeout和tcp-keepalive來(lái)清理失效的連接編輯課件常見(jiàn)性能問(wèn)題分析三突然間效勞不能訪問(wèn),返回錯(cuò)誤:redis.clients.jedis.exceptions.JedisDataException:MISCONFRedisisconfiguredtosaveRDBsnapshots,butiscurrentlynotabletopersistondisk.Commandsthatmaymodifythedatasetaredisabled.PleasecheckRedislogsfordetailsabouttheerror.查看redis日志,發(fā)現(xiàn)有這個(gè)錯(cuò)誤:Can’tsaveinbackground:fork:CannotallocatememoryRedis在保存內(nèi)存的數(shù)據(jù)到磁盤時(shí),為了防止主進(jìn)程假死,會(huì)Fork一個(gè)子進(jìn)程來(lái)完成這個(gè)保存操作,這個(gè)Fork的子進(jìn)程會(huì)需要分配和主進(jìn)程相同的內(nèi)存,這時(shí)候就相當(dāng)于需要的內(nèi)存double了,如果這時(shí)候可用內(nèi)存缺乏以分配需要的內(nèi)存,將會(huì)導(dǎo)致Fock子進(jìn)程失敗而無(wú)法保存數(shù)據(jù)到磁盤。修改linux內(nèi)核參數(shù):vm.overcommit_memory=1,問(wèn)題解決編輯課件優(yōu)化措施總結(jié)結(jié)合實(shí)際使用場(chǎng)景,考慮是否需要用到redis的持久化,如果單純用來(lái)做應(yīng)用層的緩存〔在緩存未命中的情況下訪問(wèn)數(shù)據(jù)庫(kù)〕,可以關(guān)閉持久化緩存模式下,盡量為每塊緩存設(shè)置時(shí)效性,防止冷數(shù)據(jù)長(zhǎng)時(shí)間占用資源生產(chǎn)環(huán)境中盡量防止使用keys操作,由于redis是單線程模式,大量的keys操作會(huì)阻塞其他的命令執(zhí)行設(shè)置合理的內(nèi)存回收策略,保證內(nèi)存可用性的同時(shí)能適當(dāng)?shù)奶峁┚彺娴拿新侍崆坝?jì)算出系統(tǒng)可能會(huì)用的內(nèi)存大小,合理的分配內(nèi)存。需要注意在開(kāi)啟持久化模式下,需要預(yù)留更多的內(nèi)存提供給Fock的子進(jìn)程做數(shù)據(jù)磁盤flush操作編輯課件性能優(yōu)化方案關(guān)鍵參數(shù)優(yōu)化長(zhǎng)耗時(shí)命令優(yōu)化延遲因素優(yōu)化內(nèi)存管理優(yōu)化操作系統(tǒng)優(yōu)化讀寫別離機(jī)制Redis集群編輯課件關(guān)鍵參數(shù)優(yōu)化客戶端最大連接數(shù)〔maxclients〕可能的錯(cuò)誤信息:maxnumberofclientsreached默認(rèn)為0,即不限制,一般不需要更改,所以客戶端連接限制,取決于操作系統(tǒng)參數(shù)ulimit-n〔maxopenfiles〕,可通過(guò)修改/etc/security/limits.conf文件以永久生效。編輯課件關(guān)鍵參數(shù)優(yōu)化主從響應(yīng)策略〔repl-ping-slave-period/repl-timeout〕slave會(huì)每隔repl-ping-slave-period(默認(rèn)10秒)ping一次master,如果超過(guò)repl-timeout(默認(rèn)60秒)都沒(méi)有收到響應(yīng),就會(huì)認(rèn)為Master掛了。如果Master明明沒(méi)掛但被阻塞住了也會(huì)報(bào)這個(gè)錯(cuò)。可以適當(dāng)調(diào)大repl-timeout編輯課件關(guān)鍵參數(shù)優(yōu)化客戶端輸出緩沖區(qū)〔client-output-buffer-limit〕當(dāng)使用主從復(fù)制時(shí),性能壓測(cè)下,數(shù)據(jù)量會(huì)急劇增長(zhǎng),導(dǎo)致從節(jié)點(diǎn)需要復(fù)制的數(shù)據(jù)很大,消耗時(shí)長(zhǎng)增加。slave沒(méi)掛但被阻塞住了,比方正在loadingMaster發(fā)過(guò)來(lái)的RDB,Master的指令不能立刻發(fā)送給slave,就會(huì)放在outputbuffer中,在配置文件中有如下配置:client-output-buffer-limitslave256mb64mb60這是說(shuō)負(fù)責(zé)發(fā)數(shù)據(jù)給slave的client,如果buffer超過(guò)256m或者連續(xù)60秒超過(guò)64m,就會(huì)被立刻強(qiáng)行關(guān)閉所以此時(shí)應(yīng)該相應(yīng)調(diào)大數(shù)值,否那么就會(huì)出現(xiàn)很悲劇的循環(huán):Master傳輸一個(gè)很大的RDB給Slave,Slave努力地裝載,但還沒(méi)裝載完,Master對(duì)client的緩存滿了,再來(lái)一次編輯課件關(guān)鍵參數(shù)優(yōu)化客戶端最大連接數(shù)〔maxclients〕限制非預(yù)期的連接數(shù)增長(zhǎng),保持Redis的性能最優(yōu)應(yīng)設(shè)置為預(yù)期連接數(shù)峰值的110%到150之間,假設(shè)是連接數(shù)超出這個(gè)數(shù)字后,Redis會(huì)拒絕并立刻關(guān)閉新來(lái)的連接默認(rèn)情況下,盡量不要讓Redis實(shí)例的客戶端連接數(shù)超出5000編輯課件長(zhǎng)耗時(shí)命令優(yōu)化*不要把List當(dāng)做列表使用,僅當(dāng)做隊(duì)列來(lái)使用*通過(guò)機(jī)制嚴(yán)格控制Hash、Set、SortedSet的大小*可能的話,將排序、并集、交集等操作放在客戶端執(zhí)行*絕對(duì)禁止使用KEYS命令*防止一次性遍歷集合類型的所有成員,而應(yīng)使用SCAN類的命令進(jìn)行分批的,游標(biāo)式的遍歷編輯課件長(zhǎng)耗時(shí)命令優(yōu)化SlowLog可以自動(dòng)記錄耗時(shí)較長(zhǎng)的命令配置參數(shù):slowlog-log-slower-thanxxx#執(zhí)行時(shí)間慢于xxx微秒的命令計(jì)入SlowLogslowlog-max-lenxxx#SlowLog的長(zhǎng)度,即最大記錄多少條SlowLogSLOWLOGGET[number]命令,獲取最近進(jìn)入SlowLog的number條命令SLOWLOGRESET命令,重置SlowLog編輯課件延遲因素優(yōu)化網(wǎng)絡(luò)引發(fā)的延遲通常千兆網(wǎng)絡(luò)環(huán)境中,TCP/IP網(wǎng)絡(luò)延遲是200us(微秒),Unix域Socket可以低到30us減少網(wǎng)絡(luò)往返時(shí)間RTT(Round-TripTime),官方優(yōu)化建議:*長(zhǎng)連接:不要頻繁連接/斷開(kāi)到效勞器的連接,盡可能保持長(zhǎng)連接*域Socket:客戶端與Redis效勞端在同一臺(tái)機(jī)器上,應(yīng)使用Unix域Socket*多參數(shù)命令:相比管道,優(yōu)先使用多參數(shù)命令,如mset/mget/hmset/hmget等*管道化:使用管道pipeline將連續(xù)執(zhí)行的命令組合執(zhí)行,減少RTT*LUA腳本:對(duì)于有數(shù)據(jù)依賴而無(wú)法使用管道的命令,可以考慮在Redis效勞端執(zhí)行LUA腳本編輯課件延遲因素優(yōu)化數(shù)據(jù)淘汰引發(fā)的延遲當(dāng)同一秒內(nèi)有大量key過(guò)期時(shí),會(huì)引發(fā)Redis的延遲,盡量錯(cuò)開(kāi)key的失效時(shí)間隨機(jī)化設(shè)置過(guò)期時(shí)間,防止同一時(shí)間超過(guò)25%的Key過(guò)期導(dǎo)致的Redis阻塞Redis剔除過(guò)期Key的兩種方式:被動(dòng):當(dāng)客戶端訪問(wèn)到Key時(shí),發(fā)現(xiàn)已經(jīng)過(guò)期,那么剔除主動(dòng):每100ms剔除一批Key,假設(shè)過(guò)期Key超過(guò)25%那么反復(fù)執(zhí)行編輯課件延遲因素優(yōu)化Swap引發(fā)的延遲當(dāng)Linux將Redis所用的內(nèi)存分頁(yè)移至swap空間時(shí),將會(huì)阻塞Redis進(jìn)程,導(dǎo)致Redis出現(xiàn)不正常的延遲/proc/<pid>/smaps文件中會(huì)保存進(jìn)程的swap記錄,通過(guò)查看這個(gè)文件,能夠判斷Redis的延遲是否由Swap產(chǎn)生。如果這個(gè)文件中記錄了較大的Swapsize,那么說(shuō)明延遲很有可能是Swap造成的編輯課件延遲因素優(yōu)化數(shù)據(jù)持久化引發(fā)的延遲Redis的數(shù)據(jù)持久化工作本身就會(huì)帶來(lái)延遲,需要根據(jù)數(shù)據(jù)的平安級(jí)別和性能要求制定合理的持久化策略RDB持久化通常會(huì)提供比使用AOF更高的性能,但每次RDB快照和AOFRewrite都需要Redis主進(jìn)程進(jìn)行fork操作,fork操作本身可能會(huì)產(chǎn)生較高的耗時(shí)根據(jù)具體情況合理配置RDB快照和AOFRewrite時(shí)機(jī),防止過(guò)于頻繁的fork帶來(lái)的延遲可以通過(guò)INFO命令返回的latest_fork_usec字段查看上一次fork操作的耗時(shí)〔微秒〕編輯課件內(nèi)存管理優(yōu)化內(nèi)存使用率Redis內(nèi)存使用used_memory超過(guò)可用內(nèi)存的95%,局部數(shù)據(jù)開(kāi)始在內(nèi)存與Swap空間來(lái)回交換,嚴(yán)重影響性能如果沒(méi)有開(kāi)啟RDB快照或AOF持久化策略,緩存數(shù)據(jù)在Redis崩潰時(shí)會(huì)有喪失風(fēng)險(xiǎn)當(dāng)開(kāi)啟并觸發(fā)快照功能時(shí),Redis會(huì)fork一個(gè)子進(jìn)程把當(dāng)前內(nèi)存中的數(shù)據(jù)完全復(fù)制一份寫入到硬盤上。因此假設(shè)是當(dāng)前使用內(nèi)存超過(guò)可用內(nèi)存的45%時(shí)觸發(fā)快照功能,那么此時(shí)進(jìn)行的內(nèi)存交換會(huì)變的非常危險(xiǎn)(可能會(huì)喪失數(shù)據(jù))。倘假設(shè)在這個(gè)時(shí)候?qū)嵗嫌写罅款l繁的更新操作,問(wèn)題會(huì)變得更加嚴(yán)重編輯課件內(nèi)存管理優(yōu)化內(nèi)存使用率優(yōu)化如果緩存數(shù)據(jù)小于4GB,使用32位的Redis實(shí)例可能的使用Hash數(shù)據(jù)結(jié)構(gòu)設(shè)置key的過(guò)期時(shí)間回收key編輯課件內(nèi)存管理優(yōu)化內(nèi)存回收策略maxmemory-policy“volatile-lru〞:使用LRU算法從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集合中淘汰數(shù)據(jù)“volatile-ttl〞:從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集合中淘汰即將過(guò)期的數(shù)據(jù)“volatile-random〞:從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集合中隨機(jī)淘汰數(shù)據(jù)“allkeys-lru〞:使用LRU算法從所有數(shù)據(jù)集合中淘汰數(shù)據(jù)“allkeys-random〞:從數(shù)據(jù)集合中任意淘汰數(shù)據(jù)“no-enviction〞:禁止淘汰數(shù)據(jù)編輯課件內(nèi)存管理優(yōu)化內(nèi)存碎片率mem_fragmentation_ratio由操系統(tǒng)分配的內(nèi)存used_memory_rss除以Redis分配的內(nèi)存used_memory得出內(nèi)存碎片是由操作系統(tǒng)低效的分配/回收物理內(nèi)存導(dǎo)致的內(nèi)存碎片率稍大于1是合理的,這個(gè)值表示內(nèi)存碎片率比較低,也說(shuō)明redis沒(méi)有發(fā)生內(nèi)存交換內(nèi)存碎片率超過(guò)1.5,說(shuō)明Redis消耗了實(shí)際需要物理內(nèi)存的150%,其中50%是內(nèi)存碎片內(nèi)存碎片率低于1,說(shuō)明Redis內(nèi)存分配超出了物理內(nèi)存,操作系統(tǒng)正在進(jìn)行內(nèi)存交換編輯課件內(nèi)存管理優(yōu)化內(nèi)存碎片率優(yōu)化重啟Redis效勞器內(nèi)存碎片率超過(guò)1.5,重啟Redis可讓額外產(chǎn)生的內(nèi)存碎片失效并作為新內(nèi)存使用限制內(nèi)存交換內(nèi)存碎片率低于1,應(yīng)增加可用物理內(nèi)存或減少Redis實(shí)例內(nèi)存占用修改內(nèi)存分配器Redis支持glibc、jemalloc和tcmalloc等幾種不同的內(nèi)存分配器,每個(gè)分配器在內(nèi)存分配和碎片上都有不同的實(shí)現(xiàn)修改默認(rèn)內(nèi)存分配器,需要完全理解這幾種內(nèi)存分配器的差異,也需重新編譯Redis,不建議普通管理員修改編輯課件內(nèi)存管理優(yōu)化優(yōu)化總結(jié)根據(jù)業(yè)務(wù)需要選擇適宜的數(shù)據(jù)類型為不同的應(yīng)用場(chǎng)景設(shè)置相應(yīng)的緊湊存儲(chǔ)參數(shù)假設(shè)業(yè)務(wù)場(chǎng)景不需要數(shù)據(jù)持久化,關(guān)閉持久化方式用以提高處理性能及內(nèi)存使用率如果需要使用持久化,根據(jù)是否可以容忍重啟喪失局部數(shù)據(jù)在快照方式與語(yǔ)句追加方式之間選擇其一,不要使用虛擬內(nèi)存或磁盤存儲(chǔ)方式不要讓Redis所在機(jī)器物理內(nèi)存使用超過(guò)實(shí)際內(nèi)存總量的60%編輯課件操作系統(tǒng)優(yōu)化內(nèi)存分配控制內(nèi)核參數(shù)vm.overcommit_memoryRedis建議把這個(gè)值設(shè)置為1,是為了讓fork能夠在低內(nèi)存下也執(zhí)行成功swappiness參數(shù)決定操作系統(tǒng)使用swap的傾向程度取值范圍是0~100,swappiness的值越大,說(shuō)明操作系統(tǒng)可能使用swap的概率越高,swappiness值越低,表示操作系統(tǒng)更加傾向于使用物理內(nèi)存設(shè)置方法:echovm.swappiness={bestvalue}>>/etc/sysctl.conf編輯課件操作系統(tǒng)優(yōu)化TransparentHugePages支持大內(nèi)存頁(yè)(2MB)分配,默認(rèn)開(kāi)啟,Redis建議禁用,禁用方法:echonever>/sys/kernel/mm/transparent_hugepage/enabledOOMkillerOOMkiller會(huì)在可用內(nèi)存缺乏時(shí)選擇性的殺掉用戶進(jìn)程對(duì)于Redis效勞器來(lái)說(shuō),可以將所有Redis的oom_adj設(shè)置為最低值或者稍小的值,降低被OOMkiller殺掉的概率編輯課件操作系統(tǒng)優(yōu)化NTP時(shí)間同步保證

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論