【压测数据分享】VictoriaLogs 中使用 elasticsearch 格式写入对比 jsonline 格式写入的性能差异
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!
通过阅读源码发现,当使用 elasticsearch 格式写入 vlogs 时,明显做了更多繁重的计算:
// /github.com/VictoriaMetrics/VictoriaLogs/app/vlinsert/elasticsearch/elasticsearch.go
// es 格式日志的写入
func readBulkLine(lr *insertutil.LineReader, timeFields, msgFields []string, lmp insertutil.LogMessageProcessor) (bool, error) {
var line []byte
// Read the command, must be "create" or "index"
for len(line) == 0 {
if !lr.NextLine() {
err := lr.Err()
return false, err
}
line = lr.Line
}
lineStr := bytesutil.ToUnsafeString(line)
// 每行日志,都对应着一行 create. 这实在太浪费了
if !strings.Contains(lineStr, `"create"`) && !strings.Contains(lineStr, `"index"`) {
return false, fmt.Errorf(`unexpected command %q; expecting "create" or "index"`, line)
}
// Decode log message
if !lr.NextLine() {
if err := lr.Err(); err != nil {
return false, err
}
return false, fmt.Errorf(`missing log message after the "create" or "index" command`)
}
// ...
}
于是我尝试使用 jsonline 的格式来传输日志。
效果如下:
网络流量下降明显

181 mb/s => 14.8 mb/s,减少 12.2 倍。(注意:elasticsearch 格式和 jsonline 格式都开启了 zstd 压缩。)

out 流量同样下降明显。
CPU
因为抖动较大,很难说下降了多少。
感觉上是下降了的:

其他指标未见明显变化。
内存抖动较大,不确定增减情况。但是在切换日志格式后的前面几分钟内下降明显。
总结
不管怎么样,从网络流量上看,jsonline 格式比 elasticsearch 格式优很多。推荐使用 jsonline 格式。
这次切换还发生了另一个插曲,可能是 vlogs 的 bug。有兴趣可以看看这个 issue: When the vector's sink format was changed from Elasticsearch to JSONline, the in-memory merge of vlogs stopped for 7 minutes.

浙公网安备 33010602011771号