Bu Blogda Ara

22 Aralık 2010 Çarşamba

Memcached Performance Tests and Source Code (Java Source, Ant Project)

What is Memcached?

I have prepared some test cases in order to test the performance of Memcached distributed caching library. You can get them from my code repository with the following mercurial script.


hg clone https://barisergunexperimentalstuff.googlecode.com/hg/ barisergunexperimentalstuff


For your information if you don't have a mercurial rep client than you can get it with your favorite package manager. I use "sudo apt-get install tortoisehg" on my Ubuntu.

A-) Local tests:

Local tests are done with a sample DataObject. when you run the tests 8 different memcached instances are started on 8 consequent ports.

Steps to follow

- Install memcached (eg. sudo apt-get install memcached). On my previous post I also have information about on installing memcached on Centos 5.5

- Then, run tests with below ant script


ant local.test -Dentry.count=10000 -Dttl=60


Dentry.count is used to configure number of objects to cache. Dttl is used to configure TTL for each object in the cache.

A-) Distributed tests:

Local tests automatically starts and terminates the memcached servers on local machine. For distributed tests you will have to start the memcached servers on remote machines and give the server_ip:server_port combinations with a specific format as shown below.

Steps to follow:

- Install memcached on remote servers

- Start memcached servers.

Eg:


memcached -d -u root -m 1024 10.34.3.13 -p 1121


- Run distributed tests with following arguments(just a sample)

ant distributed.test -Dentry.count=10000 -Dget.timeout=10 -Dttl=300 -Dservers="10.34.3.11:1121 10.34.3.12:1121 10.34.3.13:1121"

Dget.timeout is for timeout for reading from cache
Dservers is list of memcached servers.

Tips for installing memcached on Centos 5.5

1-) Get the below memcached rpm file



wget ftp://ftp.pbone.net/mirror/ftp.pramberger.at/systems/linux/contrib/rhel5/i386/memcached-1.4.5-2.el5.pp.i386.rpm


My architecture was i386 you find yours an get the appropriate one.


2-) rpm -ihv memcached-1.4.5-2.el5.pp.i386.rpm

There you go....

14 Aralık 2010 Salı

Performance of inserting data on Jboss Cache compared to ConcurrentHashMap.

You can use the below Beanshell script directly with the Jboss Cache 3.2.5 GUI Demo with embedded Beanshell. Just copy the below code piece to a file eg trial.bsh. And to run it from the embedded Beanshell of JBoss Cache GUI Demo do -> source("trial.bsh"). You should see some tps and performance related text output. The below beanshell script file is for ENTRY_COUNT = 120000; You can play with different number of entries. Also do not forget to play with Xms arguments not to get a stack overflow for large entries.


import org.jboss.cache.Fqn;
import java.util.Date;
import java.io.*;
import java.util.concurrent.ConcurrentHashMap;
import java.lang.instrument.*;



public class LocationDataObject implements Externalizable {

private static final long serialVersionUID = 3383966388917008053L;

private Double xCoord;
private Double yCoord;
private Date timeStamp;

public Double getXCoord(){
return xCoord;

}
public Double getYCoord(){
return yCoord;
}
public Date getTimeStamp(){
return timeStamp;
}

public void setXCoord(Double xCoord){
this.xCoord =xCoord ;

}
public void setYCoord(Double yCoord){
this.yCoord = yCoord;
}
public void setTimeStamp(Date timeStamp){
this.timeStamp = timeStamp;
}


public void readExternal(ObjectInput in)
throws IOException,ClassNotFoundException {

xCoord = in.readDouble();
yCoord = in.readDouble();
timeStamp = (Date)in.readObject();
}


public void writeExternal(ObjectOutput out)
throws IOException {
out.writeDouble(xCoord);
out.writeDouble(yCoord);
out.writeObject(timeStamp);
}

};



public class TestJbossCachevsHasmap{
private static final Long ENTRY_COUNT = 120000;

private static Instrumentation instrumentation;

public static void premain(String args, Instrumentation inst) {
instrumentation = inst;
}


public static void main(String [] args){

childFqn1 = Fqn.fromString("/Msisdn");

tm = cache.getTransactionManager();

tm.begin();
msisdnMap = root.addChild(childFqn1);
tm.commit();

locData = new LocationDataObject();

Long startTime = System.currentTimeMillis ();

for(Long fakeMsIsdn=0; fakeMsIsdn < ENTRY_COUNT; fakeMsIsdn++){

locData.setXCoord(10.00D);
locData.setYCoord(20.00D);
Date dateNow = new Date();
locData.setTimeStamp(dateNow);

tm.begin();
msisdnMap.put(fakeMsIsdn.toString(), locData);
tm.commit();

}

Long endTime = System.currentTimeMillis ();

Long executionTime = (endTime - startTime);

double tps = (ENTRY_COUNT*1000)/executionTime;

System.out.println("Duration of Jboss Cache for inserting " + ENTRY_COUNT + " entries in " + executionTime + " msec. Average tps is " +tps );

//System.out.println(ObjectSizeFetcher.getObjectSize(root));

concurrentMap = new ConcurrentHashMap ();

Long startTime2 = System.currentTimeMillis ();

for(Long fakeMsIsdn=0; fakeMsIsdn < ENTRY_COUNT; fakeMsIsdn++){


locData.setXCoord(10.00D);
locData.setYCoord(20.00D);
Date dateNow = new Date();
locData.setTimeStamp(dateNow);
concurrentMap.put(fakeMsIsdn.toString(), locData);

}

Long endTime2 = System.currentTimeMillis ();

Long executionTime2 = endTime2 - startTime2;

double tps2 = (ENTRY_COUNT*1000)/executionTime2;

System.out.println("Duration of ConcurrentHashMap for inserting " + ENTRY_COUNT + " entries in " + executionTime2 + " msec. Average tps is " +tps2 );


}

public static long getObjectSize(Object o) {
return instrumentation.getObjectSize(o);
}



}


TestJbossCachevsHasmap.main(null);