Redis: แสดงขนาดฐานข้อมูล / ขนาดสำหรับคีย์


92

อินสแตนซ์ redis ของฉันดูเหมือนว่าจะมีขนาดใหญ่ขึ้นมากและฉันต้องการทราบว่าฐานข้อมูลใดที่ฉันมีอยู่ในนั้นใช้หน่วยความจำเท่าใด INFOคำสั่งของ Redis แสดงขนาดรวมและจำนวนคีย์ต่อฐานข้อมูลซึ่งไม่ได้ให้ข้อมูลเชิงลึกมากนัก ... ดังนั้นเครื่องมือ / แนวคิดใด ๆ ที่ให้ข้อมูลเพิ่มเติมเมื่อตรวจสอบเซิร์ฟเวอร์ redis จะได้รับการชื่นชม

เอกสาร Redis ไม่แสดงคำสั่งใด ๆ ที่สามารถคืนหน่วยความจำที่ใช้ไปของคีย์บางปุ่มได้ดังนั้นฉันเดาว่าโค้ดบั๊กกี้ใด ๆ จะเขียน "ถังขยะ" จำนวนมากเพื่อทำซ้ำสิ่งนี้อาจหายากจริงๆ ...

คำตอบ:


115

ดังนั้นวิธีแก้ปัญหาของฉันเอง: หลังจากเล่นไปเรื่อย ๆredis-cliฉันก็พบว่ามันDEBUG OBJECT <key>เผยให้เห็นบางอย่างที่คล้ายกับserializedlengthกุญแจซึ่งอันที่จริงแล้วฉันกำลังมองหา ...

สำหรับฐานข้อมูลทั้งหมดคุณต้องรวบรวมค่าทั้งหมดKEYS *ซึ่งไม่ควรยากเกินไปกับภาษาสคริปต์ที่คุณเลือก ...

สิ่งที่ไม่ดีคือredis.ioไม่มีข้อมูลDEBUG OBJECTมากมายเกี่ยวกับ.


1
ความยาวอนุกรมเป็นขนาดของวัตถุทั้งหมดเป็นไบต์หรือไม่?
raffian

18
@BernhardVallant ขอบคุณสำหรับคำตอบ ฉันเขียนสคริปต์ด่วนที่พิมพ์คีย์ทั้งหมดและขนาดในรูปแบบที่มนุษย์อ่านได้ คิดว่าฉันจะแบ่งปัน :) gist.github.com/epicserve/5699837
Brent O'Connor

13
ค่าความยาวอนุกรมไม่เกี่ยวกับขนาดหน่วยความจำ! เป็นขนาดที่วัตถุจะใช้เมื่อบันทึกลงในไฟล์ RDB บนดิสก์ ตรวจสอบซอร์สโค้ด: github.com/antirez/redis/blob/…และgithub.com/antirez/redis/blob/…
Hugo Tavares

ดูเหมือนจะไม่มีวิธีรับขนาดของคีย์หรือค่าหรือคีย์ - ค่าในหน่วยความจำ (ไม่ใช่ขนาดที่ถ่ายโอนข้อมูลไปยังดิสก์)
Avner Barr

4
FYI: ไม่รำคาญพยายามอะไรกับ DEBUG บน AWS ElastiCache Redis, docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/... กระทั่งพบ redis-cli - บิ๊กกี้จะหยุด
sonjz

73

วิธีแก้ปัญหาจากความคิดเห็นสมควรได้รับคำตอบ:

redis-cli --bigkeys

1
คีย์ขนาดใหญ่เป็นเรื่องเกี่ยวกับขนาดของคีย์ไม่ใช่ขนาดของค่าที่จัดเก็บ .. ดังนั้นคุณอาจมีคีย์ที่aมีค่า 4GB แต่จะไม่ปรากฏในคีย์ขนาดใหญ่ (ดำเนินการโดยgist.github.com/michael-grunder/9257326และdocs.redislabs.com/latest/ri/memory-optimizations/… )
EoghanM

41

MEMORY USAGE key คำสั่งระบุจำนวนไบต์ที่คีย์และค่าต้องการเก็บไว้ใน RAM

การใช้งานที่รายงานคือการจัดสรรหน่วยความจำทั้งหมดสำหรับข้อมูลและค่าโสหุ้ยการดูแลระบบที่คีย์ค่าต้องการ (เอกสารประกอบการเปลี่ยนแหล่งที่มา)


13
สามารถใช้ได้เฉพาะรุ่น> 4.0
teik

15

ลองดูที่โครงการนี้ซึ่งแสดงสถิติที่น่าสนใจเกี่ยวกับคีย์สเปซตาม regex และคำนำหน้า ใช้DEBUG OBJECTคำสั่งและสแกนฐานข้อมูลระบุกลุ่มของคีย์และประมาณเปอร์เซ็นต์ของพื้นที่ที่ใช้

https://github.com/snmaynard/redis-audit

ผลลัพธ์มีลักษณะดังนี้:

Summary  

---------------------------------------------------+--------------+-------------------+---------------------------------------------------  
Key                                                | Memory Usage | Expiry Proportion | Last Access Time                                    
---------------------------------------------------+--------------+-------------------+---------------------------------------------------  
notification_3109439                               | 88.14%       | 0.0%              | 2 minutes                               
user_profile_3897016                               | 11.86%       | 99.98%            | 20 seconds  
---------------------------------------------------+--------------+-------------------+---------------------------------------------------  

หรือสิ่งนี้: https://github.com/sripathikrishnan/redis-rdb-toolsซึ่งทำการวิเคราะห์เต็มรูปแบบในคีย์สเปซทั้งหมดโดยการวิเคราะห์ไฟล์ dump.rdb แบบออฟไลน์ อันนี้ใช้ได้ดีด้วย มันสามารถให้ขนาดเฉลี่ย / นาที / สูงสุดสำหรับรายการในฐานข้อมูลของคุณและจะทำตามคำนำหน้าด้วยซ้ำ


8

คุณอาจพบว่ามีประโยชน์มากในการสุ่มตัวอย่างคีย์ Redis และจัดกลุ่มตามประเภท Salvatore ได้เขียนเครื่องมือที่เรียกว่าredis-samplerซึ่งออกRANDOMKEYคำสั่งประมาณ 10,000 คำสั่งตามด้วยTYPEคีย์ที่ดึงออกมา ภายในไม่กี่วินาทีหรือไม่กี่นาทีคุณจะได้รับมุมมองที่ถูกต้องอย่างเป็นธรรมเกี่ยวกับการกระจายประเภทคีย์

ฉันได้เขียนส่วนขยาย (น่าเสียดายที่ไม่ใช่โอเพ่นซอร์สที่ใดก็ได้เพราะมันเกี่ยวข้องกับงาน) ซึ่งเพิ่มการไตร่ตรองชื่อคีย์ผ่าน regexs เพื่อให้คุณทราบว่าคีย์แอปพลิเคชันประเภทใด (ตามโครงสร้างการตั้งชื่อที่คุณต้องการ โดยใช้) จะถูกเก็บไว้ใน Redis เมื่อรวมกับเอาต์พุตทั่วไปของ redis-sampler สิ่งนี้จะช่วยให้คุณมีความคิดที่ดีมากว่าเกิดอะไรขึ้น


7
Tks จริงช่วยให้ฉันมากกว่าredis-cli --bigkeys
nmat

4

บางทีคุณอาจจะทำการวิปัสสนากับไฟล์ db โปรโตคอลค่อนข้างเรียบง่าย (ยังไม่ได้รับการจัดทำเป็นเอกสารอย่างดี) ดังนั้นคุณสามารถเขียนตัวแยกวิเคราะห์เพื่อระบุว่าคีย์ใดใช้พื้นที่มาก


คำแนะนำใหม่:

คุณลองใช้MONITORเพื่อดูสิ่งที่กำลังเขียนอยู่หรือไม่? บางทีคุณอาจพบปัญหาเกี่ยวกับข้อมูลที่กำลังเคลื่อนไหว


ดูเหมือนจะน่าสนใจ แต่อย่างไรก็ตามฉันพยายามหาวิธีง่ายๆในการตรวจสอบการใช้หน่วยความจำของ redis บนเซิร์ฟเวอร์ ... การตรวจสอบการถ่ายโอนข้อมูลดูเหมือนจะเป็นไปได้มากกว่าสำหรับการดีบักสำหรับฉันไม่ต้องพูดถึงว่าการถ่ายโอนข้อมูลเป็นเพียงไม่กี่ กิ๊กเลย!
Bernhard Vallant

คุณควรถามรายชื่อผู้รับจดหมายของ redis ฉันสนใจที่จะได้ยินคำตอบที่ "ดีที่สุด" สำหรับเรื่องนี้
Donald Miner

ได้ลองแล้วINFOและMONITORแต่ปัญหาหลักก็คือเมื่อไม่ได้ดู redis เติบโตขึ้นอย่างมาก ...
Bernhard Vallant

ตกลงฉันโพสต์ไว้ในรายชื่อผู้รับจดหมาย แต่พบคำตอบด้วยตัวเอง ... ดูด้านล่าง!
Bernhard Vallant

อีกครั้ง วิปัสสนาบนไฟล์ db - ฉันเขียนสคริปต์เพื่อแยกวิเคราะห์ไฟล์ dump.rdb และส่งออกไฟล์ csv ที่รายงานหน่วยความจำโดยประมาณที่ใช้โดยแต่ละคีย์ ดูgithub.com/sripathikrishnan/redis-rdb-tools
Sripathi Krishnan


2

ฉันมักจะชอบวิธีการสุ่มตัวอย่างที่สำคัญในการแก้ปัญหาสถานการณ์ดังกล่าว

redis-cli -p 6379 -n db_number - บิ๊กคีย์

เช่น:-

redis-cli -p 6370 -n 0 - บิ๊กคีย์


เหตุใดจึงเป็นวิธี "การสุ่มตัวอย่างคีย์" ฉันพบว่ามันมีข้อ จำกัด มากเพราะมันแสดงเฉพาะส่วนปลายของภูเขาน้ำแข็ง
MrR

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.