[Neo] neo4j performance testing

Dmitri Livotov dmitri at livotov.eu
Thu Feb 11 13:55:34 CET 2010

We started initial complex tests and db performs really well at the 
moment. Very nice thing that it does not "eat" heap excessively as most 
java dataengines.

Here is what the test data and test cases, please correct/append them if 
you think that something is not optimal, we'd like to make a complete 
real usecase test and share the results, so they could be useful for 
anyone else.

1) Test database

We've imported the entire linux server filesystem structure with 
hierarchy relations, relations to file/folder classes (million relations 
to single node case), also with copying file/folder attributes into 
their nodes. The total size is 3M of nodes, with almost 10 attributes 
per every node.

2) Test environment

neo4j database in put into a web application, initialized in context 
listener and then single database instance is requested by all test 
servlets. Web application will be deployed to
glassfish v3 app server with a 2G heap allocated with a total of 4G 
memory on the physical server (centos 5.2, 64 bit kernel)

There are several test servlets in the web application, each servlet, on 
a request, performs the single operation (several low level operations 
with the db are grouped) and responds with either 200 code or 500 code 
(on any exception) and zero response size.

Test client is a apache jmeter instance, running on another desktop 
machine, tied with a 100M link with the server on the same subnet via 1G 

3) Test cases

servlet 0 - simulates static web page to see how the db load affects the 
entire app server. Does almost nothing - makes a random delay from 10 to 
200 ms and finishes.
servlet 1 - performs random node lookup by a primary key, changes 10 
node attributes and commits transaction
servlet 2 - performs random node lookup by a primary key, then 
traversing the hieararchy until the end of graph (up and down), iterates 
it all in an empty loop.
servlet 3 - long running one, requests all nodes (via traverse request 
from the top node), iterates them all and randomly adjust 
(add/remove/update) single attribute (no more than 100 attributes per 
cycle), then commits.

Should we add more tests servlets you think can be useful for high load 
testing, maybe also you suggest to change/update the test data, say more 
depth levels, more relationships ?

4) Load factors

servlet 0 is called from 100 parallel threads
servlets 1 and 2 are called from 50 parallel threads (50 for each one, 
so 100 threads in total)
servlet 3 is called from a single thread

so we have 201 parallel threads in total.


More information about the User mailing list