Hi folks,
While trying to profile ApacheDS I was playing with tunable cache
parameters. Only recently, we made the entry cache and index cache
sizes tunable so I was curious to see how these effected performance.
For performance tests I started working with 10,000 entries and tried
various configurations of the server's memory along with these cache
sizes. The key was to determine how fast I can get the server to add,
delete and return all these entries.
I found that the existing defaults in RC3 were way less than optimal.
Namely we had far too much cache allocated to indices which were robbing
the server of memory causing it to have major GCs way to often. The
balance between the cache sizes and max heap size is critical. It makes
a big difference to performance.
After several configurations I arrived at one which seemed to lead to
the best performance when using one single threaded client. The entry
cache size was set to 10K and the index cache sizes were set to 10 with
a heap size of 96MB. Increasing the heap above this value had no
benefit with this simplified testing scenario. Of course as we increase
the number of threads and clients this may change.
Here's the machine's processor:
[EMAIL PROTECTED]:~$ cat /proc/cpuinfo
processor : 0
vendor_id : AuthenticAMD
cpu family : 6
model : 10
model name : AMD Athlon(TM) XP
stepping : 0
cpu MHz : 2500.561
cache size : 512 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 1
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge
mca cmov pat pse36 mmx fxsr sse syscall mmxext 3dnowext 3dnow
bogomips : 5005.28
Here's are the performance stats I got on that machine:
[NOTE: EPS means entries per second]
Add 10K entries => 1m19.774s (125 EPS)
Search 10K entries (1st try) => 0m12.208s (819 EPS)
Search 10K entries (2nd try) => 0m4.716s (2120 EPS)
Search 10K entries (3rd try) => 0m4.861s (2057 EPS)
Del 10K entries => 0m41.049s (244 EPS)
As you can see the throughput experiment for a single client for these
simple operations is pretty damn good. Btw I got better performance
when I piped the client's output to /dev/null from the ldapXXXX clients:
I had quoted higher values to Emmanuel over IM.
At ApacheCon EU Emmanuel did a presentation with a different setup.
First of all the server could not be tuned properly so it had issues
with memory management and performance would be effected. Secondly the
nature of the experiments were different. The common case where a bind,
simple one entry lookup, followed by an unbind was done. The number of
times a server can do this was measured per second. ApacheDS did not
perform that well here and some profiling indicates this may be due to
an overhead in the optimizer. This optimizer does some calculations
before beginning a search to increase performance however it has a cost.
For simple lookups returning a single entry this may not be optimal.
I think adding an option to disable the optimizer is a good idea.
Just for a point of reference I decided to try these experiments with
OpenLDAP. Ok some word of caution before I reveal these stats. I
freaked when I first did a run with OpenLDAP because the performance had
to be way too low. So then I started looking into seriously tuning the
server with the bdb backend. I wanted to make sure it had enough cache
to keep all 10K entries in memory as did ApacheDS. I adjusted these
values and only got a 30% improvement. In conclusion I feel that I must
be doing something wrong.
*Quanah* this is where we may need your expertise! I'll publish these
sorry values for now but I'd like to make sure people understand I'm not
as experienced with tuning OpenLDAP (although I've done it a few times
in the past). So they may not be figures from the most optimial
configuration:
Add 10K entries => 6m13.013s (27 EPS)
Search 10K entries (2nd try) => 19m14.748s (9 EPS)
Search 10K entries (2nd try) => 13m57.378s (12 EPS)
Search 10K entries (3rd try) => 13m41.407s (12 EPS)
Del 10K entries => 4m46.699s (35 EPS)
*Yes these are all in minutes!*
Again to be fair I am piping stdout output to /dev/null. The following
commands were used for these respective operations:
[For OpenLDAP running on port 389]
----------------------------------
time ldapadd -h localhost -p 389 -D 'cn=admin,dc=example,dc=com' -x -w
secret -f add.10k.ldif >> /dev/null
time ldapsearch -h localhost -p 389 -D 'cn=admin,dc=example,dc=com' -x
-w secret -b 'dc=example,dc=com' 1.1 > /dev/null
*[0]*
time ldapdelete -h localhost -p 389 -D 'cn=admin,dc=example,dc=com' -x
-w secret -f del.10k.ldif
Check out the following wiki page for more information about these
tests: *[1]*. Here you can find the ApacheDS installer which I used for
these tests: *[2]*.
Alex
-----
*[0]* - We are not even returning whole entries! '1.1' for the attribute
list only returns the DN of the entry. I made sure we have presence and
eq matching indices especially for objectClass since this search
defaults to an (objectClass=*) filter. This was done before doing
anything with the server: namely creating the new bdb database files and
adding the entries.
*[1]* - http://monretia.notlong.com/
*[2]* - http://dulcaned.notlong.com/