Fluent Bit 5.2 / performance benchmarks
Measured performance.
See the complete picture.
Explore Fluent Bit v5.2 throughput, CPU, memory, and buffering measurements under documented workload conditions.
Workload-specific results under the conditions described with each comparison. Compare throughput, CPU, and memory together.
Highlights describe specific measured workloads. Results depend on the pipeline, buffering, and hardware. CPU and memory tradeoffs are included below.
OpenTelemetry log ingestion and transformation
Fluent Bit 5.2 reaches 1.50 million JSON records/s and 1.43 million Protobuf records/s when adding one log attribute with memory buffering. It has the highest throughput in all eight measured ingestion and transformation cases.
The transformation is the same across systems: set bench.added = "yes" on every log. Both Fluent Bit versions use content_modifier; Collector 0.163 uses its transform processor / OTTL. This comparison does not use FTS. All systems complete 30 million records per run with null outputs.
Memory buffering
million records / sHigher is better. Median of five runs; 30M completed records/run, including sending and final drain. Both buffering panels use the same scale. Bars start at zero.
JSON · add an attribute
Protobuf · add an attribute
JSON · ingest only
Protobuf · ingest only
Filesystem buffering
million records / sHigher is better. Median of five runs; 30M completed records/run, including sending and final drain. Both buffering panels use the same scale. Bars start at zero.
JSON · add an attribute
Protobuf · add an attribute
JSON · ingest only
Protobuf · ingest only
Memory buffering
CPU s / million recordsLower is better. Median of five runs; 30M completed records/run. HTTP latency measures batch requests, not record delivery. Both buffering panels use the same scale. Bars start at zero.
JSON · add an attribute
Protobuf · add an attribute
JSON · ingest only
Protobuf · ingest only
Filesystem buffering
CPU s / million recordsLower is better. Median of five runs; 30M completed records/run. HTTP latency measures batch requests, not record delivery. Both buffering panels use the same scale. Bars start at zero.
JSON · add an attribute
Protobuf · add an attribute
JSON · ingest only
Protobuf · ingest only
Memory buffering
MiBLower is better. Median of five runs; 30M completed records/run. HTTP latency measures batch requests, not record delivery. Both buffering panels use the same scale. Bars start at zero.
JSON · add an attribute
Protobuf · add an attribute
JSON · ingest only
Protobuf · ingest only
Filesystem buffering
MiBLower is better. Median of five runs; 30M completed records/run. HTTP latency measures batch requests, not record delivery. Both buffering panels use the same scale. Bars start at zero.
JSON · add an attribute
Protobuf · add an attribute
JSON · ingest only
Protobuf · ingest only
Memory buffering
MiBLower is better. Median of five runs; 30M completed records/run. HTTP latency measures batch requests, not record delivery. Both buffering panels use the same scale. Bars start at zero.
JSON · add an attribute
Protobuf · add an attribute
JSON · ingest only
Protobuf · ingest only
Filesystem buffering
MiBLower is better. Median of five runs; 30M completed records/run. HTTP latency measures batch requests, not record delivery. Both buffering panels use the same scale. Bars start at zero.
JSON · add an attribute
Protobuf · add an attribute
JSON · ingest only
Protobuf · ingest only
Memory buffering
µs / HTTP requestLower is better. Median of five runs; 30M completed records/run. HTTP latency measures batch requests, not record delivery. Both buffering panels use the same scale. Bars start at zero.
JSON · add an attribute
Protobuf · add an attribute
JSON · ingest only
Protobuf · ingest only
Filesystem buffering
µs / HTTP requestLower is better. Median of five runs; 30M completed records/run. HTTP latency measures batch requests, not record delivery. Both buffering panels use the same scale. Bars start at zero.
JSON · add an attribute
Protobuf · add an attribute
JSON · ingest only
Protobuf · ingest only
Memory buffering
µs / HTTP requestLower is better. Median of five runs; 30M completed records/run. HTTP latency measures batch requests, not record delivery. Both buffering panels use the same scale. Bars start at zero.
JSON · add an attribute
Protobuf · add an attribute
JSON · ingest only
Protobuf · ingest only
Filesystem buffering
µs / HTTP requestLower is better. Median of five runs; 30M completed records/run. HTTP latency measures batch requests, not record delivery. Both buffering panels use the same scale. Bars start at zero.
JSON · add an attribute
Protobuf · add an attribute
JSON · ingest only
Protobuf · ingest only
Collector has the lowest peak RSS in these tests. Saturation RSS includes queued records and is not an equal-rate memory-efficiency measurement. Compare memory alongside throughput and CPU.
All OTLP results: throughput, CPU, memory, and latency
| Workload | System | M records/s | Observed min–max M/s | CPU s/M | Steady / peak MiB | HTTP p50 / p99 µs |
|---|---|---|---|---|---|---|
| Memory · JSON, ingest | Fluent Bit 5.2 | 1.670 | 1.43–1.67 | 2.20 | 365 / 441 | 819 / 3007 |
| Memory · JSON, ingest | Fluent Bit 5.1 | 0.732 | 0.63–0.94 | 3.62 | 111 / 277 | 1519 / 4581 |
| Memory · JSON, ingest | OpenTelemetry Collector 0.163 | 0.786 | 0.78–0.79 | 4.83 | 82 / 112 | 1428 / 8288 |
| Memory · Protobuf, ingest | Fluent Bit 5.2 | 1.670 | 1.58–1.77 | 1.88 | 1197 / 1548 | 623 / 3752 |
| Memory · Protobuf, ingest | Fluent Bit 5.1 | 1.580 | 1.36–1.58 | 2.06 | 227 / 513 | 862 / 3067 |
| Memory · Protobuf, ingest | OpenTelemetry Collector 0.163 | 1.160 | 1.15–1.17 | 3.25 | 81 / 108 | 904 / 5778 |
| Memory · JSON, modified | Fluent Bit 5.2 | 1.500 | 1.31–1.58 | 2.45 | 240 / 418 | 872 / 3413 |
| Memory · JSON, modified | Fluent Bit 5.1 | 0.207 | 0.20–0.21 | 8.07 | 627 / 746 | 1575 / 4953 |
| Memory · JSON, modified | OpenTelemetry Collector 0.163 | 0.759 | 0.75–0.76 | 5.03 | 84 / 111 | 1481 / 8574 |
| Memory · Protobuf, modified | Fluent Bit 5.2 | 1.430 | 1.31–1.43 | 2.69 | 230 / 404 | 980 / 3159 |
| Memory · Protobuf, modified | Fluent Bit 5.1 | 0.203 | 0.20–0.20 | 6.93 | 696 / 863 | 744 / 4115 |
| Memory · Protobuf, modified | OpenTelemetry Collector 0.163 | 1.120 | 1.11–1.12 | 3.39 | 84 / 109 | 942 / 6087 |
| Filesystem · JSON, ingest | Fluent Bit 5.2 | 0.909 | 0.88–0.91 | 2.80 | 778 / 974 | 768 / 3934 |
| Filesystem · JSON, ingest | Fluent Bit 5.1 | 0.638 | 0.57–0.75 | 4.42 | 488 / 838 | 1478 / 4754 |
| Filesystem · JSON, ingest | OpenTelemetry Collector 0.163 | 0.202 | 0.20–0.20 | 16.36 | 529 / 550 | 4570 / 34198 |
| Filesystem · Protobuf, ingest | Fluent Bit 5.2 | 0.937 | 0.91–0.94 | 2.51 | 1098 / 1380 | 627 / 3753 |
| Filesystem · Protobuf, ingest | Fluent Bit 5.1 | 0.909 | 0.88–0.94 | 2.80 | 768 / 987 | 757 / 4112 |
| Filesystem · Protobuf, ingest | OpenTelemetry Collector 0.163 | 0.217 | 0.21–0.22 | 13.91 | 528 / 547 | 4136 / 30529 |
| Filesystem · JSON, modified | Fluent Bit 5.2 | 0.968 | 0.97–0.97 | 3.03 | 1169 / 1620 | 822 / 4984 |
| Filesystem · JSON, modified | Fluent Bit 5.1 | 0.203 | 0.20–0.21 | 8.79 | 601 / 739 | 1293 / 5003 |
| Filesystem · JSON, modified | OpenTelemetry Collector 0.163 | 0.190 | 0.19–0.19 | 17.43 | 556 / 576 | 4846 / 35501 |
| Filesystem · Protobuf, modified | Fluent Bit 5.2 | 0.968 | 0.88–0.97 | 3.34 | 831 / 1090 | 958 / 5078 |
| Filesystem · Protobuf, modified | Fluent Bit 5.1 | 0.201 | 0.19–0.20 | 7.66 | 696 / 889 | 745 / 4123 |
| Filesystem · Protobuf, modified | OpenTelemetry Collector 0.163 | 0.206 | 0.20–0.21 | 14.82 | 554 / 572 | 4405 / 31830 |
How the OTLP comparison was measured
Each case uses 100 logs/request, 16 persistent HTTP clients, 320,000 warmup records, and 30M measured records. Product order rotates across five fresh runs. The Linux host uses an AMD Ryzen 9 7940HS, with four server CPUs and separate generator cores.
Fluent Bit uses four HTTP workers, a 0.5s flush interval, and null output. Collector Contrib 0.163 uses an instrumented counting null exporter, one sending-queue consumer, and 8,192-record batching. Filesystem tests use Fluent Bit filesystem buffering and Collector file_storage; their persistence semantics are not equivalent.
Throughput includes sending and final drain. Fluent Bit completion counters update about once per second. Clients retry refusals, and every run completes all 30M records. Latency is the HTTP batch round trip, not per-record delivery latency. Results depend on the tested workload, buffering configuration, and hardware.
Lower CPU for programmable log transformations
In nine equivalent-policy tests, FTS uses 18–45% less CPU than Lua on Fluent Bit 5.1.0. The comparison includes Lua on 5.1.0, Lua on 5.2, and FTS on 5.2.
These are log-policy measurements. They do not include a Collector or standalone content modifier baseline, and do not establish performance for metrics or traces.
Equivalent log policies
CPU seconds / runLower is better. Published median user + system CPU and peak RSS. Tail → null; 1M flat records or 300k Kubernetes records per run. Compare systems within each policy; record budgets differ between policies. The repeat count is not stated. Bars start at zero.
No-op policy
Drop all
Edit (remove + set)
Read 5 fields + edit
Kubernetes record edit
Kubernetes nested field lift
Policy + content_modifier
content_modifier + policy
Output processor edit
Equivalent log policies
MB, as publishedLower is better. Published median user + system CPU and peak RSS. Tail → null; 1M flat records or 300k Kubernetes records per run. Compare systems within each policy; record budgets differ between policies. The repeat count is not stated. Bars start at zero.
No-op policy
Drop all
Edit (remove + set)
Read 5 fields + edit
Kubernetes record edit
Kubernetes nested field lift
Policy + content_modifier
content_modifier + policy
Output processor edit
| Policy | Records/run | 5.2 FTS CPU s | 5.2 Lua CPU s | 5.1.0 Lua CPU s | Less CPU vs 5.1.0 Lua | 5.2 FTS / 5.1.0 Lua RSS MB |
|---|---|---|---|---|---|---|
| No-op policy | 1,000,000 | 2.20 | 2.81 | 3.13 | 29.7% | 24.7 / 22.4 |
| Drop all | 1,000,000 | 1.72 | 2.16 | 2.29 | 24.9% | 17.9 / 17.5 |
| Edit (remove + set) | 1,000,000 | 2.33 | 3.23 | 3.53 | 34.0% | 23.4 / 21.5 |
| Read 5 fields + edit | 1,000,000 | 2.90 | 3.27 | 3.55 | 18.3% | 23.1 / 21.6 |
| Kubernetes record edit | 300,000 | 2.05 | 3.12 | 3.20 | 35.9% | 28.7 / 25.5 |
| Kubernetes nested field lift | 300,000 | 2.20 | 3.12 | 3.20 | 31.2% | 28.9 / 25.6 |
| Policy + content_modifier | 1,000,000 | 2.98 | 3.88 | 5.24 | 43.1% | 23.4 / 21.5 |
| content_modifier + policy | 1,000,000 | 2.98 | 4.43 | 5.37 | 44.5% | 23.4 / 21.4 |
| Output processor edit | 1,000,000 | 3.04 | 3.81 | 3.85 | 21.0% | 60.2 / 75.7 |
Memory and flush-interval tradeoffs
At the tested 0.2s flush interval, FTS generally uses slightly more peak RSS for input policies. Output processing uses less: 60.2 MB versus 75.7 MB for Lua on 5.1.0.
At a 0.02s flush interval, CPU remains within 2% of the reported results and input-policy peak RSS stays within 1.5 MB of Lua. Output-side memory is 52 MB versus 67 MB for Lua in that configuration. The source reports medians but does not state the repeat count.
Explore Fluent Typed Scripting and see how to write typed telemetry policies in Lua.
Make multiple content modifier edits in one pass
Compatible content modifier chains combine their work into one decode/edit/encode pass. Six upserts reduce CPU by 15.7% on 12-field records and 19.4% on 128-field records in the final confirmation. Wide-record throughput improves 20.0%; narrow-record throughput remains approximately flat.
CPU cost of a content modifier chain
CPU s / million recordsLower is better. Five paired runs/case; 800k records for 12 fields, 200k for 128 fields. Both builds are 5.2 revisions. Bars start at zero.
12 fields · no edits
12 fields · 6 upserts
128 fields · no edits
128 fields · 6 upserts
| Fields / upserts | Before CPU s/M | After CPU s/M | CPU reduction | Throughput change |
|---|---|---|---|---|
| 12 / 0 | 0.8375 | 0.8250 | 1.5% | +0.1% |
| 12 / 6 | 3.7375 | 3.1500 | 15.7% | -0.0% |
| 128 / 0 | 7.0000 | 6.8000 | 2.9% | -0.1% |
| 128 / 6 | 26.3000 | 21.2000 | 19.4% | +20.0% |
The baseline is an earlier 5.2 revision, not 5.1. These percentages must not be added to the OTLP gains. Compatible plain-body insert, upsert, delete, and rename chains benefit; grouped OTLP records, conditions, and unsupported chains take other paths.
Use less disk for many low-volume streams
With 1,000 sparse tags, allocated filesystem space falls from 250 MiB to 19.53 MiB, a 92.2% reduction. The benefit is strongest for sparse streams; busy-stream throughput stays broadly similar.
Filesystem allocation and ingestion
MiBLower is better. Three measured repeats after warmup. Both builds use ChunkIO 1.5.5. This isolates allocation integration, not a 5.1-versus-5.2 comparison. Bars start at zero.
1,000 sparse tags, FS
Busy FS, checksum off
Busy FS, checksum on
Memory control
Filesystem allocation and ingestion
CPU secondsLower is better. Three measured repeats after warmup. Both builds use ChunkIO 1.5.5. This isolates allocation integration, not a 5.1-versus-5.2 comparison. Bars start at zero.
1,000 sparse tags, FS
Busy FS, checksum off
Busy FS, checksum on
Memory control
Filesystem allocation and ingestion
MiB / secondHigher is better. Three measured repeats after warmup. Both builds use ChunkIO 1.5.5. This isolates allocation integration, not a 5.1-versus-5.2 comparison. Bars start at zero.
1,000 sparse tags, FS
Busy FS, checksum off
Busy FS, checksum on
Memory control
| Workload | CPU seconds | Ingestion MiB/s | Allocated MiB |
|---|---|---|---|
| 1,000 sparse tags, FS | 0.356 → 0.321 | 92.30 → 108.08 | 250.00 → 19.53 |
| Busy FS, checksum off | 0.996 → 1.002 | 126.32 → 126.29 | 144.15 → 140.55 |
| Busy FS, checksum on | 1.011 → 1.032 | 123.94 → 121.86 | 146.21 → 140.55 |
| Memory control | 0.925 → 0.938 | 131.10 → 129.91 | 0.00 → 0.00 |
Buffering workload and tradeoffs
Real tail-to-null pipelines use 256-byte source lines: 64,000 records across 1,000 sparse tags, or 1M records for busy-stream and memory controls. Disk figures are sampled allocated blocks, not payload size. CPU includes startup and shutdown; ingestion rate excludes startup and final drain.
Tests use ext4/NVMe, 4 KiB pages, one server CPU, and a shared host. Checksum-enabled busy streams use 2.1% more CPU and have 1.7% lower measured ingestion rate. Busy-stream remaps increase from 1,105 to 1,523. Both builds use ChunkIO 1.5.5, isolating allocation integration.
Smaller in-memory record graphs
Compact CFL arenas reduce reserved memory per decoded record by 27–31%, with 23–26% less CPU time in the measured record-building workloads. These are record-graph measurements, not total process RSS.
Record-building CPU and memory measurements
Decoded-record construction
ns / recordLower is better. Release x86_64; best of five runs. Reserved arena bytes are not process RSS. These gains are not additive with pipeline results. Bars start at zero.
Referenced values
Owned values
Owned values with edits
Decoded-record construction
bytes / recordLower is better. Release x86_64; best of five runs. Reserved arena bytes are not process RSS. These gains are not additive with pipeline results. Bars start at zero.
Referenced values
Owned values
Owned values with edits
| Record values | CPU ns/record | Reserved bytes/record |
|---|---|---|
| Referenced values | 321.0 → 245.8 | 2118 → 1541 |
| Owned values | 396.3 → 294.1 | 2760 → 1894 |
| Owned values with edits | 484.9 → 361.1 | 2664 → 1829 |
These microbenchmark gains are not additive with pipeline results. Memory improvements vary by record shape.