




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Redis性能優化培訓快速掌握Redis性能優化編輯課件目錄Redis簡介Redis特性Redis性能數據指標常見性能問題分析性能優化方案性能測試編輯課件Redis簡介Redis是一個開源的高性能Nosql數據庫,也是基于內存的Key-Value存儲系統,可以用作數據庫、緩存和消息中間件支持多種數據結構:字符串、哈希表、列表、集合、有序集合、位圖、Hyperloglogs內置了復制,LUA腳本,LRU數據淘汰,事務和不同級別的磁盤持久化等功能通過Sentinel哨兵和Cluster自動分片集群提供高可用性編輯課件Redis特性基于單線程模型實現,一個線程效勞所有客戶端請求,采用非阻塞式IO線程平安,所有操作都是原子的,不會因并發產生數據異常速度非??欤缶植棵钏惴〞r間復雜度都是O(1)使用高耗時Redis命令很危險,會占用唯一線程的大量處理時間,導致所有的請求都被拖慢編輯課件Redis性能數據指標通過Redis-cli命令行界面訪問到Redis效勞器,使用info命令獲取豐富的Redis性能數據指標info命令輸出的數據可分為10個類別,分別是:serverclientsmemorypersistencestatsreplicationcpucommandstatsclusterkeyspace編輯課件重要性能指標memory輸入infomemory命令,只返回與內存相關的數據常用內存數據指標used_memory:已使用內存used_memory_rss:從操作系統上顯示已經分配的內存總量mem_fragmentation_ratio:內存碎片率used_memory_lua:Lua腳本引擎所使用的內存大小mem_allocator:在編譯時指定的Redis使用的內存分配器,可以是libc、jemalloc、tcmalloc以上指標都是以字節〔byte〕為單位編輯課件重要性能指標CPUused_cpu_sys:55.09
--Redis效勞器消耗的系統CPUused_cpu_user:26.16
--Redis效勞器消耗的用戶CPUused_cpu_sys_children:0.02
--后臺進程消耗的系統CPUused_cpu_user_children:0.01
--后臺進程消耗的用戶CPU編輯課件重要性能指標Clients記錄了已連接客戶端的信息connected_clients:1
--已連接客戶端的數量〔不包括通過附屬效勞器連接的客戶端〕client_longest_output_list:0
--當前連接的客戶端當中,最長的輸出列表client_biggest_input_buf:0
--當前連接的客戶端當中,最大輸入緩存blocked_clients:0
--正在等待阻塞命令〔BLPOP、BRPOP、BRPOPLPUSH〕的客戶端的數量編輯課件重要性能指標Stats記錄了一般統計信息total_connections_received:782640
--效勞器已接受的連接請求數量total_commands_processed:6401614
--效勞器已執行的命令數量instantaneous_ops_per_sec:7
--效勞器每秒鐘執行的命令數量latest_fork_usec:475--最近一次fork()操作消耗的毫秒數編輯課件重要性能指標Commandstats記錄了各種不同類型的命令的執行統計信息記錄命令執行的次數、命令消耗的CPU時間、執行每個命令消耗的平均CPU時間等等編輯課件常見性能問題分析一生產系統剛開始運行階段,系統穩定。但是運行一段時間后,發現局部時間段系統接口響應變慢。查看客戶端日志經常會出現這樣的錯誤:redis.clients.jedis.exceptions.JedisConnectionException:.SocketTimeoutException:Readtimedout執行slowlog查看慢查詢語句,發現有大量的keys命令操作,keys命令在大量并發情況下性能非常差正式環境中,盡量防止使用keys,接下來找出使用keys的代碼做優化,至此,timeout問題解決編輯課件常見性能問題分析二生產環境長時間的運行后,經常會有接口返回數據失敗的情況,或者是從監控上發現數據庫壓力某一時間暴增。查看客戶端日志發現這樣的錯誤:redis.clients.jedis.exceptions.JedisConnectionException:Couldnotgetaresourcefromthepool執行clientlist命令,發現大量的client的idle時間特別長檢查配置發現timeout和tcp-keepalive均未啟用〔均為0〕,redis效勞端沒有有效的機制來確保效勞端已經建立的連接是否已經失效當效勞器和客戶端網絡出現閃斷,導致tcp連接中斷,這種情況下的client將會一直被redis效勞端所持有,就會出現上idle時間特長的client連接設置timeout和tcp-keepalive來清理失效的連接編輯課件常見性能問題分析三突然間效勞不能訪問,返回錯誤:redis.clients.jedis.exceptions.JedisDataException:MISCONFRedisisconfiguredtosaveRDBsnapshots,butiscurrentlynotabletopersistondisk.Commandsthatmaymodifythedatasetaredisabled.PleasecheckRedislogsfordetailsabouttheerror.查看redis日志,發現有這個錯誤:Can’tsaveinbackground:fork:CannotallocatememoryRedis在保存內存的數據到磁盤時,為了防止主進程假死,會Fork一個子進程來完成這個保存操作,這個Fork的子進程會需要分配和主進程相同的內存,這時候就相當于需要的內存double了,如果這時候可用內存缺乏以分配需要的內存,將會導致Fock子進程失敗而無法保存數據到磁盤。修改linux內核參數:vm.overcommit_memory=1,問題解決編輯課件優化措施總結結合實際使用場景,考慮是否需要用到redis的持久化,如果單純用來做應用層的緩存〔在緩存未命中的情況下訪問數據庫〕,可以關閉持久化緩存模式下,盡量為每塊緩存設置時效性,防止冷數據長時間占用資源生產環境中盡量防止使用keys操作,由于redis是單線程模式,大量的keys操作會阻塞其他的命令執行設置合理的內存回收策略,保證內存可用性的同時能適當的提供緩存的命中率提前計算出系統可能會用的內存大小,合理的分配內存。需要注意在開啟持久化模式下,需要預留更多的內存提供給Fock的子進程做數據磁盤flush操作編輯課件性能優化方案關鍵參數優化長耗時命令優化延遲因素優化內存管理優化操作系統優化讀寫別離機制Redis集群編輯課件關鍵參數優化客戶端最大連接數〔maxclients〕可能的錯誤信息:maxnumberofclientsreached默認為0,即不限制,一般不需要更改,所以客戶端連接限制,取決于操作系統參數ulimit-n〔maxopenfiles〕,可通過修改/etc/security/limits.conf文件以永久生效。編輯課件關鍵參數優化主從響應策略〔repl-ping-slave-period/repl-timeout〕slave會每隔repl-ping-slave-period(默認10秒)ping一次master,如果超過repl-timeout(默認60秒)都沒有收到響應,就會認為Master掛了。如果Master明明沒掛但被阻塞住了也會報這個錯??梢赃m當調大repl-timeout編輯課件關鍵參數優化客戶端輸出緩沖區〔client-output-buffer-limit〕當使用主從復制時,性能壓測下,數據量會急劇增長,導致從節點需要復制的數據很大,消耗時長增加。slave沒掛但被阻塞住了,比方正在loadingMaster發過來的RDB,Master的指令不能立刻發送給slave,就會放在outputbuffer中,在配置文件中有如下配置:client-output-buffer-limitslave256mb64mb60這是說負責發數據給slave的client,如果buffer超過256m或者連續60秒超過64m,就會被立刻強行關閉所以此時應該相應調大數值,否那么就會出現很悲劇的循環:Master傳輸一個很大的RDB給Slave,Slave努力地裝載,但還沒裝載完,Master對client的緩存滿了,再來一次編輯課件關鍵參數優化客戶端最大連接數〔maxclients〕限制非預期的連接數增長,保持Redis的性能最優應設置為預期連接數峰值的110%到150之間,假設是連接數超出這個數字后,Redis會拒絕并立刻關閉新來的連接默認情況下,盡量不要讓Redis實例的客戶端連接數超出5000編輯課件長耗時命令優化*不要把List當做列表使用,僅當做隊列來使用*通過機制嚴格控制Hash、Set、SortedSet的大小*可能的話,將排序、并集、交集等操作放在客戶端執行*絕對禁止使用KEYS命令*防止一次性遍歷集合類型的所有成員,而應使用SCAN類的命令進行分批的,游標式的遍歷編輯課件長耗時命令優化SlowLog可以自動記錄耗時較長的命令配置參數:slowlog-log-slower-thanxxx#執行時間慢于xxx微秒的命令計入SlowLogslowlog-max-lenxxx#SlowLog的長度,即最大記錄多少條SlowLogSLOWLOGGET[number]命令,獲取最近進入SlowLog的number條命令SLOWLOGRESET命令,重置SlowLog編輯課件延遲因素優化網絡引發的延遲通常千兆網絡環境中,TCP/IP網絡延遲是200us(微秒),Unix域Socket可以低到30us減少網絡往返時間RTT(Round-TripTime),官方優化建議:*長連接:不要頻繁連接/斷開到效勞器的連接,盡可能保持長連接*域Socket:客戶端與Redis效勞端在同一臺機器上,應使用Unix域Socket*多參數命令:相比管道,優先使用多參數命令,如mset/mget/hmset/hmget等*管道化:使用管道pipeline將連續執行的命令組合執行,減少RTT*LUA腳本:對于有數據依賴而無法使用管道的命令,可以考慮在Redis效勞端執行LUA腳本編輯課件延遲因素優化數據淘汰引發的延遲當同一秒內有大量key過期時,會引發Redis的延遲,盡量錯開key的失效時間隨機化設置過期時間,防止同一時間超過25%的Key過期導致的Redis阻塞Redis剔除過期Key的兩種方式:被動:當客戶端訪問到Key時,發現已經過期,那么剔除主動:每100ms剔除一批Key,假設過期Key超過25%那么反復執行編輯課件延遲因素優化Swap引發的延遲當Linux將Redis所用的內存分頁移至swap空間時,將會阻塞Redis進程,導致Redis出現不正常的延遲/proc/<pid>/smaps文件中會保存進程的swap記錄,通過查看這個文件,能夠判斷Redis的延遲是否由Swap產生。如果這個文件中記錄了較大的Swapsize,那么說明延遲很有可能是Swap造成的編輯課件延遲因素優化數據持久化引發的延遲Redis的數據持久化工作本身就會帶來延遲,需要根據數據的平安級別和性能要求制定合理的持久化策略RDB持久化通常會提供比使用AOF更高的性能,但每次RDB快照和AOFRewrite都需要Redis主進程進行fork操作,fork操作本身可能會產生較高的耗時根據具體情況合理配置RDB快照和AOFRewrite時機,防止過于頻繁的fork帶來的延遲可以通過INFO命令返回的latest_fork_usec字段查看上一次fork操作的耗時〔微秒〕編輯課件內存管理優化內存使用率Redis內存使用used_memory超過可用內存的95%,局部數據開始在內存與Swap空間來回交換,嚴重影響性能如果沒有開啟RDB快照或AOF持久化策略,緩存數據在Redis崩潰時會有喪失風險當開啟并觸發快照功能時,Redis會fork一個子進程把當前內存中的數據完全復制一份寫入到硬盤上。因此假設是當前使用內存超過可用內存的45%時觸發快照功能,那么此時進行的內存交換會變的非常危險(可能會喪失數據)。倘假設在這個時候實例上有大量頻繁的更新操作,問題會變得更加嚴重編輯課件內存管理優化內存使用率優化如果緩存數據小于4GB,使用32位的Redis實例可能的使用Hash數據結構設置key的過期時間回收key編輯課件內存管理優化內存回收策略maxmemory-policy“volatile-lru〞:使用LRU算法從已設置過期時間的數據集合中淘汰數據“volatile-ttl〞:從已設置過期時間的數據集合中淘汰即將過期的數據“volatile-random〞:從已設置過期時間的數據集合中隨機淘汰數據“allkeys-lru〞:使用LRU算法從所有數據集合中淘汰數據“allkeys-random〞:從數據集合中任意淘汰數據“no-enviction〞:禁止淘汰數據編輯課件內存管理優化內存碎片率mem_fragmentation_ratio由操系統分配的內存used_memory_rss除以Redis分配的內存used_memory得出內存碎片是由操作系統低效的分配/回收物理內存導致的內存碎片率稍大于1是合理的,這個值表示內存碎片率比較低,也說明redis沒有發生內存交換內存碎片率超過1.5,說明Redis消耗了實際需要物理內存的150%,其中50%是內存碎片內存碎片率低于1,說明Redis內存分配超出了物理內存,操作系統正在進行內存交換編輯課件內存管理優化內存碎片率優化重啟Redis效勞器內存碎片率超過1.5,重啟Redis可讓額外產生的內存碎片失效并作為新內存使用限制內存交換內存碎片率低于1,應增加可用物理內存或減少Redis實例內存占用修改內存分配器Redis支持glibc、jemalloc和tcmalloc等幾種不同的內存分配器,每個分配器在內存分配和碎片上都有不同的實現修改默認內存分配器,需要完全理解這幾種內存分配器的差異,也需重新編譯Redis,不建議普通管理員修改編輯課件內存管理優化優化總結根據業務需要選擇適宜的數據類型為不同的應用場景設置相應的緊湊存儲參數假設業務場景不需要數據持久化,關閉持久化方式用以提高處理性能及內存使用率如果需要使用持久化,根據是否可以容忍重啟喪失局部數據在快照方式與語句追加方式之間選擇其一,不要使用虛擬內存或磁盤存儲方式不要讓Redis所在機器物理內存使用超過實際內存總量的60%編輯課件操作系統優化內存分配控制內核參數vm.overcommit_memoryRedis建議把這個值設置為1,是為了讓fork能夠在低內存下也執行成功swappiness參數決定操作系統使用swap的傾向程度取值范圍是0~100,swappiness的值越大,說明操作系統可能使用swap的概率越高,swappiness值越低,表示操作系統更加傾向于使用物理內存設置方法:echovm.swappiness={bestvalue}>>/etc/sysctl.conf編輯課件操作系統優化TransparentHugePages支持大內存頁(2MB)分配,默認開啟,Redis建議禁用,禁用方法:echonever>/sys/kernel/mm/transparent_hugepage/enabledOOMkillerOOMkiller會在可用內存缺乏時選擇性的殺掉用戶進程對于Redis效勞器來說,可以將所有Redis的oom_adj設置為最低值或者稍小的值,降低被OOMkiller殺掉的概率編輯課件操作系統優化NTP時間同步保證
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年消防工程師資格認證考試試題及答案
- 2025年企業管理咨詢師考試試卷及答案
- 2025年計算機視覺工程師考試試題及答案
- 2025年藥物化學與藥理學考試試題及答案
- 山水度假村客房委托經營管理與服務合同
- 垃圾處理場排放標準提升補充協議
- 文藝電影替身藝術風格演繹協議
- 家庭財產管理與責任風險防范合同
- 高效模具驗收與后期優化服務補充協議
- 《Excel入門教程》課件
- 核磁共振成像
- 工業自動化設備裝配與調試考核試卷
- 2025年低空經濟科普知識競答考試題庫300題(含答案)
- 2025年安徽蚌埠市東方投資集團有限公司招聘筆試參考題庫含答案解析
- 《休閑農業》課件 項目二 休閑農業分類及模式分析
- 三管感染的預防與控制
- 第21課《己亥雜詩(其五)》教學課件【知識精研】統編版語文七年級下冊
- 消除艾滋病、梅毒和乙肝母嬰傳播項目工作制度及流程(模板)
- 2025屆南通市重點中學中考生物模擬試題含解析
- 人教版數學五年級下冊全冊大單元整體教學設計
- 窩溝封閉課件
評論
0/150
提交評論