Disks, RAM and other tips
As with any persistence solution, performance depends a lot on the persistence media used. In general, the faster storage you have, and the more of your data you can fit in RAM, the better performance you will get. This page provides an overview of performance considerations for disk and RAM when running Neo4j.
Storage
There are many performance characteristics to consider for your storage solutions. The performance can vary hugely in orders of magnitude. Generally, having all your data in RAM achieves maximum performance.
If you have multiple disks or persistence media available, it may be a good idea to divide the store files and transaction logs across those disks. Keeping the store files on disks with low seek time can do wonders for read operations.
Use tools like dstat or vmstat to gather information when your application is running.
If the swap or paging numbers are high, that is a sign that the database does not quite fit in memory.
In this case, database access can have high latencies.
|
To achieve maximum performance, it is recommended to provide Neo4j with as much RAM as possible to avoid hitting the disk. |
Asynchronous I/O in Neo4j using io_uringEnterprise EditionIntroduced in 2026.04
Neo4j supports asynchronous I/O using io_uring available on Linux. This enables Neo4j to issue multiple requests concurrently without blocking the main thread and to be notified when the requests are completed. For workloads that perform large numbers of I/O operations and do not need to wait for each individual operation to complete, this approach can deliver substantial performance improvements.
This initial delivery enables the background page evictor and checkpointer to take advantage of async I/O when available and configured, representing a limited initial set of components that will expand over time. While still in its early stages, these components demonstrate the potential of non-blocking execution to improve database performance, particularly in cloud and high-latency environments.
Enabling asynchronous I/O
Asynchronous I/O is not enabled by default.
To enable it, set server.memory.pagecache.async=true in the neo4j.conf file.
The following prerequisites must be met to use asynchronous I/O in Neo4j:
-
Linux operating system
-
liburing library installed
-
JDK 25 or later
To verify whether Neo4j asynchronous I/O is active and ready for use in your environment, check the diagnostics in the debug logs for the following message:
Native async IO provider: IOUring based async provider is available.
Now you are ready to take advantage of asynchronous I/O in Neo4j.
Configuration options
While asynchronous I/O is enabled, you can also experiment with the I/O bandwidth used by the checkpoint process, using db.checkpoint.iops.limit and db.checkpoint.throughput.limit.
These settings are still respected when asynchronous I/O is enabled, and can be used to fine-tune the performance of the checkpoint process in your specific environment.
Another setting to consider with asynchronous I/O is server.memory.pagecache.directio, which enables Direct I/O for the page cache.
Direct I/O allows the database to bypass the operating system’s page cache and read/write data directly to the storage device, reducing latency and improving performance for certain workloads.
Even though Direct I/O may not be suitable for all workloads, if your Neo4j page cache is large enough to cover the entire database store, it may be a good time to revisit this option and evaluate potential performance improvements.
Metrics
When asynchronous I/O is enabled, you can monitor its performance using the following metrics:
-
<prefix>.page_cache.async_submit- The total number of page async I/O submit operations that have occurred in the page cache. -
<prefix>.page_cache.async_complete- The total number of page async I/O complete operations that have occurred in the page cache. -
<prefix>.page_cache.async_failure- The total number of page async I/O failure operations that have occurred in the page cache.
All other metrics remain available and can be used to monitor the database’s overall performance, including page cache hit and usage ratios, checkpoint duration, and other relevant metrics.
Page cache
When Neo4j starts up, its page cache is empty and needs to warm up. The pages, and their graph data contents, are loaded into memory on demand as queries need them. This can take a while, especially for large stores. It is not uncommon to see a long period with many blocks being read from the drive, and high IO wait times. This will show up in the page cache metrics as an initial spike in page faults. The page fault spike is then followed by a gradual decline of page fault activity, as the probability of queries needing a page that is not yet in memory drops.
Page cache warmup orderIntroduced in 2026.03
Neo4j 2026.03 introduces the db.memory.pagecache.warmup.order setting that controls the order in which database files are loaded during page cache warmup.
This allows optimization of startup performance by prioritizing critical files.
Three ordering strategies are supported:
-
NONE- files are loaded in their natural order (default). -
ALPHABETIC- files are sorted alphabetically before loading. -
PRIORITY- files are loaded according to importance: x1 stores first, followed by ID files, then indexes, with remaining files in alphabetic order. ThePRIORITYmode is particularly useful for ensuring that frequently accessed files are loaded into cache first, reducing startup latency. The aforementioned file loading sequence is relevant to theblockstore format which is available in the Enterprise Edition.
Active page cache warmup
Neo4j Enterprise Edition has a feature called active page cache warmup, which is enabled by default via the db.memory.pagecache.warmup.enable configuration setting.
How it works
It shortens the page fault spike and makes the page cache warm up faster. This is done by periodically recording cache profiles of the store files while the database is running. These profiles contain information about what data is and is not in memory and are stored in the data/databases/mydatabase/profiles directory. When Neo4j is restarted next time, it looks for these cache profiles and loads the same data that was in memory when the profile was created. The profiles are also copied as part of the online backup and cluster store-copy operations and help warm up new databases that join a cluster.
The setting should remain enabled for most scenarios. However, when the workload changes after the database restarts, the setting can be disabled to avoid spending time fetching data that will be directly evicted.
Configuration options
- Load the entire database into memory
-
It is also possible to configure
db.memory.pagecache.warmup.preloadto load the entire database data into memory. This is useful when the size of the database store is smaller than the available memory for the page cache. When enabled, it disables warmup by profile and prefetches data into the page cache as part of the startup. - Load specified files into memory
-
The files that you want to prefetched can be filtered using the
db.memory.pagecache.warmup.preload.allowlistsetting. It takes a regular expression as a value to match the files.
For example, if you want to load only the nodes and relationships, you can use the regex .*(node|relationship).* to match the name of the store files.
The active page cache warmup will prefetch the content of the following files:
neostore.nodestore.db
neostore.nodestore.db.id
neostore.nodestore.db.labels
neostore.nodestore.db.labels.id
neostore.relationshipgroupstore.db
neostore.relationshipgroupstore.db.id
neostore.relationshipstore.db
neostore.relationshipstore.db.id
neostore.relationshiptypestore.db
neostore.relationshiptypestore.db.id
neostore.relationshiptypestore.db.names
Neostore.relationshiptypestore.db.names.id
And can be verified using unix grep:
ls neo4j/ | grep -E '.*(node|relationship).*'
- Configure the profile frequency for the page cache
-
The profile frequency is the rate at which the profiles are re-generated. More frequent means more accurate. A profile contains information about those parts of the files that are currently loaded into memory. By default, it is set to
db.memory.pagecache.warmup.profile.interval=1m. It takes some time to generate these profiles, and therefore1mis a good interval. If the workload is very stable, then the profile will not change much. Accordingly, if the workload changes often, the profile will thus often become outdated.
Checkpoint IOPS limit
Neo4j flushes its page cache in the background as part of its checkpoint process.
This will show up as a period of elevated write IO activity.
If the database is serving a write-heavy workload, the checkpoint can slow the database down by reducing the IO bandwidth that is available to query processing.
Running the database on a fast SSD, which can service a lot of random IOs, significantly reduces this problem.
If a fast SSD is not available in your environment, or if it is insufficient, then an artificial IOPS limit can be placed on the checkpoint process.
The db.checkpoint.iops.limit restricts the IO bandwidth that the checkpoint process is allowed to use.
Each IO is, in the case of the checkpoint process, an 8 KiB write.
An IOPS limit of 600, for instance, would thus only allow the checkpoint process to write at a rate of roughly 5 MiB per second.
This will, on the other hand, make checkpoints take longer to complete.
A longer time between checkpoints can cause more transaction log data to accumulate, and can lengthen recovery times.
See the Checkpointing and log pruning section for more details on the relationship between checkpoints and log pruning.
The IOPS limit can be changed at runtime, making it possible to tune it until you have the right balance between IO usage and checkpoint time.
Glossary
- allocator
-
A component in the cluster that allocates databases to servers according to the topology constraints specified and an allocation strategy.
- asynchronous replication
-
Asynchronous replication is used by secondary copies to poll for new transactions, which means they cannot be guaranteed to have received the most recent transactions. This enables efficient scale-out of read-performance.
- Aura instance
-
A fully-managed DBMS represented by a single instance ID, that is running in the Neo4j Aura cloud.
- auto-commit transaction
-
An automatically committed transaction that contains a single query.
- Bolt protocol
-
Bolt is a protocol used for interaction between Neo4j instances and drivers.
- bookmark
-
A marker the client can request from the cluster to ensure that it is able to read its own writes so that the application’s state is consistent and only databases that have a copy of the bookmark are permitted to respond.
- category (Bloom)
-
A category is based on a node label and is defined in a Perspective as a way of visually distinguishing nodes with the same label(s).
- causal consistency
-
All servers in a cluster agree on the order in which transactions take place. The position of a server on the causal chain can be guaranteed using a bookmark.
- cluster
-
A Neo4j DBMS that spans multiple servers working together to increase fault tolerance and/or read scalability. Databases on a cluster may be configured to replicate across servers in the cluster thus achieving read scalability or high availability.
- client application
-
Software that interacts with a Neo4j server.
- commit
-
A commit is the successful completion of a transaction, which ensures durability of any changes made. For more details, visit Operations Manual → Transaction management.
- composite database
-
Composite databases are the means to access partitioned graph data with a single Cypher query.
- constraint
-
Constraints are sets of data modeling rules that ensure the data is consistent and reliable.
- Cypher®
-
Neo4j’s graph query language.
- data model
-
A data model defines how information is organized in a database. A good data model will make querying and understanding your data easier. In Neo4j, the data models have a graph structure.
- database
-
A database is a container used by the DBMS to manage and store graph data. The physical structure of data is controlled by the database.
- database vs graph
-
Databases are the physical containers of graph data. Graphs are the logical structure of data in Neo4j.
- Database Management System
-
Database Management System, or DBMS, capable of managing multiple databases. A DBMS may run on a single server, or span several servers configured as a cluster.
- database schema
-
The prescribed property existence and datatypes for nodes and relationships.
- deallocate
-
An act of removing a database from a server or a server from a cluster without loss of data or reduced fault tolerance.
- degree (of a node)
-
The number of relationships of a specific node; loops are counted twice.
- disaster recovery
-
A manual intervention to restore availability of a cluster, or databases within a cluster.
- driver
-
A software library that provides access to Neo4j from a particular programming language.
- election
-
In the event that the Raft leader becomes unresponsive, followers automatically trigger an election and vote for a new leader.
- entity
-
A node or a relationship.
- expression (Cypher)
-
A component of a Cypher query which produces values. It may be used in projections, as a predicate, or when setting properties on graph elements.
- fabric
-
Fabric is the architectural design of a unified system that provides a single access point to local or distributed graph data.
- fault tolerance
-
A guarantee that a cluster can maintain a database’s persistence and availability in the event of one or more servers failing.
- follower
-
A primary copy of a database acting as a follower, receives and acknowledges synchronous writes from the leader.
- Generative AI (GenAI)
-
A type of artificial intelligence (AI) system that generates text, images, or other media in response to prompts.
- graph
-
A logical representation of a set of nodes where some pairs are connected by relationships.
- index
-
Data structure that improves read performance of a database.
- knowledge graph
-
A specific type of graph that has an organizing principle so that a user (or a computer system) can reason about the underlying data. The organizing principle provides an additional layer of structure that adds context to support knowledge discovery.
- label
-
Marks a node as a member of a named and indexed subset. A node may be assigned zero or more labels.
- leader
-
A single primary copy of a database is designated as the leader. It receives all write transactions from clients and replicates writes synchronously to followers and asynchronously to secondary copies of the database.
- main database
-
In terms of Neo4j Enterprise Studio, the database(s) containing the user’s data. Can exist in the same Neo4j deployment as the tool asset database.
- motif
-
A description of a specific pattern within a graph.
- node
-
A node represents an entity or discrete object in your graph data model. Nodes can be connected by relationships, hold data in properties, and are classified by labels.
- operator
-
A symbol representing a mathematical or logical operation.
- parameter
-
Named value provided when running a Cypher statement.
- path
-
A sequence of nodes and the relationships connecting them, that does not contain duplicate relationships. Several paths can match a pattern.
- pattern
-
A specific arrangement of nodes and relationships that can be matched in a graph. A pattern follows a motif.
- perspective (Bloom)
-
A Perspective defines a certain business view or domain that can be found in the target Neo4j graph. A single Neo4j graph can be viewed through different Perspectives, each tailored for a different business purpose.
- primary
-
A copy of the database that is able to process write transactions and is eligible to be elected as a leader. It participates in fault tolerant writes as it is part of the majority required to acknowledge and commit write transactions.
- primary vs secondary
-
In a cluster, databases can operate in either primary or secondary mode. Primary databases are able to process write and read transactions, ensuring fault tolerance. Secondary databases are replicated asynchronously from primaries, and their main purpose is to provide read scaling within the cluster.
- project (Aura)
-
An isolated environment in the unified Aura console that contains its own database instances, configurations, and resources. Preceded by tenant in the classic Aura console.
- property
-
Properties are key-value pairs that are used for storing data on nodes and relationships.
- query (Cypher)
-
A statement that retrieves or writes information to a database.
- Raft group
-
A group of servers that are participating in hosting a particular database in primary mode.
- Raft group member
-
A server that is participating in a Raft group. A server can be a member of one or more groups.
- Raft log
-
A shared log between all Raft group members that is guaranteed to be consistently updated and viewed by those members. The log contains both database data and operational state of the Raft group.
- Raft protocol
-
The networking mechanism that enables a database to replicate its data across multiple servers to give high availability for accessing the data and high durability to the data stored.
- read scaling
-
Distributing query load by creating additional database copies hosted in secondary mode (read-only).
- relationship
-
A relationship represents a connection between nodes in your graph data model. Relationships connect a source node to a target node, hold data in properties, and are classified by type.
- secondary
-
An asynchronously replicated copy of the database that provides read scaling within the cluster.
- seed
-
A seed is a database dump or a full backup used to create a database on a cluster. This is sometimes called seeding.
- server
-
A physical machine, a virtual machine, or a container running an instance of Neo4j. Servers can be standalone or part of a cluster.
- session
-
A causally linked sequence of transactions.
- session consistency
-
An alternative name for Neo4j’s causal consistency.
- standalone
-
A single server running Neo4j and not part of a cluster.
- synchronous replication
-
Synchronous replication requires the leader primary to replicate a transaction and block the commit until a quorum of the follower primaries acknowledges that the transaction is successfully replicated. Once the transaction is replicated, the commit is allowed to proceed. This ensures data durability and consistency within the cluster.
- system database
-
A database used by Neo4j to store system information.
- tenant (Aura)
-
An isolated environment in the classic Aura console that contains its own database instances, configurations, and resources. Replaced by project in the unified Aura console.
- tool asset database
-
In terms of Neo4j Enterprise Studio, the database where tools' assets are stored. This can be in the same Neo4j deployment as the main database(s) or in a separate deployment.
- topology
-
A configuration that describes how the copies of a database should be spread across the servers in a cluster, see primary mode and secondary mode.
- transaction
-
A transaction comprises a unit of work performed against a database. It is treated in a coherent and reliable way, independent of other transactions. Transactions comply with the ACID consistency model (atomic, consistent, isolated, and durable).