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


88

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

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

답변:


113

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

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

나쁜 점은 redis.ioDEBUG 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.