Performance virtualisierter MSSQL-Server
Verfasst: 13.09.2010, 16:44
Hallo zusammen,
das Virtualisieren eines SQL-Servers wird ja sehr unterschiedlich diskutiert. Das Ergebnis ist (so scheint mir), dass es durchaus auch für Produktivsysteme denkbar ist und nur kleine Leistungseinbußen auftreten. Das Problem ist, dass es scheinbar keine objektiven Messkriterien für die Geschwindigkeit gibt.
Meine Vergleiche haben ergeben, der virtuelle SQL-Server ist um mindestens Faktor 3 (!!!) langsamer als ein gut ausgestatteter Arbeitsplatzrechner.
Das kann doch nicht sein, oder?
Hier die Maschinendaten:
Dell PowerEdge 2900 mit 2x Intel Xenon X5355 mit 2,66 GHz = 8 Prozessorcores, 24 GB RAM, IBM SAN per Fibre Channel , ESX V4.0.0 und keine andere virt. Maschine aktiv
Virt. Maschine: 4 Kerne, 6 GB RAM, Virtuelle Festplatten per LSI Logic Parallel
Windows 2008 64Bit, MSSQL 2008 64Bit
Anliegendes SQL-Skript läuft dort etwa 1,5 Minuten (Dauer: 86800 ms)
30 Sekunden erreicht ein gut ausgestatteter Arbeitsplatzrechner ohne jegliche Optimierung.
Also ist dies das Aus für die Virtualisierung eines MSSQL-Servers, oder muss man hierzu erst an einigen „Schrauben“ drehen? Würde ich ja gerne tun, aber welche...
Danke für Feedback und möglicherweise auch Vergleichswerte von euren Maschinen.
Gruß
Holger
Hier das SQL-Skript:
set nocount on;
go
if (exists(select * from master..sysdatabases where name = 'test'))
begin
use master
drop database test;
end
go
create database test
go
use test
go
create table testtable (lfdnr int not null, field1 varchar(255), field2 text, field3 money);
go
alter table testtable add constraint PK_Testtable_Reckey primary key clustered (lfdnr)
go
declare @strFiles varchar(8000);
declare @strName sysname;
set @strFiles = '';
declare csr cursor for
select filename from sysfiles
open csr
fetch next from csr into @strName
while (@@fetch_status <> -1)
begin
if (@@fetch_status <> -2)
begin
set @strFiles = @strFiles + @strName + ' '
end
fetch next from csr into @strName
end
close csr
deallocate csr
declare @starttime datetime;
declare @i int;
declare @j int;
set @starttime = getdate();
set @i = 1;
while @i<=20
begin
set @j = 1;
while @j<=5000
begin
insert into testtable (lfdnr, field1, field2, field3) values (@j, 'testtesttest',
'testtesttest', @j * 2);
set @j=@j+1;
end
select count(*) as count into newtable from testtable;
drop table newtable;
delete from testtable;
set @i=@i+1;
end
print 'SQL-Server: ' + @@servername
print 'MachineName: ' + convert(varchar, serverproperty ('machinename'))
print 'Product: ' + convert(varchar, serverproperty ('ProductVersion')) + ' ' + convert(varchar,
serverproperty ('ProductLevel'))
print 'Edition: ' + convert(varchar, serverproperty ('edition'))
print 'Data Files: ' + @strFiles
print ''
print 'Dauer: ' + convert(varchar, datediff(ms, @starttime, getdate())) + ' ms'
print ''
print 'Verarbeitung beendet'
go
use master
go
drop database test;
go
das Virtualisieren eines SQL-Servers wird ja sehr unterschiedlich diskutiert. Das Ergebnis ist (so scheint mir), dass es durchaus auch für Produktivsysteme denkbar ist und nur kleine Leistungseinbußen auftreten. Das Problem ist, dass es scheinbar keine objektiven Messkriterien für die Geschwindigkeit gibt.
Meine Vergleiche haben ergeben, der virtuelle SQL-Server ist um mindestens Faktor 3 (!!!) langsamer als ein gut ausgestatteter Arbeitsplatzrechner.
Das kann doch nicht sein, oder?
Hier die Maschinendaten:
Dell PowerEdge 2900 mit 2x Intel Xenon X5355 mit 2,66 GHz = 8 Prozessorcores, 24 GB RAM, IBM SAN per Fibre Channel , ESX V4.0.0 und keine andere virt. Maschine aktiv
Virt. Maschine: 4 Kerne, 6 GB RAM, Virtuelle Festplatten per LSI Logic Parallel
Windows 2008 64Bit, MSSQL 2008 64Bit
Anliegendes SQL-Skript läuft dort etwa 1,5 Minuten (Dauer: 86800 ms)
30 Sekunden erreicht ein gut ausgestatteter Arbeitsplatzrechner ohne jegliche Optimierung.
Also ist dies das Aus für die Virtualisierung eines MSSQL-Servers, oder muss man hierzu erst an einigen „Schrauben“ drehen? Würde ich ja gerne tun, aber welche...
Danke für Feedback und möglicherweise auch Vergleichswerte von euren Maschinen.
Gruß
Holger
Hier das SQL-Skript:
set nocount on;
go
if (exists(select * from master..sysdatabases where name = 'test'))
begin
use master
drop database test;
end
go
create database test
go
use test
go
create table testtable (lfdnr int not null, field1 varchar(255), field2 text, field3 money);
go
alter table testtable add constraint PK_Testtable_Reckey primary key clustered (lfdnr)
go
declare @strFiles varchar(8000);
declare @strName sysname;
set @strFiles = '';
declare csr cursor for
select filename from sysfiles
open csr
fetch next from csr into @strName
while (@@fetch_status <> -1)
begin
if (@@fetch_status <> -2)
begin
set @strFiles = @strFiles + @strName + ' '
end
fetch next from csr into @strName
end
close csr
deallocate csr
declare @starttime datetime;
declare @i int;
declare @j int;
set @starttime = getdate();
set @i = 1;
while @i<=20
begin
set @j = 1;
while @j<=5000
begin
insert into testtable (lfdnr, field1, field2, field3) values (@j, 'testtesttest',
'testtesttest', @j * 2);
set @j=@j+1;
end
select count(*) as count into newtable from testtable;
drop table newtable;
delete from testtable;
set @i=@i+1;
end
print 'SQL-Server: ' + @@servername
print 'MachineName: ' + convert(varchar, serverproperty ('machinename'))
print 'Product: ' + convert(varchar, serverproperty ('ProductVersion')) + ' ' + convert(varchar,
serverproperty ('ProductLevel'))
print 'Edition: ' + convert(varchar, serverproperty ('edition'))
print 'Data Files: ' + @strFiles
print ''
print 'Dauer: ' + convert(varchar, datediff(ms, @starttime, getdate())) + ' ms'
print ''
print 'Verarbeitung beendet'
go
use master
go
drop database test;
go