Limit memory used by big SLOWLOG entries.
Two limits are added: 1) Up to SLOWLOG_ENTRY_MAX_ARGV arguments are logged. 2) Up to SLOWLOG_ENTRY_MAX_STRING bytes per argument are logged. 3) slowlog-max-len is set to 128 by default (was 1024). The number of remaining arguments / bytes is logged in the entry so that the user can understand better the nature of the logged command.
This commit is contained in:
parent
fd72fe261d
commit
d3701d2714
@ -447,7 +447,7 @@ slowlog-log-slower-than 10000
|
|||||||
|
|
||||||
# There is no limit to this length. Just be aware that it will consume memory.
|
# There is no limit to this length. Just be aware that it will consume memory.
|
||||||
# You can reclaim memory used by the slow log with SLOWLOG RESET.
|
# You can reclaim memory used by the slow log with SLOWLOG RESET.
|
||||||
slowlog-max-len 1024
|
slowlog-max-len 128
|
||||||
|
|
||||||
############################### ADVANCED CONFIG ###############################
|
############################### ADVANCED CONFIG ###############################
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@
|
|||||||
#define REDIS_AOF_REWRITE_MIN_SIZE (1024*1024)
|
#define REDIS_AOF_REWRITE_MIN_SIZE (1024*1024)
|
||||||
#define REDIS_AOF_REWRITE_ITEMS_PER_CMD 64
|
#define REDIS_AOF_REWRITE_ITEMS_PER_CMD 64
|
||||||
#define REDIS_SLOWLOG_LOG_SLOWER_THAN 10000
|
#define REDIS_SLOWLOG_LOG_SLOWER_THAN 10000
|
||||||
#define REDIS_SLOWLOG_MAX_LEN 64
|
#define REDIS_SLOWLOG_MAX_LEN 128
|
||||||
#define REDIS_MAX_CLIENTS 10000
|
#define REDIS_MAX_CLIENTS 10000
|
||||||
|
|
||||||
#define REDIS_REPL_TIMEOUT 60
|
#define REDIS_REPL_TIMEOUT 60
|
||||||
|
@ -16,13 +16,36 @@
|
|||||||
* this function. */
|
* this function. */
|
||||||
slowlogEntry *slowlogCreateEntry(robj **argv, int argc, long long duration) {
|
slowlogEntry *slowlogCreateEntry(robj **argv, int argc, long long duration) {
|
||||||
slowlogEntry *se = zmalloc(sizeof(*se));
|
slowlogEntry *se = zmalloc(sizeof(*se));
|
||||||
int j;
|
int j, slargc = argc;
|
||||||
|
|
||||||
se->argc = argc;
|
if (slargc > SLOWLOG_ENTRY_MAX_ARGC) slargc = SLOWLOG_ENTRY_MAX_ARGC;
|
||||||
se->argv = zmalloc(sizeof(robj*)*argc);
|
se->argc = slargc;
|
||||||
for (j = 0; j < argc; j++) {
|
se->argv = zmalloc(sizeof(robj*)*slargc);
|
||||||
se->argv[j] = argv[j];
|
for (j = 0; j < slargc; j++) {
|
||||||
incrRefCount(argv[j]);
|
/* Logging too many arguments is a useless memory waste, so we stop
|
||||||
|
* at SLOWLOG_ENTRY_MAX_ARGC, but use the last argument to specify
|
||||||
|
* how many remaining arguments there were in the original command. */
|
||||||
|
if (slargc != argc && j == slargc-1) {
|
||||||
|
se->argv[j] = createObject(REDIS_STRING,
|
||||||
|
sdscatprintf(sdsempty(),"... (%d more arguments)",
|
||||||
|
argc-slargc+1));
|
||||||
|
} else {
|
||||||
|
/* Trim too long strings as well... */
|
||||||
|
if (argv[j]->type == REDIS_STRING &&
|
||||||
|
argv[j]->encoding == REDIS_ENCODING_RAW &&
|
||||||
|
sdslen(argv[j]->ptr) > SLOWLOG_ENTRY_MAX_STRING)
|
||||||
|
{
|
||||||
|
sds s = sdsnewlen(argv[j]->ptr, SLOWLOG_ENTRY_MAX_STRING);
|
||||||
|
|
||||||
|
s = sdscatprintf(s,"... (%lu more bytes)",
|
||||||
|
(unsigned long)
|
||||||
|
sdslen(argv[j]->ptr) - SLOWLOG_ENTRY_MAX_STRING);
|
||||||
|
se->argv[j] = createObject(REDIS_STRING,s);
|
||||||
|
} else {
|
||||||
|
se->argv[j] = argv[j];
|
||||||
|
incrRefCount(argv[j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
se->time = time(NULL);
|
se->time = time(NULL);
|
||||||
se->duration = duration;
|
se->duration = duration;
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
#define SLOWLOG_ENTRY_MAX_ARGC 32
|
||||||
|
#define SLOWLOG_ENTRY_MAX_STRING 128
|
||||||
|
|
||||||
/* This structure defines an entry inside the slow log list */
|
/* This structure defines an entry inside the slow log list */
|
||||||
typedef struct slowlogEntry {
|
typedef struct slowlogEntry {
|
||||||
robj **argv;
|
robj **argv;
|
||||||
|
@ -38,4 +38,21 @@ start_server {tags {"slowlog"} overrides {slowlog-log-slower-than 1000000}} {
|
|||||||
assert_equal [expr {[lindex $e 2] > 100000}] 1
|
assert_equal [expr {[lindex $e 2] > 100000}] 1
|
||||||
assert_equal [lindex $e 3] {debug sleep 0.2}
|
assert_equal [lindex $e 3] {debug sleep 0.2}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test {SLOWLOG - commands with too many arguments are trimmed} {
|
||||||
|
r config set slowlog-log-slower-than 0
|
||||||
|
r slowlog reset
|
||||||
|
r sadd set 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
||||||
|
set e [lindex [r slowlog get] 0]
|
||||||
|
lindex $e 3
|
||||||
|
} {sadd set 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 {... (2 more arguments)}}
|
||||||
|
|
||||||
|
test {SLOWLOG - too long arguments are trimmed} {
|
||||||
|
r config set slowlog-log-slower-than 0
|
||||||
|
r slowlog reset
|
||||||
|
set arg [string repeat A 129]
|
||||||
|
r sadd set foo $arg
|
||||||
|
set e [lindex [r slowlog get] 0]
|
||||||
|
lindex $e 3
|
||||||
|
} {sadd set foo {AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA... (1 more bytes)}}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user