Performance tuning, best practices

#1

we have a system where we serve from a host process around 200 clients connected via webSockets (Jetty). The core process is running on a dedicated Windows 2012 server with 16 GByte RAM and 8 processor cores. 

What is strange for us is that max 20% of the cpu resources are used and the IO subsystem is at maximum 30% of activity under heavy load but database queries are let's say not at the speed we would expect.

We have currently 20.000.000 objects in the database, our configuration settings are:


<!-- ObjectDB Configuration -->

<objectdb>

<general>
  <temp path="$temp" threshold="64mb" />
  <network inactivity-timeout="0" />
  <url-history size="50" user="true" password="true" />
  <log path="$objectdb/log/" max="8mb" stdout="false" stderr="false" />
  <log-archive path="$objectdb/log/archive/" retain="90" />
  <logger name="*" level="info" />
</general>

<database>
  <size initial="256kb" resize="256kb" page="2kb" />
  <recovery enabled="true" sync="false" path="." max="128mb" />
  <recording enabled="false" sync="false" path="." mode="write" />
  <locking version-check="true" />
  <processing cache="2048mb" max-threads="48" />
        <index-update enabled="true" priority="40" />
  <query-cache results="1024mb" programs="500" />
  <extensions drop="temp,tmp" />
</database>

<entities>
  <enhancement agent="false" reflection="warning" />
  <cache ref="weak" level2="2048mb" />
        <fetch hollow="true" />
  <persist serialization="false" />
  <cascade-persist always="auto" on-persist="false" on-commit="true" />
  <dirty-tracking arrays="true" />
</entities>

<schema>
</schema>

<server>
  <connection port="6136" max="100" />
  <data path="$objectdb/db" />
        <embedded-server enabled="true" />
  <!--
  <replication url="objectdb://localhost/test.odb;user=admin;password=admin" />
  -->
</server>

<users>
  <user username="admin" password="admin">
   <dir path="/" permissions="access,modify,create,delete" />
  </user>
  <user username="$default" password="$$$###">
   <dir path="/$user/" permissions="access,modify,create,delete">
    <quota directories="5" files="20" disk-space="5mb" />
   </dir>
  </user>
  <user username="user1" password="user1" />
</users>

<ssl enabled="false">
  <server-keystore path="$objectdb/ssl/server-kstore" password="pwd" />
  <client-truststore path="$objectdb/ssl/client-tstore" password="pwd" />
</ssl>

</objectdb>

 

Now the question is:

- how can we tune for performance ?

- do we need more processors ?

- should we change some settings in the configuration ?

- other hints or proposals 

#2

The configuration looks fine. The system serve 200 clients, but is it possible that the specific slow operation (possibly a complex query) is slow also for a single user? i.e. can you check if the performance issue is due to load of several concurrent clients, or maybe same slow performance is also for a single user with that specific operation?

ObjectDB can use multiple cores to serve concurrent requests from different users, and also tries to use multiple cores for a single request, but the later is usually more complex and sometimes limited.

If you find that a particular query is slow - the best way to improve performance is to explore that query, rephrase it if possible and/or define additional indexes.

ObjectDB Support

Reply