2017-10-18 1 views
1

Redis SLOWLOG은 속도가 느린 명령의 시간을 redis로 기록합니다. 기록 된 시간은 마이크로 초입니다. 그러나 시간이 CPU 시간인지 아니면 실시간인지 확실하지 않습니다. 따라서 시스템에 부하가 많이 걸리고 redis 프로세스가 굶어 죽는다면 그렇지 않으면 빠른 명령에서 더 느린 로그 항목이 발생하게됩니까?redis SLOWLOG 명령은 CPU 시간 또는 실시간을 측정합니까?

답변

2

SLOWLOG는 CPU가 아닌 벽시계 감각으로 시간을줍니다. 명령이 실행 시간에 대해 구성된 임계 값을 초과하면 항목이 로그에 추가됩니다. CPU가 굶고 일반 또는 빠른 작업을 완료하는 데 시간이 오래 걸리고 임계 값을 초과하면 실제로 로그에 추가됩니다.

+0

감사합니다. 따라서 CPU가 부족한 컴퓨터가있는 경우에는 CPU가없는 컴퓨터보다 느린 로그 항목이 많을 것으로 예상됩니다. –

+0

네, 맞습니다. –

1

Redis는 CPU 1 대신 실시간으로 사용합니다.

인터넷을 검색 한 결과 redis slowlog (http://blog.wjin.org/posts/redis-slowlog.html)에 대한 흥미로운 링크를 발견 했으므로 Redis 소스 코드를 검색 할 수있는 아이디어를 얻었습니다. 이 데이터는 slowlog this function
void slowlogPushEntryIfNeeded(client *c, robj **argv, int argc, long long duration);의 호출에 의해 첨가하는 것이 밝혀 소스 코드에 따라

.

검색 후이 기능이 server.c 파일 내부에서만 호출됩니다.

은 그러므로 시간이 기록되며, 이는 [이 코드]으로부터 생성된다 (https://github.com/antirez/redis/blob/bb3b5ddd1968d2715acc37b63124ccf461276160/src/server.c#L2207)

start = ustime(); 
c->cmd->proc(c); 
duration = ustime()-start; 

그리고 ustime는 following source code로 제조된다.

/* Return the UNIX time in microseconds */ 
long long ustime(void) { 
    struct timeval tv; 
    long long ust; 

    gettimeofday(&tv, NULL); 
    ust = ((long long)tv.tv_sec)*1000000; 
    ust += tv.tv_usec; 
    return ust; 
} 

그래서 gettimeofday 인 기간 생산을 담당하며 CPU 대신 실제 시간을 표시합니다.

+0

좋은 답변이지만 다른 답변에 대한 올바른 답을 이미 받았습니다. –