From 9a9ccab56057b42b11100c8cd0dedfb17d7b293a Mon Sep 17 00:00:00 2001 From: Jason Wilder Date: Tue, 5 Jan 2016 16:12:25 -0700 Subject: [PATCH] Reduce allocation in wal encoder Use sync.Pool for some temporary buffers used while encoding instead of allocatin new ones each time. Also increased the default buffer size which might be too small. Probably need to make this a config var. --- tsdb/engine/tsm1/wal.go | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/tsdb/engine/tsm1/wal.go b/tsdb/engine/tsm1/wal.go index 04ed1d0d5f..21fcca0e0a 100644 --- a/tsdb/engine/tsm1/wal.go +++ b/tsdb/engine/tsm1/wal.go @@ -27,6 +27,9 @@ const ( defaultBufLen = 1024 << 10 // 1MB (sized for batches of 5000 points) + // walEncodeBufSize is the size of the wal entry encoding buffer + walEncodeBufSize = 4 * 1024 * 1024 + float64EntryType = 1 int64EntryType = 2 boolEntryType = 3 @@ -203,14 +206,17 @@ func (l *WAL) LastWriteTime() time.Time { func (l *WAL) writeToLog(entry WALEntry) (int, error) { // encode and compress the entry while we're not locked - bytes := make([]byte, defaultBufLen) + bytes := getBuf(walEncodeBufSize) + defer putBuf(bytes) b, err := entry.Encode(bytes) if err != nil { return -1, err } - compressed := snappy.Encode(b, b) + encBuf := getBuf(snappy.MaxEncodedLen(len(b))) + defer putBuf(encBuf) + compressed := snappy.Encode(encBuf, b) l.mu.Lock() defer l.mu.Unlock() @@ -387,7 +393,7 @@ func (w *WriteWALEntry) Encode(dst []byte) ([]byte, error) { n++ n += copy(dst[n:], u16tob(uint16(len(k)))) - n += copy(dst[n:], []byte(k)) + n += copy(dst[n:], k) n += copy(dst[n:], u32tob(uint32(len(v)))) @@ -642,7 +648,15 @@ func (r *WALSegmentReader) Next() bool { } nReadOK += n - data, err := snappy.Decode(nil, b[:length]) + decLen, err := snappy.DecodedLen(b[:length]) + if err != nil { + r.err = err + return true + } + decBuf := getBuf(decLen) + defer putBuf(decBuf) + + data, err := snappy.Decode(decBuf, b[:length]) if err != nil { r.err = err return true