Redis : 키의 데이터베이스 크기 / 크기 표시


88

내 redis 인스턴스가 매우 커지고있는 것으로 보이며 거기에있는 여러 데이터베이스 중 어느 것이 얼마나 많은 메모리를 사용하는지 알고 싶습니다. Redis의 INFO명령은 데이터베이스 당 총 크기와 키 수를 보여 주므로 많은 통찰력을 얻지 못합니다. 따라서 redis 서버를 모니터링 할 때 더 많은 정보를 제공하는 도구 / 아이디어는 감사하겠습니다.

Redis 문서는 특정 키의 소모 된 메모리를 반환 할 수있는 명령을 표시하지 않습니다. 따라서 버그가있는 코드가 redis에 많은 "쓰레기"를 작성하면 찾기가 정말 어려울 수 있습니다.

답변:


113

그래서 내 자신의 문제에 대한 나의 해결책 : redis-cli조금 더 오래 놀아 본 후 나는 실제로 내가 찾던 무언가였던 of key DEBUG OBJECT <key>와 같은 것을 드러내는 것을 발견했습니다 serializedlength.

전체 데이터베이스 KEYS *의 경우 선택한 스크립팅 언어로 너무 어렵지 않아야하는 모든 값을 집계 해야합니다.

나쁜 점은 redis.io 에 DEBUG OBJECT.


1
직렬화 된 길이가 전체 객체의 크기 (바이트)입니까?
— raffian

18
@BernhardVallant, 답변 주셔서 감사합니다. 저는 모든 키와 크기를 사람이 읽을 수있는 형식으로 인쇄하는 빠른 스크립트를 작성했습니다. 내가 나눌 것이라고 생각했다. :) gist.github.com/epicserve/5699837
— 브렌트 오코너

13
serializedlength 의 값 은 메모리 크기에 관한 것이 아닙니다! 디스크의 RDB 파일에 저장할 때 개체가 차지하는 크기입니다. 소스 코드를 확인 : github.com/antirez/redis/blob/... 및 github.com/antirez/redis/blob/...
— 휴고 타바레스

키 또는 메모리의 값 또는 키 - 값합니다 (디스크의 크기를 덤프하지 않음)의 크기를 얻을 수있는 방법이있을 것 같지 않습니다
— 애브너 바

4
참고 : AWS ElastiCache Redis, docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/… 에서 DEBUG로 아무것도 시도하지 마십시오 . 심지어 발견 레디 스-CLI --bigkeys은 멈출 것
— sonjz


40

MEMORY USAGE key 명령은 키와 해당 값을 RAM에 저장하는 데 필요한 바이트 수를 제공합니다.

보고 된 사용량은 키 값에 필요한 데이터 및 관리 오버 헤드에 대한 총 메모리 할당입니다 (소스 redis 문서).


11
이 단지가 될 수 사용 버전> 4.0
— teik

15

이 프로젝트를 살펴보면 정규식과 접두사를 기반으로 키 스페이스에 대한 흥미로운 통계가 출력됩니다. DEBUG OBJECT명령을 사용하고 db를 스캔하여 키 그룹을 식별하고 차지하고있는 공간의 백분율을 추정합니다.

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 파일을 분석하여 전체 키 공간에 대한 전체 분석을 수행합니다. 이것도 잘 작동합니다. db의 항목에 대한 평균 / 최소 / 최대 크기를 제공 할 수 있으며 접두사를 기반으로 할 수도 있습니다.


8

Redis 키를 샘플링하고 유형별로 그룹화하는 것이 매우 유용 할 수 있습니다. Salvatore는 검색된 키에 따라 약 10000 개의 명령을 실행 하는 redis-sampler 라는 도구를 작성했습니다 . 몇 초 또는 몇 분 만에 키 유형의 분포를 상당히 정확하게 볼 수 있습니다.RANDOMKEYTYPE

나는 확장 프로그램을 작성했습니다 (불행히도 작업과 관련이 있기 때문에 오픈 소스가 아닙니다).이 확장 프로그램은 정규식을 통해 키 이름에 대한 약간의 내성을 추가하여 어떤 종류의 응용 프로그램 키에 대한 아이디어를 제공합니다. 사용), Redis에 저장됩니다. redis-sampler의보다 일반적인 출력과 결합하면 무슨 일이 일어나고 있는지 매우 좋은 아이디어를 얻을 수 있습니다.


7
Tks, 실제로 더 많은 도움이redis-cli --bigkeys
— nmat

4

아마도 db 파일에 대해 몇 가지 내부 검사를 수행 할 수 있습니다. 프로토콜은 비교적 간단합니다 (아직 잘 문서화되어 있지 않음). 따라서 어떤 개별 키가 많은 공간을 차지하는지 확인하기 위해 파서를 작성할 수 있습니다.


새로운 제안 :

MONITOR작성중인 내용을 확인하기 위해 사용해 보셨습니까 ? 이동중인 데이터에서 문제를 찾을 수있을 것입니다.


흥미로운 것 같지만 그럼에도 불구하고 서버에서 redis의 메모리 소비를 모니터링하는 쉬운 방법을 찾으려고합니다. 지금 공연!
— Bernhard Vallant

redis 메일 링리스트에 문의해야합니다. 나는 이것에 대한 "최상의"대답을 듣는 것이 정말 흥미 롭습니다.
— Donald Miner

그런데 이미 시도 INFO하고 MONITOR, 수 있지만 큰 문제는, 레디 스를보고하지 않을 경우 정말 큰 성장 것을 ...
— 베른하르트 Vallant

Ok 나는 그것을 그들의 메일 링리스트에 올렸지 만, 나 자신도 답을 찾았습니다. 아래를보세요!
— Bernhard Vallant 2011 년

레. db 파일에 대한 introspection-dump.rdb 파일을 구문 분석하는 스크립트를 작성하고 각 키에서 사용하는 대략적인 메모리를보고하는 csv 파일을 출력했습니다. 참조 github.com/sripathikrishnan/redis-rdb-tools
— Sripathi Krishnan


1

일반적으로 이러한 시나리오의 문제를 해결하기 위해 키 샘플링 방법을 선호합니다.

redis-cli -p 6379 -n db_number --bigkeys

예 :-

redis-cli -p 6370 -n 0 --bigkeys


이것이 "키 샘플링"방법 인 이유는 무엇입니까? 빙산의 일각만을 보여주기 때문에 매우 제한적이라고 생각합니다.
— MrR

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.