Skip to content

LMDB Write Performance Regression and Native Library Versioning #277

@benalexau

Description

@benalexau

Comprehensive LMDB benchmarking has revealed a ~10% write performance regression in LMDB 0.9.20+ compared to 0.9.17 and 0.9.18.

Write Performance

Tag ms/op vs 0.9.17 Maven Central
LMDB_0.9.17 75.790 baseline N/A
LMDB_0.9.18 74.909 -1.2% 0.9.18-1
LMDB_0.9.19 81.404 +7.4% 0.9.19-1
LMDB_0.9.20 83.459 +10.1% 0.9.20-1
LMDB_0.9.21 83.237 +9.8% 0.9.21-1
LMDB_0.9.22 83.027 +9.5% 0.9.22-1
LMDB_0.9.23 82.870 +9.3% 0.9.23-1
LMDB_0.9.24 82.952 +9.4% 0.9.24-1
LMDB_0.9.27 82.989 +9.5% N/A
LMDB_0.9.28 83.025 +9.5% N/A
LMDB_0.9.29 83.063 +9.6% 0.9.29-1
LMDB_0.9.30 83.237 +9.8% N/A
LMDB_0.9.31 88.419 +16.7% N/A
LMDB_0.9.33 83.304 +9.9% 0.9.33-2
LMDB_0.9.33 - - 0.9.33-3

The write regression has been reported upstream to LMDB in ITS#10406.

Read Performance

All read benchmarks show consistent stability (or slight improvement) in 0.9.33 vs 0.9.17.

Using Older LMDB Versions

As indicated above, older versions of LMDB are now packaged as org.lmdbjava:native artifacts which are compatible with LmdbJava. While it is strongly recommended to always use the native artifact that is a transitive dependency of org.lmdbjava:lmdbjava, users encountering unacceptably slow write pathways may prefer to explicitly declare an older native artifact version to achieve better write performance:

<dependency>
<groupId>org.lmdbjava</groupId>
<artifactId>lmdbjava</artifactId>
<version><!-- latest LmdbJava version --></version>
</dependency>
<dependency>
<groupId>org.lmdbjava</groupId>
<artifactId>native</artifactId>
<version>0.9.18-1</version>
</dependency>

As always, users can alternatively use the lmdbjava.native.lib system property to specify any arbitrary LMDB system library and ignore those available via LmdbJava artifacts.

New Benchmark Suite

This work also motivated the creation of a new benchmark not mentioned in #262. This new benchmark has the usual smoketest and benchmark profiles, nightly execution of the smoketest profile, plus dedicated result websites at https://lmdb-benchmark.lmdbjava.org/ and https://lmdb-smoketest.lmdbjava.org/. This will provide a quantifiable approach to isolating future LMDB library performance from LmdbJava overhead.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions