跳转至

性能基准和优化


测试环境

  • 操作系统:Ubuntu 22.04.1 LTS
  • CPU:12th Gen Intel(R) Core(TM) i7-12700H
  • 内存:40GB DDR5-4800
  • DataKit: v1.9.1

JSON 基准

测试数据:

{
    "tcpSeq": "71234234923",
    "language": "C",
    "channel": "26",
    "check_bit": "dSa-aoHjw7b42-dcCE2Sc-aULcaeZav",
    "cid": "2139-02102-213-122341-1190",
    "address": "application/a.out_func_a_64475d386d3:0xfe21023",
    "time": 1681508212100,
    "sub_source": "N",
    "id": 508,
    "status": "ok",
    "cost": 101020 
}

分别使用函数 json()load_json() 函数进行提取

  • load_json()
data = load_json(_)
add_key(tcpSeq, data["tcpSeq"])
add_key(language, data["language"])
add_key(channel, data["channel"])
add_key(check_bit, data["check_bit"])
add_key(cid, data["cid"])
add_key(address, data["address"])
add_key(time, data["time"])
add_key(sub_source, data["sub_source"])
add_key(id, data["id"])
add_key(status, data["status"])
add_key(cost, data["cost"])
  • json()
json(_, tcpSeq, tcpSeq)
json(_, language, language)
json(_, channel, channel)
json(_, check_bit, check_bit)
json(_, cid, cid)
json(_, address, address)
json(_, time, time)
json(_, sub_source, sub_source)
json(_, id, id)
json(_, status, status)
json(_, cost, cost)

基准测试结果:

BenchmarkScript/load_json()-20            202762          5674 ns/op        2865 B/op         61 allocs/op
BenchmarkScript/json()-20                  31024         41463 ns/op       21144 B/op        455 allocs/op

结果上,使用 load_json() 函数相较于 json() 函数在测试数据的处理上的耗时大幅减少,单个脚本的运行时间由 41.46us 减少至 5.67us。

Grok 基准

以 nginx 访问日志为测试数据:

192.168.158.20 - - [19/Jun/2021:04:04:58 +0000] "POST /baxrrrrqc.php?daxd=a%20&d=1 HTTP/1.1" 404 118 "-" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; fr; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8"

使用以下两个脚本进行测试,测试内容为对比不同 Grok 模式对 grok 函数的性能影响,主要优化为将 IPORHOST 替换为 NOTSPACE

  • 优化前的脚本
grok(_, "%{IPORHOST:client_ip} %{NOTSPACE:http_ident} %{NOTSPACE:http_auth} \\[%{HTTPDATE:time}\\] \"%{DATA:http_method} %{GREEDYDATA:http_url} HTTP/%{NUMBER:http_version}\" %{INT:status_code} %{INT:bytes}")

cast(status_code, "int")
cast(bytes, "int")

default_time(time)
  • 优化后的脚本
grok(_, "%{NOTSPACE:client_ip} %{NOTSPACE:http_ident} %{NOTSPACE:http_auth} \\[%{HTTPDATE:time}\\] \"%{DATA:http_method} %{GREEDYDATA:http_url} HTTP/%{NUMBER:http_version}\" %{INT:status_code} %{INT:bytes}")

cast(status_code, "int")
cast(bytes, "int")

default_time(time)

基准测试结果:

BenchmarkScript/grok_nginx-20            19292       67006 ns/op        3828 B/op         42 allocs/op
BenchmarkScript/grok_p1-20              139440        7860 ns/op        3665 B/op         42 allocs/op

结果上,将 Grok 模式 IPORHOST 替换为 NOTSPACE 后,在测试数据的处理上,单个脚本执行耗时由 67us 减少至 7.86 us。

文档评价

文档内容是否对您有帮助? ×