Hi Samyuthka,
For future reference, don't put your usernames/passwords or any identifying secure info on the board, even for test databases.
Since you have about 60M keys and many updates to those keys, you're going to need a lot more than 100 megabytes for the bdb.cache.size. Your cleaner threads are probably falling way behind. If you can upgrade to 0.96, you can expose metrics via mbeans that show how much cache you need and how far behind your cleaner threads are. You can also use the com.sleepycat.je.util.DbPrintLog package to get an idea of how large your index may be to help you understand how much bdb cache you may need. Also, if you have a lot of concurrent writes to individual keys, you could have a very large index.
The first thing you should do is increase your bdb.cache.size to something like 2G to start and then see if the jdb files start getting cleaned up. If you don't see bdb files getting deleted more regularly, increase it. You can tune down from there, once you start seeing progress, until you find a comfortable amount of "memory vs gc time/frequency/delay". You'll need to increase your heap size to allow for more than enough oldgen space to host the entire size of the bdb cache, plus other objects (if it at least 30% memory more than your bdb.cache.size).
You might also want to add in the following:
bdb.cleaner.min.file.utilization=0
This will allow the overall environment utilization to be used alone, which is 50% and will help avoid conflicting compaction rules.
Unfortunately, with your version of voldemort, you cannot increase the number of bdb cleaner threads and you cannot see the cleaner backlog in real-time or the bdb cache usage. So, there are not a lot of options for you. But the cache increase and disabling the min.file.utilization should definitely give you some improvement.
Lastly, if you're not using any read-only persistence stores, you should remove the ReadOnlyStorageConfiguration or you will just be wasting heap space.
Brendan
On Sunday, February 10, 2013 10:44:30 PM UTC-8, Samyuktha M S wrote:
Hi Carlos& Brendan,
As per your suggestion, we will try to upgrade to latest version. But since the products are live, it takes a period of time to upgrade and test.
But till then, can you suggest something on the existing problem.
Its a single node cluster
Please find the configuration details (server.properties):
# The ID of *this* particular cluster node
max.threads=300
#enable.memory.engine=true
############### DB options ######################
http.enable=true
socket.enable=true
# BDB
bdb.write.transactions=false
bdb.flush.transactions=false
bdb.cache.size=100M
# Mysql
mysql.host=localhost
mysql.port=1521
mysql.user=<user>
mysql.password=<pass>
mysql.database=test
#NIO connector settings.
enable.nio.connector=false
#enable.readonly.engine=true
#file.fetcher.class=voldemort.store.readonly.fetcher.HdfsFetcher
storage.configs=voldemort.store.bdb.BdbStorageConfiguration, voldemort.store.readonly.ReadOnlyStorageConfiguration
voldemort-server.sh has the following properties:
/usr/java/jdk1.6.0_26/bin/java -XX:+UseConcMarkSweepGC -Xloggc:/opt/Voldemort/voldemort-0.80.1/bin/log/gc.log -Dlog4j.configuration=src/java/log4j.properties -Xms256M -Xmx256M -server -Dcom.sun.management.jmxremote -cp $CLASSPATH voldemort.server.VoldemortServer $@
The existing key size is 60,000,000
On an average, updates of 50000 (inclusive of new adds and updates of existing keys)
The bdb folder size is approximately 10G now
Please suggest.
Thanks,
samyuktha.
On Fri, Feb 8, 2013 at 11:02 PM, Brendan Harris
<vold...@stotch.com> wrote:
Samyuthka,
In addition to what Carlos said, you also need a large enough bdb cache size, so that the cleaners can fit enough of the index into the cache to do their cleaning. If your cache is too small, your cleaner threads can fall behind and cause your jdb structure to grow in an unbounded fashion (rarely reclaiming enough space). Your max logfile size (jdb size) can also impact the performance of the cleaners. And I'd definitely recommend upgrading to a much more recent release.
Also no transaction data is stored in the structure, just key, versions, timestamps and values. It's log structured (append-only), so all modifications to existing keys get written to the end of the current jdb file and the old files are deleted over time as the keys in them are invalidated by the more current jdb files. That deleting of the old jdb files can be improved or degraded depending on your configuration, how many keys you have and how many updates to existing keys you do.