自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Redis內(nèi)存爆炸增長?你需要知道這一套Redis內(nèi)存分析方法

存儲 存儲軟件 Redis
Redis是當(dāng)前比較熱門的NOSQL數(shù)據(jù)庫之一,和Memcache一樣,數(shù)據(jù)都是緩存在計算機(jī)內(nèi)存中。完全開源免費(fèi),遵守BSD協(xié)議,是一個高性能的key-value數(shù)據(jù)庫。通過在內(nèi)存中讀寫數(shù)據(jù),大大提高了數(shù)據(jù)讀寫速度,可以說Redis是實(shí)現(xiàn)網(wǎng)站高并發(fā)不可或缺的一部分。

Redis介紹

Redis是當(dāng)前比較熱門的NOSQL數(shù)據(jù)庫之一,和Memcache一樣,數(shù)據(jù)都是緩存在計算機(jī)內(nèi)存中。完全開源免費(fèi),遵守BSD協(xié)議,是一個高性能的key-value數(shù)據(jù)庫。通過在內(nèi)存中讀寫數(shù)據(jù),大大提高了數(shù)據(jù)讀寫速度,可以說Redis是實(shí)現(xiàn)網(wǎng)站高并發(fā)不可或缺的一部分。

[[280052]]

Redis內(nèi)存占用分布

Redis作為內(nèi)存數(shù)據(jù)庫,在內(nèi)存中存儲的內(nèi)容主要是數(shù)據(jù)(鍵值對);除了數(shù)據(jù)以外,Redis的其他部分也會占用內(nèi)存,內(nèi)存占用主要可以劃分為以下幾個部分:

數(shù)據(jù)

數(shù)據(jù)是數(shù)據(jù)庫最主要的組成部分。Redis使用鍵值對存儲數(shù)據(jù),其中包括五種類型:字符串、哈希、列表、集合、有序集合。

本身運(yùn)行需要的內(nèi)存

Redis本身也是一個程序,主進(jìn)程運(yùn)行及創(chuàng)建的子進(jìn)程運(yùn)行也需要占用內(nèi)存,但這部分占用內(nèi)存極少,大多數(shù)情況下可以忽略。

緩沖內(nèi)存

緩沖內(nèi)存包括客戶端緩沖區(qū)、復(fù)制積壓緩沖區(qū)、AOF緩沖區(qū)等,這部分占用內(nèi)存也很少。

內(nèi)存碎片

內(nèi)存碎片是Redis在分配、回收物理內(nèi)存過程中產(chǎn)生的。內(nèi)存碎片產(chǎn)生原因主要是對數(shù)據(jù)的頻繁修改造成,導(dǎo)致Redis釋放的空間在物理內(nèi)存中并沒有被釋放。若Redis服務(wù)器中內(nèi)存碎片很大,可以通過安全重啟方式釋放內(nèi)存。

Redis內(nèi)存分析過程

分析Redis內(nèi)存我們一般會采用bgsave生成dump.rdb文件再結(jié)合redis-rdb-tools和 sqlite或其他數(shù)據(jù)庫來進(jìn)行靜態(tài)分析。

BGSAVE:在后臺異步(Asynchronously)保存當(dāng)前數(shù)據(jù)庫的數(shù)據(jù)到磁盤。

BGSAVE 命令執(zhí)行之后立即返回 OK,然后 Redis fork 出一個新子進(jìn)程,原來的 Redis 進(jìn)程(父進(jìn)程)繼續(xù)處理客戶端請求,而子進(jìn)程則負(fù)責(zé)將數(shù)據(jù)保存到磁盤,然后退出。

生成內(nèi)存快照:redis-rdb-tools 是一個 python 的解析 rdb 文件的工具,在分析內(nèi)存的時候,主要用它生成內(nèi)存快照。

安裝redis-rdb-tools

1.使用pip安裝

  1. # pip install rdbtools 

2.使用源碼安裝

  1. # git clone https://github.com/sripathikrishnan/redis-rdb-tools 
  2. # cd redis-rdb-tools 
  3. # sudo python setup.py install 

使用redis-rdb-tools 生成內(nèi)存快照

  1. # rdb -c memory dump.rdb > memory.csv 

