새로운 정보를 깔끔하게 정리해서 이메일로
보내드립니다.
받아보실래요? 좋아요
debug
| 레디스 서버 교육 신청 |
레디스 정기점검/기술지원 Redis Technical Support |
레디스 엔터프라이즈 서버 Redis Enterprise Server |
|---|
레디스 서버 테스트, 디버그 용으로 사용할 수 있는 명령입니다.
redis.io에는 설명이 너무 간단해서,
debug 명령을 활용할 수 있도록 정리했습니다.
Subcommand를 클릭하면 해당 설명 섹션으로 넘어갑니다.
이 문서는 5.0.2를 기준으로 작성되었습니다.
Data Structure 관련 명령
debug 도움말이다.
Help: Crash the server with sigsegv.
redis.io 설명: performs an invalid memory access that crashes Redis.
It is used to simulate bugs during the development.
소스코드: debugCommand() debug.c
debug 명령으로 서버를 crash할 수 있는 subcommand가 4개 있다.
segfault, crash-and-recover, oom, assert
이 중에서 crash-and-recover는 아무 로그도 남기지 않지만,
나머지 3개 subcommand는 버그 리포트를 남긴다.
버그 리포트는 크게 두 부분으로 나눌 수 있는데,
앞 부분은 각 subcommand 마다 다르게 나오고, 이후 부분은 공통이다.
segfault에만 나오는 내용
공통으로 나오는 버그 리포트
Help: Graceful restart: save config, db, restart.
버전 3.2.0에서 추가되었다.
config(설정) 정보를 rewrite 하고, RDB, AOF 데이터를 디스크에 쓰고, 서버를 재시작한다.
재시작은 시스템 콜 execvc()를 실행하므로 같은 PID를 이어받는다.
재시작 시 delay는 없다.
debug.c에서 restartServer(flags,delay=0) 실행한다. 이 function은 server.c에 있다.
flags 정보: flags = (RESTART_SERVER_GRACEFULLY|RESTART_SERVER_CONFIG_REWRITE)
다음은 restartServer()에서 수행해는 내용이다.
Help: Hard crash and restart after <milliseconds> delay.
버전 3.2.0에서 추가되었다.
아무 로그도 남기지 않는다.
위에 설명한 restart 처럼 restartServer(flags,delay=ms) 실행하는데,
플래그(flags = RESTART_SERVER_NONE)를 아무것도 하지 않는 것으로 넘긴다.
milliseconds 후에 execve()로 재시작한다.
Out Of Memory
debug help에는 나오지 않는다.
소스에서는 아래와 같은 방법으로 OOM을 발생시킨다.
ULONG_MAX 값은 18,446,744,073,709,551,615ULL로 18엑사바이트이다.
kB -> MB -> GB -> TB -> PB(페타) -> EB(엑사) -> ZB(제타) -> YB(요타)
Help: Crash by assertion failed.
debug assert하면 bug report를 남기고 레디스 서버가 죽는다.
debug.c에 있는 소스코드는 아래와 같다.
데이터를 RDB 파일에 저장하고, 메모리에 있는 데이터를 지우고, RDB 파일을 다시 읽어들여 메모리에 넣는다. 3개 옵션(MERGE, NOFLUSH, NOSAVE)은 6.0부터 사용 가능합니다.
Help: Flush the AOF buffers on disk and reload the AOF in memory.
AOF가 OFF 일때도 AppendOnlyFile을 읽어들인다.
Help: Show low level info about key and associated value.
redis.io 설명: DEBUG OBJECT is a debugging command that should not be used by clients.
Check the OBJECT command instead.
Object 명령과 비슷한 정보를 보여주지만, 그것보다 더 자세하다.
object 명령에 대한 자세한 내용은 여기를 보세요.
입력된 예로써 각 항목을 설명한다.
Help: Show low level SDS string info representing key and value.
SDS(Simple Dynamic Strings)는 레디스에서 string을 다루는 Library이다.
키와 값의 길이(바이트)와 할당했지만 아직 비어있어 사용 가능한 바이트수를 표시한다.
버전 2.8.0에서 추가되었다.
Help: Create
테스트용 데이터를 생성할 때 사용된다. 버전 3.0에서 추가되었다.
클러스터에서는 사용하지 말 것.
슬롯을 고려하지 않고 dbAdd() function으로 바로 들어가므로 비정상적인 DB 상황이 된다.
Help: Outputs an hex signature representing the current DB content.
DIGEST는 데이터베이스 전체의 해시 값을 20 바이트로 계산합니다.
이 값으로 두 서버 데이터가 같은지 비교할 수 있습니다.
예를 들어 마스터와 슬레이브 DB 데이터가 같은지 확인할 수 있습니다.
이 명령은 CPU를 많이 사용하고, 명령이 수행되는 동안 다른 명령을 실행할 수 없으므로
사용시 주의가 필요합니다.
Help: Output a hex signature of the values of all the specified keys.
지정한 키의 값에 대한 digest값을 계산한다.
Help: Stop the server for
지정한 시간(초) 동안 서버의 모든 기능을 멈춘다.
소수점 이하도 입력할 수 있다.
응답 시간(latency) 테스트 등에 사용된다.
Help: Setting it to 0 disables expiring keys in background
when they are not accessed (otherwise the Redis behavior).
Setting it to 1 reenables back the default.
레디스 서버는 디폴트로 1초에 10번(100ms마다) databasesCron()을 실행해서 만료된(expire) 키를 삭제한다.
이 기능을 활성화(1)/비활성화(0) 할 수 있다.
이 기능은 레디스 서버에 당연히 제공되어야 하는 것이므로 redis.conf에 설정할 수 없고,
debug 명령으로만 가능하다.
만료된 키를 삭제하는 것은 get 같은 명령을 실행할 때도 expire time을 확인해서
지났으면 삭제한다. 명령 실행 시 만료 키 삭제 기능은 100ms마다 만료된 키를 삭제하지만,
그 사이에 access 했을 때를 대비해서이다.
그리고 이 100ms는 redis.conf에 hz 파라미터로 계산(1000/hz) 하는데, hz를 1로 하면 1초에
한 번씩 수행하게 된다.
그러므로 access 시에 만료된 키를 삭제하는 기능은 필요하다.
Help: Setting it to 1 makes Lua replication defaulting to replicating single commands,
without the script having to enable effects replication.
버전 3.2.0에서 추가되었다.
Help: Return a Redis protocol error with
Help: write message to the server log.
버전 5.0에서 추가되었다.
Return the size of different Redis core C structures.
버전 3.2.0에서 추가되었다.
레디스 핵심 C 구조체의 크기(바이트)를 보여준다.
Help: Return hash table statistics of the specified Redis database.
버전 3.2.0에서 추가되었다.
DB 키 통계정보(Hash table)를 보여준다.
Hash table에 대한 설명은 여기를 보세요.
사용법: debug htstats dbid [full]
Help: Like htstats but for the hash table stored as key's value..
키가 hash table에 저장되어 있을 때 hash table 정보를 조회합니다.
키의 내부 data type은
object encoding
명령으로 확인할 수 있습니다.
사용법: debug htstats-key key
Help: Show internal jemalloc statistics.
버전 3.2.0에서 추가되었다. 4.0에서 debug 명령에서는 제거되었고, memory 명령이 새로 생겼다.
4.0에서는 memory malloc-stats 이다.
Jemallc()는 레디스에서 메인으로 사용하고 있는 메모리 할당 알고리즘으로,
미리 정해놓은 단위로 할당함으로써 메모리 할당 속도를 높이고,
메모리 단편화(fragmantation)를 줄일 수 있는 이점이 있다.
Jason Evans가 개발해서 malloc 앞에 JE가 붙었다.
레디스 버전 3.2.0에서는 jemalloc 4.0.3이 사용된다.
Jason Evans가 쓴 jemalloc에 대한 글을 보려면 여기를 클릭하세요
실행 예
Force jemalloc to release unused memory.
버전 3.2.0에서 추가되었다. 4.0에서 debug 명령에서는 제거되었고, memory 명령이 새로 생겼다.
4.0에서는 memory purge 이다.
jemalloc가 사용하지 않는 메모리를 해제한다.
Show low level info about the ziplist encoding.
Data Type이 ziplist 일 때 내부 구조를 자세히 보여준다.
Ziplist 내부구조 그림과 같이 보면 이해하는데 도움이 됩니다.
| 3.0 | 3.2 | 4.0 | 5.0 |
|---|---|---|---|
| assert | assert | assert | assert |
| digest | digest | digest | digest |
| error | error | error | error |
| log | |||
| loadaof | loadaof | loadaof | loadaof |
| object | object | object | object |
| oom | oom | oom | oom |
| populate | populate | populate | populate |
| reload | reload | reload | reload |
| sdslen | sdslen | sdslen | sdslen |
| segfault | segfault | segfault | segfault |
| set-active-expire | set-active-expire | set-active-expire | set-active-expire |
| sleep | sleep | sleep | sleep |
| crash-and-recover | crash-and-recover | crash-and-recover | |
| htstats | htstats | htstats | |
| htstats-key | |||
| jemalloc info | |||
| jemalloc purge | |||
| lua-always-replicate-commands | lua-always-replicate-commands | lua-always-replicate-commands | |
| restart | restart | restart | |
| structsize | structsize | structsize | |
| panic | panic | ||
| ziplist | ziplist | ||
| change-repl-id |
| << INFO | DEBUG | SLOWLOG >> |
|---|