提交 81f32c7b 编写于 作者: A antirez

New INFO field aof_delayed_fsync introduced.

This new field counts all the times Redis is configured with AOF enabled and
fsync policy 'everysec', but the previous fsync performed by the
background thread was not able to complete within two seconds, forcing
Redis to perform a write against the AOF file while the fsync is still
in progress (likely a blocking operation).
上级 754643c1
...@@ -108,6 +108,7 @@ void flushAppendOnlyFile(int force) { ...@@ -108,6 +108,7 @@ void flushAppendOnlyFile(int force) {
} }
/* Otherwise fall trough, and go write since we can't wait /* Otherwise fall trough, and go write since we can't wait
* over two seconds. */ * over two seconds. */
server.aof_delayed_fsync++;
redisLog(REDIS_NOTICE,"Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis."); redisLog(REDIS_NOTICE,"Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis.");
} }
} }
......
...@@ -852,6 +852,7 @@ void configCommand(redisClient *c) { ...@@ -852,6 +852,7 @@ void configCommand(redisClient *c) {
server.stat_numcommands = 0; server.stat_numcommands = 0;
server.stat_numconnections = 0; server.stat_numconnections = 0;
server.stat_expiredkeys = 0; server.stat_expiredkeys = 0;
server.aof_delayed_fsync = 0;
resetCommandTableStats(); resetCommandTableStats();
addReply(c,shared.ok); addReply(c,shared.ok);
} else { } else {
......
...@@ -991,6 +991,7 @@ void initServerConfig() { ...@@ -991,6 +991,7 @@ void initServerConfig() {
server.aof_rewrite_base_size = 0; server.aof_rewrite_base_size = 0;
server.aof_rewrite_scheduled = 0; server.aof_rewrite_scheduled = 0;
server.aof_last_fsync = time(NULL); server.aof_last_fsync = time(NULL);
server.aof_delayed_fsync = 0;
server.aof_fd = -1; server.aof_fd = -1;
server.aof_selected_db = -1; /* Make sure the first time will not match */ server.aof_selected_db = -1; /* Make sure the first time will not match */
server.aof_flush_postponed_start = 0; server.aof_flush_postponed_start = 0;
...@@ -1760,12 +1761,14 @@ sds genRedisInfoString(char *section) { ...@@ -1760,12 +1761,14 @@ sds genRedisInfoString(char *section) {
"aof_base_size:%lld\r\n" "aof_base_size:%lld\r\n"
"aof_pending_rewrite:%d\r\n" "aof_pending_rewrite:%d\r\n"
"aof_buffer_length:%zu\r\n" "aof_buffer_length:%zu\r\n"
"aof_pending_bio_fsync:%llu\r\n", "aof_pending_bio_fsync:%llu\r\n"
"aof_delayed_fsync:%lu\r\n",
(long long) server.aof_current_size, (long long) server.aof_current_size,
(long long) server.aof_rewrite_base_size, (long long) server.aof_rewrite_base_size,
server.aof_rewrite_scheduled, server.aof_rewrite_scheduled,
sdslen(server.aof_buf), sdslen(server.aof_buf),
bioPendingJobsOfType(REDIS_BIO_AOF_FSYNC)); bioPendingJobsOfType(REDIS_BIO_AOF_FSYNC),
server.aof_delayed_fsync);
} }
if (server.loading) { if (server.loading) {
......
...@@ -509,6 +509,7 @@ struct redisServer { ...@@ -509,6 +509,7 @@ struct redisServer {
int aof_selected_db; /* Currently selected DB in AOF */ int aof_selected_db; /* Currently selected DB in AOF */
time_t aof_flush_postponed_start; /* UNIX time of postponed AOF flush */ time_t aof_flush_postponed_start; /* UNIX time of postponed AOF flush */
time_t aof_last_fsync; /* UNIX time of last fsync() */ time_t aof_last_fsync; /* UNIX time of last fsync() */
unsigned long aof_delayed_fsync; /* delayed AOF fsync() counter */
/* RDB persistence */ /* RDB persistence */
long long dirty; /* Changes to DB from the last save */ long long dirty; /* Changes to DB from the last save */
long long dirty_before_bgsave; /* Used to restore dirty on failed BGSAVE */ long long dirty_before_bgsave; /* Used to restore dirty on failed BGSAVE */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册