W komentarzach do mojego poprzedniego wpisu poświęconego tematowi licencjonowania wirtualnych procesorów pojawiło się kilka interesujących uwag. Po pierwsze, postawiono tezę, że Hyper-V potrafi zapewnić wydajność kilku procesorów fizycznych w jednym wirtualnym, więc nie ma potrzeby przypisywania kilku wirtualnych CPU do maszyny. Po drugie, zwrócono mi uwagę na obecność eksperymentalnego parametru w ESXi 4.0 umożliwiającego połączenie kilku wirtualnych procesorów w jeden. Obie rzeczy wydały mi się na tyle interesujące, że pokusiłem się o mini-testy i porównanie wydajności zarówno w przypadku Hyper-V R2, jak i ESXi 4.0. Przy okazji testów wyszedł jeszcze jeden nieciekawy mankament bezpłatnej licencji ESXi 4.0 - brak obsługi ośmioprocesorowych maszyn wirtualnych...
Nie uprzedzajmy jednak faktów. Na pierwszy ogień weźmy temat obsługi procesorów w Hyper-V poruszony w komentarzach przez naszego czytelnika, jendrasa. Teza jak dla mnie była dość zaskakująca i, przyznam szczerze, mało racjonalna - mimo tego postanowiłem to sprawdzić. Ostatecznie gdyby prawdą okazało się, że Hyper-V potrafi osiągnąć pełną moc serwera na maszynie wirtualnej tylko z jednym wirtualnym procesorem, byłby to hit i znaczna oszczędność na licencjach (nie tylko na aplikacje per procesor, ale także na systemy - na przykład Windows Server 2008 Standard obsługuje tylko cztery procesory i nawet jak przypiszemy mu więcej, to ich nie zobaczy).
Maszyna testowa to znany z naszych poprzednich testów hypervisorów serwer Intela z dwoma czterordzeniowymi procesorami Xeon 5405. Metodologia testów: Hyper-V 2008 R2, na nim jedna maszyna wirtualna z Windows Server 2008 Enterprise x64, różna liczba procesorów wirtualnych. W przeciwieństwie do konkurencyjnych hypervisorów Hyper-V nie oferuje zbyt wielu opcji konfiguracyjnych dla procesorów, więc test jest w zasadzie prosty. Aplikacją pomiarową była Sandra 14 w wersji inżynierskiej. Czy będzie różnica w wydajności?
Tak jak się spodziewałem, wyniki mówią same za siebie - jednak warto przypisywać więcej wirtualnych procesorów do maszyny wirtualnej, jeden procesor wirtualny niewiele potrafi. Prawdą jest, że Hyper-V rozrzuca wątki z procesorów wirtualnych na wszystkie posiadane procesory fizyczne (nie da się tego ograniczyć, tak jak np. w ESX/ESXi), ale nieprawdą jest, że potrafi agregować wydajność kilku procesorów w jednym wirtualnym. Nie rozwiązuje to więc problemu z licencjonowaniem - jeśli chcemy wydajnych aplikacji, musimy przypisać więcej procesorów do maszyny wirtualnej, za co musimy więcej zapłacić.
Skoro rozstrzygnęliśmy już kwestię Hyper-V, weźmy teraz na tapetę ESXi i jego bardzo ciekawą, nieodkrytą przeze mnie wcześniej możliwość przypisania większej niż jeden liczby rdzeni per procesor wirtualny. Może to i wstyd przyznać, ale do tej pory nie wiedziałem, że - jak wspomniał w komentarzach jeden z naszych czytelników, Webio - istnieje eksperymentalny parametr, który pozwala przypisać do jednego wirtualnego procesora więcej rdzeni niż jeden. Standardowo każdy wirtualny procesor widziany jest bowiem jako oddzielny procesor "fizyczny" przez system gościa. Dzięki omawianemu parametrowi można doprowadzić do sytuacji, gdzie wirtualny system widzi tylko jeden procesor "fizyczny", ale za to cztery lub nawet osiem procesorów logicznych - jako wirtualne rdzenie. Niweluje to sporo poważnych ograniczeń - pomijając kwestie oszczędności w licencjonowaniu per procesor, dzięki ustawieniu dwóch rdzeni na vCPU możliwe jest na przykład wykorzystanie ośmiu wirtualnych procesorów w Windows Server 2008 Standard o czym wspominałem już wyżej.
Parametr, o którym mowa to cpuid.coresPerSocket i należy wprowadzić go w ustawieniach maszyny wirtualnej w oknie Configuration Parameters, które to z kolei trzeba wywołać z karty Options właściwości maszyny wirtualnej (sekcja Advanced - General). Wartością tego parametru jest liczba rdzeni per procesor wirtualny - musi być to dzielnik liczby wirtualnych procesorów przypisanych do maszyny. Przykładowo mając cztery wirtualne procesory możemy ustawić 1 (domyślne), 2 lub 4 rdzenie. Spowoduje to, że liczba widzianych przez system procesorów "fizycznych" będzie wynosić odpowiednio 4, 2 i 1.
Zanim przejdę do wyników testów, muszę przyznać, że srogo zawiodłem się na bezpłatnym ESXi. Zawód, a wpierw zdziwienie nadeszło, gdy spróbowałem przypisać osiem wirtualnych procesorów (a właściwie cztery po dwa rdzenie) do jednej z testowych maszyn wirtualnych - w momencie startu maszyny ESXi poinformował mnie, że nie mam odpowiedniej licencji... Może to i wstyd (kolejny już raz dzisiaj), ale VMware tak trąbiło o wsparciu dla 8-way SMP (a XenServer też ma to od jakiegoś już czasu), że jakoś nie doczytałem, że w przypadku ESXi funkcjonuje to jedynie po zakupieniu licencji vSphere Enterprise Plus. Jest to moim zdaniem spory mankament, choć z drugiej strony wydany kilka dni temu hypervisor Microsoftu w wersji R2 również nie pozwala przypisać więcej niż czterech wirtualnych procesorów. Dlaczego jednak mamy równać w dół?
Wracając do meritum - parametr sterujący liczbą rdzeni może i eksperymentalny, ale nie byłbym sobą, gdybym nie sprawdził jak takie wirtualne rdzenie mają się do wydajności "zwykłych" wirtualnych procesorów. Tym razem testy przeprowadziłem na aktualnie testowanym u nas w redakcji (pod różnym kątem - szczegóły wkrótce) serwerze Triline opartym o komponenty Intela z gorącymi nowinkami, takimi jak dwa procesory Intel Xeon serii 5560 (Nehalem) czy dyski SSD. Zainstalowałem ESXi 4.0 (licencja trial, żeby sprawdzić też ośmioprocesorowy wariant) i posadziłem na nim jedną maszynę wirtualną z Windows Server 2008 Enterprise x64 po kolei przypisując różne ilości procesorów i rdzeni. Oto wyniki z Sandry:
Uwzględniając drobny margines błędu można śmiało powiedzieć, że wydajność konfiguracji opartych o tę samą liczbę wirtualnych procesorów - bez względu na ilość rdzeni per procesor - nie różni się. Rzeczywiście więc rozwiązuje to poruszany przeze mnie w ostatnim wpisie temat drogich licencji per procesor w środowiskach wirtualnych - możemy zmniejszyć liczbę procesorów, a jednocześnie zachować ich wydajność. Całkowitą euforię powstrzymuje jedynie fakt, że jak udało mi się ustalić, magiczny parametr jest już obecny w ESX od kilku aktualizacji i skoro nadal pozostaje eksperymentalny, to może nie należy rzucać się na niego bez co najmniej głębszego zastanowienia... Co ciekawe, podobna opcja dostępna jest także w XenServerze - opisuje to chociażby ten wątek na forum Citriksa. Niestety w przeciwieństwie do ESXi, bezpłatny XenServer nie pozwala na jej zastosowanie, trzeba zaopatrzyć się w płatne narzędzia. Również tam jednak opcja ta jest oficjalnie nieudokumentowana - wniosek z tego taki, że wirtualizacja wielordzeniowych procesorów pozostaje póki co w sferze eksperymentów.