執(zhí)行完后會生成 CSV 格式的內(nèi)存報告。包含的列有:數(shù)據(jù)庫 ID,數(shù)據(jù)類型,key,內(nèi)存使用量(byte),編碼。內(nèi)存使用量包含 key、value 和其他值。

  1. $head memory.csv 
  2. database,type,key,size_in_bytes,encoding,num_elements,len_largest_element 
  3. 0,string,coupon.id:652601465,112,string,8,8 
  4. 0,string,coupon.id:631354838,112,string,8,8 
  5. 0,string,coupon.id:632477800,112,string,8,8 
  6. 0,string,coupon.id:620902294,112,string,8,8 
  7. 0,string,coupon.id:631432959,112,string,8,8 
  8. 0,string,coupon.id:632933399,112,string,8,8 
  9. 0,string,coupon.id:632117725,112,string,8,8 
  10. 0,string,coupon.id:634240609,112,string,8,8 
  11. 0,string,coupon.id:646312603,112,string,8,8 

使用SQLite分析內(nèi)存快照

SQLite版本必須是3.16.0以上。

導(dǎo)入之前生成的csv文件:

  1. $sqlite3 memory.db 
  2. SQLite version 3.19.3 2017-06-27 16:48:08 
  3. Enter ".help" for usage hints. 
  4. sqlite> create table memory(database int,type varchar(128),key varchar(128),size_in_bytes int,encoding varchar(128),num_elements int,len_largest_element varchar(128)); 
  5. sqlite> .mode csv memory 
  6. sqlite> .import memory.csv memory 

數(shù)據(jù)導(dǎo)入后,可以使用sql來查詢我們所需的內(nèi)容。

示例:

查詢內(nèi)容占用最高的幾個key:

  1. sqlite> select key,size_in_bytes from memory order by size_in_bytes desc limit 10; 
  2. key,size_in_bytes 
  3. xx.xx:xx,7860169636 
  4. xx.xx:xx,3043206524 
  5. xx.xx:xx,1866022916 
  6. xx.xx:xx,420931316 
  7. xx.xx:xx,171118172 
  8. xx.xx:xx,162984940 
  9. xx.xx:xx,133443892 
  10. xx.xx:xx,80925132 
  11. xx.xx:xx,28340356 

查詢出占用內(nèi)容較高的key,做相應(yīng)策略即可,快速止血方案可以刪掉這些key來釋放內(nèi)存,長期來看,此類key設(shè)計必然不合理,業(yè)務(wù)層可能也會有問題,需要與研發(fā)一起制定方案。

后記

Redis使用起來很簡單,但是用好卻不容易。工作中作者至少遇到了兩次因為Redis key設(shè)計不合理而導(dǎo)致Redis內(nèi)存爆炸式增長的事故。查找出設(shè)計不合理的key并處理掉雖然可以解決問題,但是卻是治標(biāo)不治本,想要從根本解決,還得有一套Redis使用規(guī)范,當(dāng)然這套規(guī)范就不在本文的討論范圍內(nèi)了。

 

責(zé)任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2022-07-15 14:58:26

數(shù)據(jù)分析人工智能IT

2021-03-26 08:01:29

v-model指令模板

2018-08-01 10:40:04

Redis內(nèi)存增長

2020-03-03 14:35:34

LinuxRedis命令

2021-11-04 11:54:30

Linux內(nèi)存系統(tǒng)

2019-04-10 10:43:15

Redis內(nèi)存淘汰策略

2023-02-01 08:13:30

Redis內(nèi)存碎片

2018-07-20 08:44:21

Redis內(nèi)存排查

2023-02-10 08:44:05

KafkaLinkedIn模式

2020-12-08 08:12:14

SQL腳本行轉(zhuǎn)列

2011-05-27 09:28:26

網(wǎng)站加載時間

2023-01-30 11:43:04

開源代碼

2011-09-20 10:56:35

云計算PaaS

2018-09-10 09:26:33

2022-04-29 09:00:00

Platform架構(gòu)內(nèi)核線程

2022-08-10 09:03:35

TypeScript前端

2018-02-08 08:08:12

2022-07-06 10:07:21

物聯(lián)網(wǎng)IoT

2022-09-01 15:26:45

物聯(lián)網(wǎng)人工智能傳感器

2018-06-15 23:00:56

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號