[CentOS-virt] performance differences between kvm/xen

Sat Oct 16 18:11:30 UTC 2010
Pasi Kärkkäinen <pasik at iki.fi>

On Thu, Oct 14, 2010 at 02:16:42PM +0100, Bart Swedrowski wrote:
> Hi Karanbir,
> 
> On 14 October 2010 19:59, Karanbir Singh <mail-lists at karan.org> wrote:
> >
> > On 10/14/2010 07:48 AM, Tom Bishop wrote:
> > > I think xen is still on top in terms of performance and features....now
> >
> > that is indeed what it 'feels' like, but I'm quite keen on putting some
> > numbers on that.
> 
> I have done some testing some time ago on one of the EQ machines that
> I got from hetzner.de.  Full spec of the machine was as following:
> 
>   * Intel® Core??? i7-920
>   * 8 GB DDR3 RAM
>   * 2 x 750 GB SATA-II HDD
> 
> It's nothing big but even though results are quite interesting.  All
> tests were performed on CentOS 5.5 x86_64 with PostgreSQL 8.4 (from
> CentOS repos).
> 

Note that 64bit Xen guests should be HVM, not PV, for best performance.
Xen HVM guests obviously still need to have PV-on-HVM drivers installed.

32bit Xen guests can be PV.

-- Pasi

