From 0ecc814c8130a2258cdd108e1fc22edb399e8246 Mon Sep 17 00:00:00 2001 From: "zhaozhao.zz" <276441700@qq.com> Date: Mon, 17 May 2021 21:57:17 +0800 Subject: [PATCH] AOF: remove memmove in aofChildWriteDiffData and record the latency (#5362) Improve performance by avoiding inefficiencies in the parent process during AOFRW. * AOF: record the latency of aofChildWriteDiffData * AOF: avoid memmove in aofChildWriteDiffData --- src/aof.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/aof.c b/src/aof.c index 0d2971eac..35856f49b 100644 --- a/src/aof.c +++ b/src/aof.c @@ -60,7 +60,7 @@ void aofClosePipes(void); #define AOF_RW_BUF_BLOCK_SIZE (1024*1024*10) /* 10 MB per block */ typedef struct aofrwblock { - unsigned long used, free; + unsigned long used, free, pos; char buf[AOF_RW_BUF_BLOCK_SIZE]; } aofrwblock; @@ -96,29 +96,31 @@ void aofChildWriteDiffData(aeEventLoop *el, int fd, void *privdata, int mask) { listNode *ln; aofrwblock *block; ssize_t nwritten; + mstime_t latency; UNUSED(el); UNUSED(fd); UNUSED(privdata); UNUSED(mask); + latencyStartMonitor(latency); while(1) { ln = listFirst(server.aof_rewrite_buf_blocks); block = ln ? ln->value : NULL; if (server.aof_stop_sending_diff || !block) { aeDeleteFileEvent(server.el,server.aof_pipe_write_data_to_child, AE_WRITABLE); - return; + break; } - if (block->used > 0) { + if (block->used != block->pos) { nwritten = write(server.aof_pipe_write_data_to_child, - block->buf,block->used); - if (nwritten <= 0) return; - memmove(block->buf,block->buf+nwritten,block->used-nwritten); - block->used -= nwritten; - block->free += nwritten; + block->buf+block->pos,block->used-block->pos); + if (nwritten <= 0) break; + block->pos += nwritten; } - if (block->used == 0) listDelNode(server.aof_rewrite_buf_blocks,ln); + if (block->used == block->pos) listDelNode(server.aof_rewrite_buf_blocks,ln); } + latencyEndMonitor(latency); + latencyAddSampleIfNeeded("aof-rewrite-write-data-to-child",latency); } /* Append data to the AOF rewrite buffer, allocating new blocks if needed. */ @@ -146,6 +148,7 @@ void aofRewriteBufferAppend(unsigned char *s, unsigned long len) { block = zmalloc(sizeof(*block)); block->free = AOF_RW_BUF_BLOCK_SIZE; block->used = 0; + block->pos = 0; listAddNodeTail(server.aof_rewrite_buf_blocks,block); /* Log every time we cross more 10 or 100 blocks, respectively @@ -181,9 +184,9 @@ ssize_t aofRewriteBufferWrite(int fd) { aofrwblock *block = listNodeValue(ln); ssize_t nwritten; - if (block->used) { - nwritten = write(fd,block->buf,block->used); - if (nwritten != (ssize_t)block->used) { + if (block->used != block->pos) { + nwritten = write(fd,block->buf+block->pos,block->used-block->pos); + if (nwritten != (ssize_t)(block->used-block->pos)) { if (nwritten == 0) errno = EIO; return -1; }