> I have run some PostgreSQL PGBench tests as well as Bonnie++ tests.
> The PostgreSQL tests was divided into two tests having three goes (to
> get an idea of average).  The commands I used for testing were:
> 
> > dropdb pgbench && sync && sleep 3 && createdb pgbench && sync && sleep 3
> > pgbench -i -s 100 -U postgres -d pgbench && sync && sleep 3
> > pgbench -c 10 -t 5000 -s 100 -U postgres -d pgbench 2>/dev/null && sync \
> > && sleep 3 && pgbench -c 10 -t 5000 -s 100 -U postgres -d pgbench 2>/dev/null \
> > && sync && sleep 3 && pgbench -c 10 -t 5000 -s 100 -U postgres -d pgbench 2>/dev/null \
> > && sync && sleep 3
> 
> Now results.  First CentOS5/x86_64 without any virtualisation, without
> any PostgreSQL optimisation:
> 
> -bash-3.2$ pgbench -c 10 -t 5000 -s 100 -U postgres -d pgbench 2>/dev/null
> pghost:  pgport:  nclients: 10 nxacts: 5000 dbName: pgbench
> transaction type: TPC-B (sort of)
> scaling factor: 100
> number of clients: 10
> number of transactions per client: 5000
> number of transactions actually processed: 50000/50000
> tps = 141.191292 (including connections establishing)
> tps = 141.196776 (excluding connections establishing)
> -bash-3.2$ pgbench -c 10 -t 5000 -s 100 -U postgres -d pgbench 2>/dev/null
> pghost:  pgport:  nclients: 10 nxacts: 5000 dbName: pgbench
> transaction type: TPC-B (sort of)
> scaling factor: 100
> number of clients: 10
> number of transactions per client: 5000
> number of transactions actually processed: 50000/50000
> tps = 156.479561 (including connections establishing)
> tps = 156.486222 (excluding connections establishing)
> -bash-3.2$ pgbench -c 10 -t 5000 -s 100 -U postgres -d pgbench 2>/dev/null
> pghost:  pgport:  nclients: 10 nxacts: 5000 dbName: pgbench
> transaction type: TPC-B (sort of)
> scaling factor: 100
> number of clients: 10
> number of transactions per client: 5000
> number of transactions actually processed: 50000/50000
> tps = 164.880109 (including connections establishing)
> tps = 164.888009 (excluding connections establishing)
> 
> Now after optimisation (shared_buffers, effective_cache_size etc.):
> 
> pghost:  pgport:  nclients: 10 nxacts: 5000 dbName: pgbench
> transaction type: TPC-B (sort of)
> scaling factor: 100
> number of clients: 10
> number of transactions per client: 5000
> number of transactions actually processed: 50000/50000
> tps = 403.430951 (including connections establishing)
> tps = 403.474562 (excluding connections establishing)
> pghost:  pgport:  nclients: 10 nxacts: 5000 dbName: pgbench
> transaction type: TPC-B (sort of)
> scaling factor: 100
> number of clients: 10
> number of transactions per client: 5000
> number of transactions actually processed: 50000/50000
> tps = 336.060764 (including connections establishing)
> tps = 336.093214 (excluding connections establishing)
> pghost:  pgport:  nclients: 10 nxacts: 5000 dbName: pgbench
> transaction type: TPC-B (sort of)
> scaling factor: 100
> number of clients: 10
> number of transactions per client: 5000
> number of transactions actually processed: 50000/50000
> tps = 446.607705 (including connections establishing)
> tps = 446.664466 (excluding connections establishing)
> 
> Now KVM based VM with 7GB RAM and 8 CPUs.  Using virtio and LVM
> partitions as backend.
> 
> PostgreSQL results *w/o* optimisation.
> 
> -bash-3.2$ pgbench -c 10 -t 5000 -s 100 -U postgres -d pgbench
> 2>/dev/null && sync && sleep 3 && pgbench -c 10 -t 5000 -s 100 -U
> postgres -d pgbench 2>/dev/null && sync && sleep 3 && pgbench -c 10 -t
> 5000 -s 100 -U postgres -d pgbench 2>/dev/null && sync && sleep 3
> pghost:  pgport:  nclients: 10 nxacts: 5000 dbName: pgbench
> transaction type: TPC-B (sort of)
> scaling factor: 100
> number of clients: 10
> number of transactions per client: 5000
> number of transactions actually processed: 50000/50000
> tps = 124.578488 (including connections establishing)
> tps = 124.585776 (excluding connections establishing)
> pghost:  pgport:  nclients: 10 nxacts: 5000 dbName: pgbench
> transaction type: TPC-B (sort of)
> scaling factor: 100
> number of clients: 10
> number of transactions per client: 5000
> number of transactions actually processed: 50000/50000
> tps = 140.451736 (including connections establishing)
> tps = 140.463105 (excluding connections establishing)
> pghost:  pgport:  nclients: 10 nxacts: 5000 dbName: pgbench
> transaction type: TPC-B (sort of)
> scaling factor: 100
> number of clients: 10
> number of transactions per client: 5000
> number of transactions actually processed: 50000/50000
> tps = 148.091563 (including connections establishing)
> tps = 148.102254 (excluding connections establishing)
> 
> PostgreSQL tests *with* optimisation:
> 
> -bash-3.2$ pgbench -c 10 -t 5000 -s 100 -U postgres -d pgbench
> 2>/dev/null && sync && sleep 3 && pgbench -c 10 -t 5000 -s 100 -U
> postgres -d pgbench 2>/dev/null && sync && sleep 3 && pgbench -c 10 -t
> 5000 -s 100 -U postgres -d pgbench 2>/dev/null && sync && sleep 3
> pghost:  pgport:  nclients: 10 nxacts: 5000 dbName: pgbench
> transaction type: TPC-B (sort of)
> scaling factor: 100
> number of clients: 10
> number of transactions per client: 5000
> number of transactions actually processed: 50000/50000
> tps = 230.695831 (including connections establishing)
> tps = 230.734357 (excluding connections establishing)
> pghost:  pgport:  nclients: 10 nxacts: 5000 dbName: pgbench
> transaction type: TPC-B (sort of)
> scaling factor: 100
> number of clients: 10
> number of transactions per client: 5000
> number of transactions actually processed: 50000/50000
> tps = 207.535243 (including connections establishing)
> tps = 207.572818 (excluding connections establishing)
> pghost:  pgport:  nclients: 10 nxacts: 5000 dbName: pgbench
> transaction type: TPC-B (sort of)
> scaling factor: 100
> number of clients: 10
> number of transactions per client: 5000
> number of transactions actually processed: 50000/50000
> tps = 206.664120 (including connections establishing)
> tps = 206.695176 (excluding connections establishing)
> 
> And, finally, Xen based VM with 7GB RAM and 8 CPUs.  Using LVM
> partitions as backend.  PostgreSQL tests results *w/o* optimisation:
> 
> -bash-3.2$ pgbench -c 10 -t 5000 -s 100 -U postgres -d pgbench
> 2>/dev/null && sync && sleep 3 && pgbench -c 10 -t 5000 -s 100 -U
> postgres -d pgbench 2>/dev/null && sync && sleep 3 && pgbench -c 10 -t
> 5000 -s 100 -U postgres -d pgbench 2>/dev/null && sync && sleep 3
> pghost:  pgport:  nclients: 10 nxacts: 5000 dbName: pgbench
> transaction type: TPC-B (sort of)
> scaling factor: 100
> number of clients: 10
> number of transactions per client: 5000
> number of transactions actually processed: 50000/50000
> tps = 126.554719 (including connections establishing)
> tps = 126.562829 (excluding connections establishing)
> pghost:  pgport:  nclients: 10 nxacts: 5000 dbName: pgbench
> transaction type: TPC-B (sort of)
> scaling factor: 100
> number of clients: 10
> number of transactions per client: 5000
> number of transactions actually processed: 50000/50000
> tps = 135.472197 (including connections establishing)
> tps = 135.481690 (excluding connections establishing)
> pghost:  pgport:  nclients: 10 nxacts: 5000 dbName: pgbench
> 
> ... and *with* optimisation:
> 
> -bash-3.2$ pgbench -c 10 -t 5000 -s 100 -U postgres -d pgbench
> 2>/dev/null && sync && sleep 3 && pgbench -c 10 -t 5000 -s 100 -U
> postgres -d pgbench 2>/dev/null && sync && sleep 3 && pgbench -c 10 -t
> 5000 -s 100 -U postgres -d pgbench 2>/dev/null && sync && sleep 3
> pghost:  pgport:  nclients: 10 nxacts: 5000 dbName: pgbench
> transaction type: TPC-B (sort of)
> scaling factor: 100
> number of clients: 10
> number of transactions per client: 5000
> number of transactions actually processed: 50000/50000
> tps = 312.133362 (including connections establishing)
> tps = 312.186309 (excluding connections establishing)
> pghost:  pgport:  nclients: 10 nxacts: 5000 dbName: pgbench
> transaction type: TPC-B (sort of)
> scaling factor: 100
> number of clients: 10
> number of transactions per client: 5000
> number of transactions actually processed: 50000/50000
> tps = 203.123398 (including connections establishing)
> tps = 203.146153 (excluding connections establishing)
> pghost:  pgport:  nclients: 10 nxacts: 5000 dbName: pgbench
> transaction type: TPC-B (sort of)
> scaling factor: 100
> number of clients: 10
> number of transactions per client: 5000
> number of transactions actually processed: 50000/50000
> tps = 279.864975 (including connections establishing)
> tps = 279.910306 (excluding connections establishing)
> 
> From my tests it came out that Xen still outperforms KVM especially in
> disk IO performance.  As so and fact my applications are dependant on
> databases (and which are not these days?) I have kept on using Xen.
> 
> Other thing that I like about Xen is you can easily mount LVM
> partitions to the host OS and play with them should you need to.  In
> KVM you've got this double LVM layer which makes it difficult to do
> this.  I know there are ways around it but it just seems a bit more
> easier and straight forward in Xen at the moment.
> 
> Regards.
> _______________________________________________
> CentOS-virt mailing list
> CentOS-virt at centos.org
> http://lists.centos.org/mailman/listinfo/centos-virt