суббота, 2 апреля 2011 г.

PowerShell + VMware = PowerCLI. How-to

clip_image001
Данный текст – памятка самому себе, и инструкция для тех, кто с данным скриптовым языком не работал, но хочет (или нужда заставляет).
Эта инструкция не претендует на полноту и академичность. Рекомендации даются те, до которых додумался автор – а не самые лучшие на всем свете и во все времена. Кстати, советы и комментарии приветствуются.
Эта инструкция претендует на быстрое освоение азов и начало использования мощного механизма автоматизации vSphere (и View, и много чего еще).
Итак - чтобы начать получать профит от PowerShell для vSphere, выполняем простую последовательность шагов:
1) Устанавливаем необходимое
1.а) На Win7\2008 только PowerCLI
1.б) На WinXP\2003 еще и PowerShell предварительно
1.в) Вспомогательные сторонние утилиты
2) Настраиваем профиль для удобной работы
3) Узнаем и запоминаем азы
3.а) С чего начать
3.б) Куда посмотреть
3.в) Основные конструкции и хинты
4) Где взять готовое
4.а) Ссылки
4.б) Onyx
А теперь по пунктам.

1) Устанавливаем необходимое

Нам потребуются PowerShell (если еще не установлен) –> PowerCLI
Опционально – сторонние вспомогательные утилиты, я предложу PowerGUI и PowerTab.

1.а) на Win7\2008 только PowerCLI

На современных ОС от Майкрософт PowerShell (в тексте иногда будет сокращаться как posh) уже установлен.
Поэтому сразу идем на http://vmware.com/go/powercli и загружаем последнюю версию PowerCLI.
Перед установкой запускаем posh и разрешаем выполнение неподписанных скриптов вот такой командой
Set-ExecutionPolicy RemoteSigned
или
Set-ExecutionPolicy Unrestricted
Первое более правильно с точки зрения формальной безопасности, второе – слегка более комфортно. Я в своей НЕ производственной среде использую второй вариант.
А теперь устанавливаем PowerCLI. Next, Next, Finish.

1.б) на WinXP/2003 еще и PowerShell предварительно

Идем на http://www.microsoft.com/powershell, загружаем себе Windows Management Framework Core (!) – это название пакета, в который входит PowerShell. Вполне вероятно, что posh не установится без .Net Framework 2 SP1.
Затем идем на http://vmware.com/go/powercli и загружаем последнюю версию PowerCLI.
Перед установкой запускаем posh и разрешаем выполнение неподписанных скриптов вот такой командой
Set-ExecutionPolicy RemoteSigned
или
Set-ExecutionPolicy Bypass
Первое более правильно с точки зрения формальной безопасности, второе – слегка более комфортно- меньше подтверждений требуют. Я в своей НЕ производственной среде использую второй вариант.
А теперь устанавливаем PowerCLI. Next, Next, Finish.

1.в) вспомогательные сторонние утилиты

Я предложу пока парочку – PowerGUI и PowerTab.

PowerGUI

Загружаем PowerGUI отсюда – http://www.powergui.org.
Без затей устанавливаем. Я пользуюсь практически только его PowerGUI Script Editor:

UPD. В составе актуальной  версии posh поставляется продукт PowerShell ICE - как раз редактор для написания скриптов. Пользуюсь теперь им.


clip_image002
Эта штука дает удобный интерфейс для написания скриптов, подсветка синтаксиса, подстановка параметров и переменных.

PowerTab

UPD. сейчас я этой штукой не пользуюсь, как-то с опытом она стала менее удобной, но как памятку оставлю.

Для начала маленькая иллюстрация:
Начните писать какую-нибудь команду в консоли PowerCLI. Например:
Get-VM
Но ограничьтесь только  
Get-V
И нажмите Tab. Вы увидите, что PowerCLI дописал вам команду до Get-VApp. Нажмите Tab снова – команда поменялась на следующий подходящий вариант (Get-Variable). Так можно Tab’ом перебрать до необходимой нам команды. Запомним такое поведение.
Загружаем PowerTab отсюда - http://powertab.codeplex.com/.
Запускаем PowerCLI и выполняем команду:
$env:PSModulePath
На выходе получаем что-то вроде:
C:\Documents and Settings\mmm\Мои документы\WindowsPowerShell\Modules;
C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\
Вот по любому из этих путей скопируйте каталог PowerTab из ранее загруженного архива.
Теперь в окне PowerCLI выполните команду
Import-Module PowerTab
Я на все вопросы нажимал Enter, устанавливая модуль с параметрами по умолчанию.
Начните писать какую-нибудь команду в консоли PowerCLI. Например:
Get-VM
Но ограничьтесь только  
Get-V
И нажмите Tab.
Теперь по нажатию Tab в консоли PowerCLI мы вместо поочередного добивания подходящих вариантов наблюдаем более удобную картину:

clip_image003
Выбрать нужную команду или там параметр объекта теперь проще.
Обратите внимание – команда Import-Module загрузила нам PowerTab только до закрытия окна PowerCLI. Для постоянного использования этой утилиты следует добавить ее импорт в профиль – см. п.2.
Подробности про модули в общем см. тут - about_Modules.

2) Настраиваем профиль для удобной работы

Профиль – это скрипт posh, выполняемый при запуске.
В нем удобно определять всякие постоянно используемые мелочи.
Это функции, переменные, псевдонимы команд, настройки цветов консоли и пр.
Здесь я приведу пример своего профиля, с неполными комментариями – что не прокомментировано здесь будет затронуто в п.3.

Итак, нам нужен профиль.
Сначала проверяем, существует он у нас или нет. Выполним команду
test-path $profile
Если на выходе false, то профиля нет, и его надо создать. Для этого выполните команду
new-item -path $profile -itemtype file -force
Теперь профиль создан.
Когда профиль создан, или уже существовал, отредактируем его. Выполните команду
notepad $profile
В блокноте откроется файл (в первый раз он будет пуст) – и сюда следует добавить нужные нам вещи.
Вот что добавлено у меня:
$vc = "vcenter4.vm4.ru" 
 ##адрес сервера vCenter
$esx1 = "esx1.vm4.ru" 
 ## имя одного сервера ESX
$esx2 = "esxi2.vm4.ru" 
 ## имя другого сервера ESX

$vccred = Get-VICredentialStoreItem -host $vc -file D:\cred.xml 
## Это файл с учетными данными для подключения к vCenter

function pro {notepad $profile} 
 ## Теперь написав "pro" я открываю профиль для редактирования

add-pssnapin VMware*
## Для подгрузки командлетов vSphere в стандартный posh

Connect-VIServer $vc -User $vccred.user -Password $vccred.Password 
 ## инициация подключения к vCenter

Import-module PowerTab  
## Импорт модуля PowerTab

new-alias -name vm -value Get-VM  
## Псевдоним для Get-VM = vm

function vmON {get-vm | ? {$_.PowerState -eq "PoweredOn"}}
## функция vmON выводящая список всех включенных ВМ

cd \
clear 

Теперь при старте powerCLI данные команды будут выполняться автоматически. Конкретно в моем случае –
  • Создается несколько переменных, в частности $vc – мой сервер vCenter.
  • Создается функция pro – этими тремя буквами я вызываю редактирование профиля.
  • Создается псевдоним vm – этими двумя буквами я вызываю команду Get-VM.
  • Набрав vmON я получаю список включенных ВМ. vmON это имя функции, реализующей данную выборку.
  • Загружается модуль PowerTab.
  • Устанавливается соединение с сервером vCenter, авторизация производится учетными данными, ранее сохраненными в файл d:\cred.xml. Кстати - если вы запускаете PowerShell работая в учетной записи Windows, имеющей право на доступ к vCenter, то достаточно выполнить
    Connect-VIServer $vcпри такой команде posh попытается авторизоваться из под текущего пользователя.
Вот по последнему пункту маленькое отступление – необходимо создать файл-хранилище учетной записи. Для этого выполните команду
New-VICredentialStoreItem -host $vc -user administrator -Password gfhjkm -File d:\cred.xml

Однажды созданный, файл раз за разом используется в профиле.
Этот механизм авторизации использую я – но я не утверждаю, что такой следует использовать вам.

Про профиль - about_Profiles.

UPD.
Как поменять цвета консоли PowerShell - http://habrahabr.ru/blogs/powershell/126965/.

Появилась рекомендация по ускорению первого выполнения скрипта posh - How to speed-up the execution of the first PowerCLI cmdlet.
Вроде как .Net что-то там компилирует, в первый раз, поэтому два подряд выполнения одного скрипта могут на порядок отличаться по скорости. Вот для борьбы с этим есть пара действий.

UPD. У вас есть ярлык для запуска PowerShell, и ярлык для запуска PowerCLI. Они отличаются тем, что второй подгружает командлеты VMware, а первый - нет. Чтобы командлеты VMware подгружались всегда, в профиль стоит добавить
add-pssnapin VMware*

UPD. 

Дополнительные команды.
http://www.vm4.ru/2011/11/powercli-addon.html

3) Узнаем и запоминаем азы

Данный текст - всего лишь памятка, поэтому тут только некоторые основы.

3.а) С чего начать

Запустите установленный PowerCLI, и выполните команду

Get-VM

эта команда (командлет по правильному) показывает информацию (на это указывает Get в названии) по объектам виртуальные машины (VM в названии).
По схеме действие-объект построены все или почти все командлеты posh, и часто по названию можно сориентироваться.
Например, существуют командлеты Start-VM, Export-VMHostProfile и т.п.

Важно – каждая команда выдает на выходе объект. Когда после Get-VM мы на экране видим следующее:

clip_image005 То
важно понимать – команда показала нам не текст с именем ВМ, статусом ВКЛ\ВЫКЛ и пр, а команда получила список объектов (тут – виртуальных машин), и на экран вывела некоторые свойства этих объектов, примерно так:

объект_ВМ1. Имя   объект_ВМ1. Статус 
объект_ВМ2. Имя   объект_ВМ2. Статус 
объект_ВМ3. Имя   объект_ВМ3. Статус


Это означает две вещи – мы можем использовать любое свойство объекта, который получил наш командлет, и мы можем объект\объекты с вывода одного командлета подавать на вход другому.

Например – возьмем банальный CD-ROM виртуальной машины. Для получения информации о нем существует командлет Get-CDDrive.
Ему на вход следует подать список ВМ - о приводах которых (или одной которой) надо вывести информацию. Прочтя краткий хелп, мы видим, что у этой команды есть параметр –VM. Пробуем:  
Get-CDDrive -VM *
Видим список подключенных cd-rom, и что именно подключено, для любой ВМ (тут звездочка – классический символ подстановки вида «любой набор символов», т.е. тут мы выбираем ВМ с любым именем, т.е. выбираем все ВМ):

clip_image006
Вывод не особо читаем, но форматирование займемся чуть позже.
А можно сделать чуток по другому:  

Get-CDDrive –VM (а в скобках не указывать конкретную ВМ или символ подстановки, а вставить командлет делающий выборку виртуальных машин)

например так:  

Get-CDDrive - VM (Get-VM)

На выход получим то же самое (Get-VM ,без параметров возвращает все имеющиеся ВМ).
Наконец, можно расположить команлеты в обратном порядке – сначала сделать выборку, а потом передать результаты в Get-CDDrive:  

Get-VM | Get-CDDrive

эти три варианта идентичны. Обычно лучше использовать последний вариант – удобнее. Сделали одну выборку, затем поставили вертикальную черту «|» - и после нее пишем действия над результатами первой операции – вертикальная черта как раз предписывает передать объекты «по конвейеру».

Итак – несколько важных фактов:

1) Командлеты работают над и возвращают как результаты работы объекты.

2) Обычно мы обращаемся к свойствам объектов.

3) Объекты можно передавать по конвейеру.

Осталось понять – а как мне узнать нужный командлет, нужное свойство, и как мне реализовать мелкие фишки – типа форматирования плохочитаемого дефолтного вывода.

3.б) Куда посмотреть

У нас есть понимание того, что мы хотим получить. Теперь надо это понимание реализовать в скрипте. Начинаем, вестимо, с команд – какая команда выполняет желаемое?

Как узнать командлет.

Первое о чем стоит сказать – можно просто получить список всех возможных команд PowerCLI:
Get-VICommand
Так как полный список обычно не нужен, можно сделать фильтрацию по действию или объекту:  
Get-VICommand | ? { $_.Noun -eq 'VM' }
Все командлеты выглядящие как “что-то-VM”
(можно слегка по-другому это вызывать
get-command -Module vmware* -verb get )

А следующая команда покажет все командлеты выглядящие как “Get- что-то”
Get-VICommand | ? { $_.Verb –eq 'Get'}
Или еще можно вот так:  
Help *vm*
Список команд, в названии которых есть подстрока в звездочках.

Вообще, команда help (она является псевдонимом для командлета Get-Help) очень полезна. Есть разные ключики:
help Get-VM – краткая справка по командлету  
help Get-VM –full - полная справка  
help Get-VM –examples - примеры  
help Get-VM –online – онлайн справка

Итак, командлет мы найдем - просто отталкиваясь от ожидаемого имени. Теперь бы разобраться с тем, какую инфу, какие свойства объектов этот командлет нам может дать.

Свойства

Самая главная тут команда – Get-Member, или ее псевдоним gm. Этот командлет следует применить после командлета, выдающего объект, чьи свойства нас интересуют. Например конвейер  
get-vm | get-member

покажет список свойств ВМ. clip_image007 Например, нас интересует свойство Guest.
Теперь можно например так  
(Get-VM ad).Guest
нам покажут значение этого свойства для ВМ с именем «AD».
Но там может быть много полей с дополнительными данными. Чтобы увидеть их – повторим итерацию:
(Get-VM ad).Guest | gm

А чтобы не просматривать свойства по одному, а увидеть все варианты:
Get-VM ad | Format-Custom guest -depth 2
с помощью этой команды мы можем увидеть доступную информацию, а потом обращаться только к нужным полям, например так:  

(Get-VM ad).guest.vm.harddisks

Ну и хелп, конечно, никто не отменял.
Для не информационных комадлетов, таких как Get, а чего-то вроде New-VM, Set-VirtualSwitch и т.п. вариант с Get-Member не прокатит – там придется читать хелп.


А вот тут приведен скрипт, выполнение которого сформирует csv-файл с данными по параметрам каждого командлета PowerCLI - http://www.lucd.info/2011/03/04/powercli-cmdlet-xref-another-look/

3.в) Основные конструкции и хинты

Upd. Get-View

есть специфический командлет - get-view.
позволяет получить инфу, иногда недоступную больше никак. Иногда - в более удобном виде\месте чем другими способами.
вот тут - Use PowerShell to Simplify Access to Data Through PowerCLI - оптимизация работы с ним.

Выборка объектов по критерию 
Полезно использовать конструкцию  
where {$_.Поле оператор_сравнения значение} например  

get-vm | where {$_.PowerState -eq "PoweredOn"}

Мне больше нравится писать не where, а знак вопроса:
get-vm | ? {$_.PowerState -eq "PoweredOn"}

В этих двух конструкциях вы видите «$_». Это – указание на объект, переданный на вход. В скрипте из примера что происходит – «Get-VM» без параметров возвращает список вообще всех ВМ, т.е. не объект, а массив объектов. Мы хотим обратиться к каждому объекту из массива, и проверить значение в свойстве PowerState. Переменная «$_» как раз и позволяет обратиться не к свойству конкретного объекта, а к свойству каждого объекта, переданного на вход.

Операции сравнения

Введем переменные для иллюстрации:
$vm_list = “vm1”, “vm2”,”vm3”  
$vm_test = “vm3”  

Равно.
Следующее утверждение неверно  
$vm_list –eq $vm
а вот это верно:  
“vm3” –eq $vm_test  

Неравно.  
-ne  

Большем чем.  
-gt
например  if(6 -gt 5) { echo "6 больше чем 5" }  

Меньше чем.
-lt  

Больше равно.  
-ge

Меньше равно.  
-le

Содержит.
Следующее утверждение истинно:  
$vm_list –contains $vm_test  

Не содержит.  
$vm_list –notcontains $vm_test  

А если к любому оператору сравнения вначале приписать букву “c”, то операция сравнения будет выполнена с учетом регистра.  

“vm3” –сeq $vm_test

Символы подстановки

* - что угодно

[ab]* - строка начинающаяся с a ИЛИ b

? – любой один символ

Использование:

Get-VM  *

Get-VM viewdesktop?

UPD. из комментариев.:

Еще может быть полезен оператор сравнения "-like" - поиск по простому шаблону - когда не помнишь точное название VM или чтобы не вписывать весь Datastore ID.

Вывод нужных свойств объектов

Если вернутся к срипту, показывающему данные CD-ROM всех наших ВМ:
Get-VM | Get-CDDrive

то мы вспомним, что информация на выходе не особо читаема clip_image006[1] Улучшим это.
Для улучшения вывода можно применить командлет Select-Object, позволяющий вывести на экран указанные свойства, примерно так:

командлет1 | командлет2 | Select-Object название_свойства1, название_свойства2.

А откуда взять названия свойства? Из Get-Member: clip_image010

Или, в некоторых ситуациях, может пригодиться добавить в конце | Format-Table –Wrap

  image

как видно – длинные строки были отформатированы при помощи переноса строки.

Разбор csv файла

Сам файл c:\vms.csv
name,host,datastore
vmt1
,esxi2.vm4.ru,iSCSI_main_100GB
vmt2
,esxi2.vm4.ru,iSCSI_main_100GB
vmt3
,esxi2.vm4.ru,iSCSI_main_100GB
заносим файл в переменую:
$vmcsv = import-csv C:\vms.csv

Используем его вот такой конструкцией:

foreach ($line in $vmcsv)     

      { new-vm -Name $line.name -vmhost $line.host -datastore $line.datastore}

Запуск такого скрипта создаст мне три виртуальные машины, на указанно хосте, с указанными именами и на указанном хранилище. Прочие параметры так же можно явно указать, при необходимости. 

Организация циклов

$str = New-Object System.Text.StringBuilder
for($i=0; $i -lt 5; $i++)
       { $str = $str.Append([String]::Format("{0} ", $i)) }  

echo $str.ToString()

Здесь мы определили строковую переменную $str, в начале она пуста.
Затем начали цикл for, определили переменную $i, используем ее как счетчик.
Пока $i меньше 5 к переменной $str добавляем пробел и значение $i на текущем этапе.
После завершения цикла на экран будет выведено строковое значение $str, это будет
1 2 3 4.
Пример с if else уже был:

if(6 -gt 5) { echo "6 больше чем 5" }

В if может быть только одно условие. 

Сортировка

Для сортировки применяется конструкция sort-object. Например, для сортировки виртуальных машин по тому, на каком хосте они работают, надо выполнить такую цепочку:
Get-VM | Sort-Object Host
здесь Host – свойство объекта виртуальная машина.

Можно сразу по нескольким полям:
Get-VM | Sort-Object Host, Name
тут виртуальные машины сначала будут отсортированы по хостам, внутри этой сортировки – по именам.

Добавив ключ –descending сортируем в обратном порядке.

Форматирование

Format-List - вывод списком свойств объекта 
Get-vm | sort-object PowerState | format-list -groupby PowerState
Выбрали все ВМ –> отсортировали по вкл\выкл –> результаты в виде списка, да еще разбитые на подкатегории по статусу ВКЛ\ВЫКЛ ВМ.

Может быть полезно  

Get-vm | sort-object PowerState | format-list
Вывод всех полей.

Format-Table - вывод таблицей
Очень полезна следующая конструкция:  
Get-vm | get-member | format-table –wrap
 Будет с переносом строк текста внутри строк таблицы – без этого длинные примечания нечитабельны

Format-Wide - вывод списком в несколько столбцов одного свойства.

Get-vm | format-wide –autosize
 Выводит только имя (по умолчанию), но в несколько столбцов. Удобнее для просмотра длинных списоков. Autosize – он сам выбирает число столбцов. 

Или сами выбираем не имя, а другое поле объекта  
Get-vm | format-wide guest

Format-Custom Форматирование по некому шаблону.
По умолчанию, я так понимаю, в виде xml.

UPD. Из комментариев.

- Вывод в файл осуществалется ">" либо ">>"
- Экпорты Export-csv, Export-clixml, convertto-html - назначение понятно по названию.

Запуск самостоятельного скрипта

Если скрипт лежит в каталоге c:\posh, то вариантов несколько:

1. В консоли posh указать полный путь  
c:\posh\script1.ps1

2. Перейти в этот каталог  
cd c:\posh
затем выполнить скрипт  
./script1.ps1
или  
.\script1.ps1

3. В переменной окружения path добавить каталог со скриптом
$env:path += “c:\posh”
при регулярных обращениях к скриптам из каталога лучше добавить эту строку в профиль.
Ну или без затей сделать это из графического интерфейса – в свойствах моего компьютера -> вкладка дополнительно -> кнопка переменные среды.

Затем в консоли вызываем скрипт просто по имени
script1

Если хотим выполнить posh-скрипт откуда-то еще, например из планировщика, то как вариант, создаем батник, в него пишем
%SystemRoot%\system32\windowspowershell\v1.0\powershell.exe -psc "C:\Program Files\VMware\Infrastructure\vSphere PowerCLI\vim.psc1" -command "c:\posh\script1.ps1"

Звуковая сигнализация

Можно сделать вот так:  
$beep = “`a”

здесь перед a стоит обратная кавычка, которая на клавише с буквой ё.
Тогда обратившись к этой переменной
$beep
вы услышите писк

А если в переменную занести слегка другое значение
$beep = “`a`a `a `a `a `a `a `a `a ”
то услышим много писка.

Помогает, когда надо привлечь внимание.    

Как поправить конфиг ВМ
http://communities.vmware.com/thread/306105?tstart=30    

Скопировать что-то на VMFS хранилище

Все хранилища подмонтируются в posh-диск vmstores.
Так что если выполнить  
cd vmstores:
(двоеточие в конце принципиально)
а затем делать dir\ls и углубиться в структуру каталогов – найдем нужное. затем можно использовать mkdir  для создания каталогов и Copy-DatastoreItem для копирования данных на хранилище.
Например  
mkdir test cd ./test Copy-DatastoreItem -Item C:\some_file.ext
После этого мы обнаружим на VMFS\NFS хранилище каталог test  и соответствующий файл внутри.

А еще можно сделать  
cd vi:
и тогда мы попадем в иерархию vCenter как на posh-диск.
Можно с помощью dir\ls и cd спускать по структуре пулов\ vApp, хостов\кластеров, и выполняя, например, get-vm, получать на выход только объекты с текущего уровня.  

Чтобы скрипт не требовал подтверждения
Добавить -Confirm:$false  

Как положить файл на файловую систему ESX(i)

http://communities.vmware.com/message/1630559#1630559
Вкратце – вызов ssh сессии из powerCLI скрипта.

Запустить команду в гостевой ОС из сессии PowerCLI к vCenter\ESX(i)

Есть специальный командлет Invoke-VMScript
Например, мы массово хотим сделать ipconfig/release. Нам поможет скрипт
Get-VM | Invoke-VMScript –ScriptText “ipconfig/release” –ScriptType Bat –guestuser DomainAdmin –GuestPassword gfhjkm

Запускать в госте можно команды PowerShell, CMD и BASH.
Или передавать путь к скрипту внутри
Get-VM | Invoke-VMScript –ScriptText “c:\a.bat” –ScriptType Bat –guestuser DomainAdmin –GuestPassword gfhjkm

Если передаваемая внутрь команда – не PowerShell, то для Windows гостей нужно указать тип - –ScriptType Bat.

4) Где взять готовое

4.а) Ссылки


4.б) Onyx

Для того, чтобы продолжить, очень полезной может оказаться утилита Onyx. Очень, очень прикольная штука, хоть пока и не в статусе релиза. Примерный план получения profit'а:

1) По ссылке скачали архив, распаковали, запустили исполняемый файл. Нажали звездочку, и указали адрес vCenter.

2) Клиентом vSphere подключаемся на ту машину и порт, где запущен Onyx.

3) В окне Onyx нажимаем пиктограмму начала записи, и в клиенте vSphere выполняем действия, которые мы хотели бы заскриптовать. В окне Onyx появится готовый скрипт для этого! Левая из пиктограмм сохранит содержимое окна в файл скрипта PowerShell.

Те скрипты, на которых экспериментировал я, выполнялись и делали нужную работу без дополнительных усилий с моей стороны. В Onyx я сохранил скрипт под именем ps_start_SQL_VM.ps1. В PowerCLI я запустил файл с таким именем. Все.

Конец.

среда, 30 марта 2011 г.

LACP, 802.3ad, load based IP hash и все такое

Вводная

У нас есть виртуальный коммутатор, у него несколько физических интерфейсов, через которые он подключен к двум физическим коммутаторам
(такая схема, с поправкой на число аплинков(физических сетевых контроллеров), видится мне типовой).
См. рис.1:

Рис. 1. Иллюстрация компонентов сети


Левая часть этой схемы - связь от виртуальной машины до виртуального коммутатора.
Правая часть - от виртуального коммутатора до коммутаторов физических.
Обе эти части схемы, независимо друг от друга, периодически обсуждаются в контексте повышения производительности сети. Что об этом можно сказать:

1. Производительность и балансировка нагрузки для "виртуальной" стороны - vNIC <-> vSwitch

Тут ситуация довольно простая, и вариантов у нас не много. Сразу оговорка - все эти варианты предполагают увеличение скорости сети только "внутри" ESX(i). Если нас интересует быстрая сеть между ВМ и кем-то "снаружи", то в дело вступает еще и "физическая сторона", которая, при настройках по умолчанию, ограничит нашу ВМ производительностью одного аплинка, для большинства из нас это гигабит. Но обсудить варианты все равно важно - о физической стороне позже.

Вариант 1
Один виртуальный сетевой контроллер, и побыстрее В простом случае у виртуальной машины одна виртуальная сетевая карта, обычно типа e1000, vmxnet2 или vmxnet3. Сетевая карта последнего типа должна дать скорость до 8( или даже до 16, по данным некоторых тестов) гигабит\с на "виртуальной" стороне моей схемы, т.е. до виртуального коммутатора (вот тут см. подробности - vSphere network test - vmxnet3). Таким образом, если интенсивный трафик у нас между виртуальными машинами, и, важно!, эти виртуальные машины:
  • на одном сервере ESX(i)
  • на одном виртуальном коммутаторе
  • в одном VLAN
то пропускную способность порядка 8 гигабит (плюс-минус) дать несложно.
Нас может ограничить то, что не все ОС имеют драйвер для vmxnet3. Win2003\2008, RHEL, SUSE имеют.

От сетевых контроллеров e1000 и vmxnet2 производительности стоит ожидать меньшей, чем у vmxnet3, но больше номинального гигабита. Но и нагрузка на процессор от них должна быть побольше.

Важный пруфлинк - тесты от VMware - vmxnet 3.

Вариант 2
Еще можно попытаться использовать группировку контроллеров - выдать ВМ несколько виртуальных сетевых контроллеров, и объединить их в группу софтом в гостевой ОС. Обычно таким софтом выступает драйвер сетевого контроллера.

Очевидно, нужен драйвер, умеющий объединять контроллеры в группу. Из известных мне вариантов могу назвать только один - это драйвер от Intel для контроллера типа e1000, который эмулирует физический контроллер IntelPRO1000.Обратите внимание - есть драйвер от Microsoft, но вместо него можно поставить драйвер с intel.com.
(вроде бы, еще какие-то есть варианты организации nic teaming(bonding) для Linux\FreeBSD, но я в *nix не силен).

Плохая новость - для 64битных ОС Intel не сделала специального драйвера, мол - уже есть от Microsoft, его достаточно. Но группировки контроллеров в нем нет. Так что такой способ для Win-ВМ применим только для 32-битных ВМ.

Самая плохая новость: чтобы была эффективная балансировка нагрузки между vNIC в группировке на уровне драйвера - соответствующий алгоритм балансировки нагрузки должен поддерживаться коммутатором. В нашем случае - виртуальным коммутатором VMware. И он такой поддержкой не обладает.

Немного теории: для настройки nic teaming мы должны указать тип группировки (рис. 2).

Рис. 2. Варианты настройки группы интерфейсов

Тип группировки указывает:
  • сколько контроллеров группы будут активными;
  • по какому алгоритму будет балансировать трафик между адаптерами группы;
  • будет ли коммутатор принимать активное участие в работе группы. Коммутатор принимает и пересылает этот трафик, и сам выбирает - через какой порт(на какой интерфейс) этот трафик вернуть.
Вот насколько я понимаю текущую ситуацию -
  • варианты, требующие поддержки группировки портов от коммутатора нам не подходят - виртуальный коммутатор VMware не умеет 802.3ad на "внутренних" портах;
  • варианты "Fault Tolerance" нам не интересны - они не обеспечивают балансировки нагрузки;
  • остается только Adaptive Load Balancing.

Характеристики этого метода следующие:
  • драйвер анализирует TCP\IP, и по результатам анализа равномерно балансирует исходящий трафик между интерфейсами;
  • входящий трафик не балансируется - это работа коммутатора, виртуальный коммутатор VMware этого не умеет на "внутренних" портах;
  • кроме входящего трафика, только по одному интерфейсу группы ходит широковещательный и мультивещательный трафик.
Мне не удалось обнаружить упоминание алгоритма, по которому происходит балансировка нагрузки при группировке контроллеров типа Adaptive Load Balancing в драйвере Intel. Есть мнение, что по MAC адресу принимающей стороны. Если я не ошибся, то это означает что при передаче большого объема трафика одному клиенту - балансировка произведена не будет.

Вывод - данный метод повышения производительности сети для виртуальных машин практически не применим, в варианте от Intel. 

2. Производительность и балансировка нагрузки для "физической" стороны - vSwitch <-> pSwitch

Итак - если виртуальная машина хочет сеть с большой полосой пропускания до другой виртуальной машины на том же ESX(i), том же виртуальном коммутаторе и в том же VLAN - то предоставить ее ей можно за счет быстрого виртуального сетевого контроллера, в первую очередь vmxnet3.

А если эти условия не выполняются, т.е. трафик надо передавать через физический коммутатор? Это означает, что даже при наличии быстрого канала до виртуального коммутатора, бутылочным горлышком могут стать его гигабитные интерфейсы. Вернее, тот один, через который пойдет трафик при настройках по умолчанию.

Есть для ESX(i) такая настройка виртуального коммутатора, как Load Balancing, балансировка нагрузки (рис. 3)
Рис. 3. Варианты балансировки нагрузки для вКоммутатора


Там есть два больше всего интересующих нас варианта:
  1. Load based original port ID - трафик от одного порта на "виртуальной" стороне выходит через какой-то один порт "физической" стороны, т.е. через какой-то один физический сетевой контроллер.
  2. Load based IP hash - трафик от одного порта "виртуальной" стороны может выходить сразу через все порты "физической" стороны. Идентификатором условной "сессии", передаваемой через один pNIC, является не номер виртуального порта, как в первом случае, а хеш пары "IP-источник IP-получатель". Таким образом, трафик от одной ВМ к одному клиенту не займет больше одного pNIC, а вот трафик один-ко-многим - может занять сразу все.
Первый алгоритм хорош универсальностью - он работает всегда, и он используется по умолчанию. Однако весь трафик от одного виртуального контроллера будет выходить наружу только через один физический сетевой интерфейс.

От второго ожидают лучшего распределения трафика.

Мне хочется проговорить аккуратно и конкретно о второй настройке балансировки нагрузки для виртуального коммутатора, и связанных со всем этим вещах.

Итак - мы хотим большей производительности на "физической" стороне сети ESX(i) (рис.1).

Мы меняем настройку балансировки нагрузки на "Load based IP hash".
Если виртуальный коммутатор будет балансировать нагрузку по алгоритму «Load based IP Hash», то это означает, что виртуальный коммутатор трафик от любой одной ВМ может выпускать сразу по все аплинкам одновременно. MAC-адрес этой ВМ будет на нескольких портах физического коммутатора – без объединения этих портов в группу по стандарту 802.3ad( или EtherChannel) сеть работать не будет.

Так что чтобы сеть не перестала работать после включения "Load based IP hash" на виртуальном коммутаторе, к этому моменту на физическом коммутаторе должна быть настроена статичная группировка портов по стандарту 802.3ad. Вот об этом и хочу поговорить.

Обратите внимание - есть две аббревиатуры, часто (всегда?) употребляемых при обсуждении "Load based IP hash".
Первая - это выше упомянутый 802.3ad.
Вторая - LACP, Link Aggregation Control Protocol
Еще может быть «PAgP, Port Aggregation Protocol», но это примерно то же что и LACP, только LACP – отраслевой стандарт, а PAgP – закрытый стандарт от Cisco. Примерно та же разница между EtherChannel и 802.3ad – первое разработка Cisco, второе – отраслевой стандарт. Суть одна. В данном тексте и в данном контексте 802.3ad и EtherChannel означают одно и то же, как и LACP/PAgP.

Так вот – формально говоря, в контексте обсуждения балансировки нагрузки для виртуальных коммутаторов VMware термин LACP употреблять не следует. Вот почему:
  
1) 802.3ad(или EtherChannel в случае Cisco) - это стандарт группировки портов, он описывает как эта группировка должна быть устроена и чего от нее ожидать. Если коммутатор имеет группу портов, объединенную по этому стандарту, то он, в частности, нормально относится к тому, что один и тот же MAC-адрес может фигурировать в трафике сразу на всех портах этой группы.

2) LACP(PAgP) - это метод или протокол автоматической настройки(!) группировки портов. LACP - это часть 802.3ad (PAgP - EtherChannel).
Т.е. агрегация каналов может быть построена по 802.3ad без участия LACP (это называется static 802.3ad) - и такая группа портов на стороне коммутатора достаточна для работы виртуального коммутатора VMware с балансировкой нагрузки по методу "Load based IP hash".

Более того - только такая конфигурация и является рабочей(!) для ESX(i). Дело в том, что виртуальные коммутаторы VMware не поддерживают LACP(как протокол автоматической настройки), и не смогут сами договориться с физическими коммутаторами об настройке агрегации каналов.

В разных коммутаторах настройка группировки портов, может называться по разному. Например - Link Aggregation, Ether-Channel, Ethernet trunk, port channel, Multi-Link Trunking.

Итак, группа портов на физическом коммутаторе у нас есть. Но это еще не все.
Есть вот какой нюанс: при одной и той же группировке по стандарту 802.3ad на физических коммутаторах могут применяться разные алгоритмы непосредственно балансировки.
Вот примерный список:
dst-ip Dst IP Addr
dst-mac Dst Mac Addr
dst-mixed-ip-port Dst IP Addr and TCP/UDP Port
dst-port Dst TCP/UDP Port
src-dst-ip Src XOR Dst IP Addr
src-dst-mac Src XOR Dst Mac Addr
src-dst-mixed-ip-port Src XOR Dst IP Addr and TCP/UDP Port
src-dst-port Src XOR Dst TCP/UDP Port
src-ip Src IP Addr
src-mac Src Mac Addr
src-mixed-ip-port Src IP Addr and TCP/UDP Port
src-port Src TCP/UDP Port
И на стороне физического коммутатора обязательно должна быть балансировка нагрузки по IP (IP-Source-Destination) - потому что балансировку только лишь по такому алгоритму поддерживает коммутатор VMware, а алгоритм должен быть одинаков на "обоих концах" агрегированных каналов.

Как справочную информацию см. очень полезную, имхо, статью базы знаний - http://kb.vmware.com/kb/1004048.

И, кстати, если сеть устроена так как на рис.1 - т.е. виртуальный коммутатор подключен к нескольким физическим, то для использования "Load based IP hash" на вКоммутаторе эти физические должны уметь static 802.3ad в стеке.
Это обычно называется Multichassis Etherchannel или, для не Cisco, MLAG - Multichassis Link Aggregation.

Выводы
Если нужна гарантированная полоса пропускания, близкая к 10 Гбит\с, в том числе к единому клиенту, то стоит задуматься или о невиртуализации такой задачи, или о пробросе выделенной 10Гбит сетевой карте при помощи VMDirectPath.

Кроме того, и выше я об этом не упоминал, иногда нам сможет помочь  виртуальный коммутатор от Cisco, см. сравнение по функционалу - Virtual Networking Features of the VMware vNetwork Distributed Switch and Cisco Nexus 1000V Switches.

Если по соотношению "гарантированность\производительность\бюджет" на выделенный сервер\виртуальную циску с бюджетом все не очень хорошо, то для виртуальной машины на ESX(i) можно дать хорошую скорость к соседней виртуальной машине, и неплохую, с определенными оговорками, к внешним машинам.
Оговорки:
  • внешняя машина не одна, а это много клиентов с разными IP
    (иначе алгоритм "Load based IP hash" не позволит задействовать больше одного физического контроллера);
  • у нас есть достаточное количество физических сетевых контроллеров на виртуальном коммутаторе, и физические коммутаторы, к которым они подключены,  поддерживают нужный режим 802.3ad (и он, соответственно, на них настроен).
Вне номинаций

На руборде я как-то вычитал следующий вариант организации сети, комбинированный -


от продакшн ВМ vmxnet3 до ВМ2(на одном вКоммутаторе),
а в ВМ2 поднят софт, умеющий делать более эффективную группировку группировку - выводящий трафик на физику через несколько аплинков сервера ESX(i).

Если продакшн ВМ шлет большую кучу трафика единственному клиенту - такой же ВМ, к примеру, но на другом ESX(i), то через промежуточные ВМ можно попробовать поднять "более толстый" канал.

Правда, реализуем ли такой вариант, и если да то как,  - я сказать затрудняюсь, запомнилась сама идея.


За консультации и помощь в подготовке материала биг thx Денису Батурину и Евгению Ковальскому.
Комментарии приветствуются.

вторник, 29 марта 2011 г.

VCAP DCD

Сегодня сдал vcap dcd.


- пост с мобильного устройства, сорри за краткость и опечатки.

vSphere network test - vmxnet3, Jumbo Frames

Недавно было опубликовано тестирование производительности виртуального сетевого контроллера vmxnet3 -vSphere network test - vmxnet3.

Сегодня - дополнения после разбирательств с активацией Jumbo Frames:


 Благополучно разобравшись с JF (всё указывает на то, что это всё же какая-то бага в настройках  VMXNET3),   продолжил тестирование.

Итак, часть вторая, переработанная и дополненная…

Стенд всё тот же: и хост, и тестовые виртуальные машины – разница с первой частью только в увеличении MTU второго (кадры ethernet) и третьего (пакеты IP) уровней (включаются, соответственно, командой "netsh interface ipv4 set subinterface "<10Gb>" mtu=9000" и добавлением параметрара MTU  в ветку HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\<10Gb>\

- впрочем, коллеги в дискуссии по предыдущему отчету откопали-таки, что параметр реестра добавляется «сам», если команда «netsh … … …»  применяется с параметром «store=persistent».

Теперь собственно, сами тесты. Повторять я решил тесты №№3, 4, и 5 – как наиболее интересные. Напомню, что
№3 – это 1,2,4 и 8 тредов на одном vCPU;
№4 – 2,4 и 8 тредов на двух vCPU между одной парой «src-IP – dest-IP»;
№5 – 2,4 и 8 тредов на двух vCPU и между двумя парами IP.

№3:

= ntttcpr -m 1(2,4,8),0,192.168.1.58 -a 16 -l 256K -n 100000 -f s16.txt =

======================== 1, 2, 4, 8 === -a 16 ==================================
Throughput(Mbps)=9853.56 CPU=38.1% Cycles/Byte=1.48 Interrupts/Sec=22318
Throughput(Mbps)=12778.42 CPU=39.5% Cycles/Byte=1.19 Interrupts/Sec=15851
Throughput(Mbps)=15625.43 CPU=44.5% Cycles/Byte=1.09 Interrupts/Sec=12986
Throughput(Mbps)=16239.71 CPU=44.1% Cycles/Byte=1.04 Interrupts/Sec=9758
=========================================================================
 
№4:

= ntttcpr -m 1(2,4),0,192.168.1.58 1(2,4),1,192.168.1.58 -a 16 -l 256K -n 100000 -f s16m.txt =

======================== -, 2, 4, 8 === -a 16 === -m IP IP ======================
-
Throughput(Mbps)=11836.07 CPU=39.7% Cycles/Byte=1.29 Interrupts/Sec=16122
Throughput(Mbps)=15048.95 CPU=47.3% Cycles/Byte=1.21 Interrupts/Sec=17219
Throughput(Mbps)=16300.43 CPU=46.5% Cycles/Byte=1.10 Interrupts/Sec=11597
======================================================================

№5:

= ntttcpr -m 1(2,4),0,192.168.1.58 1(2,4),1,192.168.1.59 -a 16 -l 256K -n 100000 -f s16mm.txt =

======================== -, 2, 4, 8 === -a 16 === -m IP1 IP2 ====================
-
Throughput(Mbps)=12963.54 CPU=43.8% Cycles/Byte=1.30 Interrupts/Sec=19375
Throughput(Mbps)=15019.10 CPU=48.0% Cycles/Byte=1.23 Interrupts/Sec=17054
Throughput(Mbps)=16153.00 CPU=44.9% Cycles/Byte=1.07 Interrupts/Sec=10771
======================================================================

Что тут скажешь – неплохо выстрелило. Почти вдвое лучшие показатели по сравнению с тестами без использования JF.
Причём загрузка vCPU0 (на который по-прежнему приходится львиная доля работы) вполне ожидаемо снизилась – теперь даже на максимальных показателях производительности она болтается в районе 75-80 %, не выходя на прямую линию на 100%-й отметке (как это было на стандартных сетевых пакетах).

Ну и сохраняется примерно такая же «мультипроцессоронезависимость» - тесты с раскладкой тредов по ядрам не дают какого-либо заметного преимущества.


Для сравнения же -  традиционный сравнительный прогон на «младшем» хосте C2Q:

№3:

= ntttcpr -m 1(2,4,8),0,192.168.1.58 -a 16 -l 256K -n 100000 -f s16.txt =

======================== 1, 2, 4, 8 === -a 16 ===============================
Throughput(Mbps)=3174.32 CPU=29.4% Cycles/Byte=4.20 Interrupts/Sec=6512
Throughput(Mbps)=4363.88 CPU=42.1% Cycles/Byte=4.37 Interrupts/Sec=5607
Throughput(Mbps)=4791.96 CPU=45.2% Cycles/Byte=4.28 Interrupts/Sec=3288
Throughput(Mbps)=4379.16 CPU=49.0% Cycles/Byte=5.08 Interrupts/Sec=2494
======================================================================

Такое впечатление, что 8 тредов на vCPU этой конфигурации уже стало многовато…

№4:

= ntttcpr -m 1(2,4),0,192.168.1.58 1(2,4),1,192.168.1.58 -a 16 -l 256K -n 100000 -f s16m.txt =

======================== -, 2, 4, 8 === -a 16 === -m IP IP ======================
-
Throughput(Mbps)=4063.68 CPU=48.3% Cycles/Byte=5.39 Interrupts/Sec=5679
Throughput(Mbps)=4383.17 CPU=52.7% Cycles/Byte=5.45 Interrupts/Sec=3346
Throughput(Mbps)=4384.87 CPU=64.5% Cycles/Byte=6.66 Interrupts/Sec=2695
======================================================================

А тут как будто многоножка путается в своих лапах – попытки расфасовать несколько тредов по двум vCPU дают результаты не лучше предыдущего теста.

№5:

= ntttcpr -m 1(2,4),0,192.168.1.58 1(2,4),1,192.168.1.59 -a 16 -l 256K -n 100000 -f s16mm.txt =

======================== -, 2, 4, 8 === -a 16 === -m IP1 IP2 ====================
-
Throughput(Mbps)=3859.31 CPU=47.3% Cycles/Byte=5.56 Interrupts/Sec=5336
Throughput(Mbps)=4409.23 CPU=54.4% Cycles/Byte=5.60 Interrupts/Sec=3211
Throughput(Mbps)=4411.61 CPU=64.7% Cycles/Byte=6.66 Interrupts/Sec=2734
======================================================================

Ну и тут без особой доблести обошлось – практически как и с одной парой IP…

Справедливости ради нужно сказать, что большие пакеты и здесь показывают лучшую производительность, нежели без оных.


* * *



В довершение ко всему хотел бы выполнить одно обещание, данное коллеге Yuri - проверить данный тест на связке из двух Windows 7.

Все условия тестирования прежние (включая, пардон за каламбур, включенные JF и IP MTU=9000), за исключением ОС – вместо W2k8R2eeSP1 гонялись W7Profx64
(к сожалению по некоторым причинам пока без SP1).

Гонялся «базовый» тест - №3 (остальное среди ночи как-то заломало, если честно) – думаю, для оценки этого должно хватить:

№3:

= ntttcpr -m 1(2,4,8),0,192.168.1.58 -a 16 -l 256K -n 100000 -f s16.txt =

======================== 1, 2, 4, 8 === -a 16 ===============================
Throughput(Mbps)=8575.92 CPU=31.9% Cycles/Byte=1.43 Interrupts/Sec=16623
Throughput(Mbps)=10506.64 CPU=36.8% Cycles/Byte=1.34 Interrupts/Sec=14439
Throughput(Mbps)=13751.71 CPU=44.0% Cycles/Byte=1.23 Interrupts/Sec=13917
Throughput(Mbps)=16202.18 CPU=43.9% Cycles/Byte=1.04 Interrupts/Sec=8128
======================================================================

Как видим, результаты мало чем отличаются от таковых у w2k8r2. Почему у коллеги на его монстроОптеронах такие маленькие и смешные трафики – не знаю: «отсюда плохо видно»(с)моё.

С уважением,
Umlyaut.

пятница, 25 марта 2011 г.

vcap transcript

22 февраля я сдавал тест VMware Certified Advanced Professional: Datacenter Administrator.

10 марта пришли результаты.

А сегодня, 25 марта, эта сертификация была добавлена в мой транскрипт:

image

четверг, 24 марта 2011 г.

dcui through ssh

Офигенной штукой делится Михаил Коротько:
если подключиться к ESXi по ssh, и выполнить команду dcui,

то запуститься та же оболочка, что доступна на локальном мониторе:


Правда, черно-белая.

Выйти можно попробовать по Ctrl+C.


среда, 23 марта 2011 г.

ESX(i) pNIC speed and duplex default setting


С мест сообщают - вроде как ESX(i) начиная с версии 4.0 выставляет настройку скорости и дуплекса для физических сетевых контроллеров в значение "1000 Mb / full", а не в Auto negatiate.

В статье базы знаний VMware не рекомендуется разное значение этой настройки на коммутаторе и сетевом контроллере, вот картинка:

вторник, 22 марта 2011 г.

vSphere network test - vmxnet3

Со мной и с вами поделились очень интересным исследованием.
Из переписки:
 
 
По следам вот этой дискуссии на Вареруссишгруппенфоруме - Агрегирование каналов на стороне гостевой ос.
Топикстартер интересовался толстым-толстым каналом "для виртуальной машины". По ходу дела выяснилось, что Team-vNIC на vSwitch`e SLA не отрабатывает (как это заявлено для Team-pNIC, т.е. физ.аплинков).
Сошлись на том, что можно использовать VMXNET3 и всё будет ОК.
А я вдруг подумал - а насколько ОК? Что он может, этот самый VMXNET3? И решил погонять эту тему на стенде... Итак...

Стенд:

хост Сферы - 2 x Xeon 5620, 32GB RAM, ESXi 4.1U1 standalone
VM`ки - пара 2008R2 EE SP1 (2 vCPU, 6GB vRAM) с VMXNET3-интерфейсом на каждой (c IP MTU=1500); vNIC`и подключены к vSwitch1 c MTU=1500 без физ.аплинков.
clip_image002
Методика:
Тестирование проводилось с помощью известной утилиты NTttcp (v.30) в 64-битном варианте (NTttcp_x64.exe).
Каждый тест запускался пятикратно, в зачёт шёл лучший результат.
 

Часть I.

1.

Сначала провёл тестирование, запуская утилиту с такими же параметрами, что и в большинстве опубликованных ранее в инете тестов:
ntttcpr -m 1,0,192.168.1.58 -a 4 -l 256K -n 100000 -f s.txt
Единственное, что позволил себе изменить - это на порядок увеличить к-во тестового траффика ("-n 100000"),
бо при "-n 10000" ("те" тесты делались на гигабите) тест проскакивал слишком быстро, а мне хотелось, чтобы трафф "устоялся".
Получил вот что:
================================================================================
Date: 3-20-2010
Time: 20:40:0
Parameters: Number_Of_Threads=1 Number_Of_Buffers=100000 Length_Of_Buffers=262144 IOs=4 Realtime=33.750
Network Characteristics I: Pkts/Intr=30 Total_Bytes=26214.2 Avg_Frame_Size=1460
Network Characteristics II: Pkts_Sent=766253 Pkts_Received=17954923 Rexmits=0 Errors=0
Throughput(Mbps)=6213.73 CPU=42.4% Cycles/Byte=2.62 Interrupts/Sec=17506
================================================================================
В дальнейшем, чтобы не загромождать отчёт, буду приводить только последнюю строчку - с собственно скоростью линка.

2.

Далее прогнал этот же тест, только с несколькими тредами ("-m 2, -m 4, -m 8"). Получил следующие результаты:
= ntttcpr -m 1(2,4,8),0,192.168.1.58 -a 4 -l 256K -n 100000 -f s.txt
======================== 1, 2, 4, 8 ============================================
Throughput(Mbps)=6213.73 CPU=42.4% Cycles/Byte=2.62 Interrupts/Sec=17506
Throughput(Mbps)=7515.01 CPU=44.1% Cycles/Byte=2.25 Interrupts/Sec=12579
Throughput(Mbps)=7983.15 CPU=45.5% Cycles/Byte=2.19 Interrupts/Sec=8685
Throughput(Mbps)=8256.33 CPU=47.9% Cycles/Byte=2.23 Interrupts/Sec=7318
===========================================================================
Первой строкой я повторил результат для одного треда - для наглядности.
Здесь видно, как растёт пропускаемый траффик - в восьмитредовом варианте он уже доходит до 1ГБайта/сек.
Одновременно растёт и загрузка процессора (CPU 0 - по условию теста) - почти 50% это суммарная для обоих vCPU, а применительно к vCPU 0 она доходит почти до 100%.
Отмечу, что это на стороне приёмника (на передатчике загрузка процессоров (суммарная) болтается в районе 10-11% (в интервале от 9 до 12)) - что и понятно, т.к. приёмнику приходится выполнять все "offload"-операции VMXNET3 силами собственного процессора.

3.

Вчитавшись как следует в документацию к утилите NTttcp, обнаружил там интересную рекомендацию - для тестирования 10-гигабитных линков использовать бОльшее к-во "received buffers" - а именно 16.
Повторил тест №2 (точно так же с 1,2,4 и 8 тредами) с пар-ром "-а 16":
= ntttcpr -m 1(2,4,8),0,192.168.1.58 -a 16 -l 256K -n 100000 -f s16.txt =
======================== 1, 2, 4, 8 === -a 16 ===================================
Throughput(Mbps)=6805.93 CPU=46.0% Cycles/Byte=2.60 Interrupts/Sec=27097
Throughput(Mbps)=7633.75 CPU=45.6% Cycles/Byte=2.29 Interrupts/Sec=14933
Throughput(Mbps)=8251.03 CPU=46.5% Cycles/Byte=2.16 Interrupts/Sec=9107
Throughput(Mbps)=8615.52 CPU=48.3% Cycles/Byte=2.15 Interrupts/Sec=6966
==========================================================================
Что тут сказать - видимо, иногда RTFM не роскошь, а средство передвижения (в сторону лучшей производительности, ага!)...:)

4

Все предыдущие тесты делались на одном vCPU 0 (включая и мультитредовые) - параметр "-m x,0,IP".
Тот же TFM на утилиту, в частности, говорит о возможности разделения тредов по нескольким ядрам - для этого нужно параметр "-m" прописать по-другому:
ntttcpr -m 1(2,4),0,IP 1(2,4),1,IP ... ...
Тогда на каждое ядро должно приходиться по 2(4,8) тредов:
= ntttcpr -m 1(2,4),0,192.168.1.58 1(2,4),1,192.168.1.58 -a 16 -l 256K -n 100000 -f s16m.txt =
======================== -, 2, 4, 8 === -a 16 === -m IP IP ======================
-
Throughput(Mbps)=7593.38 CPU=49.0% Cycles/Byte=2.48 Interrupts/Sec=15911
Throughput(Mbps)=8341.46 CPU=51.3% Cycles/Byte=2.36 Interrupts/Sec=10253
Throughput(Mbps)=8775.02 CPU=53.5% Cycles/Byte=2.34 Interrupts/Sec=7234
=======================================================================
М-да, разница не сказать чтоб очень разительная - один-полтора процента (и не ясно - то ли скудный прирост, то ли погрешность эксперимента).
Да и по таскменеджеру машины-приёмника видно было, что львиная доля нагрузки по-прежнему падает на vCPU 0 - нагрузка на vCPU 1 подросла, но не сильно.
На машине передатчике суммарная загрузка стала 12-13%, но "перекос" в сторону vCPU 0 по-прежнему никуда не делся.

5.

Строго говоря, "мультипроцессорное" распределение тредов в TFM`е к утилите предполагает использование не одного, а нескольких IP:
ntttcpr -m 1(2,4),0,IP1 1(2,4),1,IP2 ... ...
Присвоил VMXNET3-интерфейсам машин вторые IP-адреса (57 приёмнику и 59 передатчику) и повторил тест №4:
= ntttcpr -m 1(2,4),0,192.168.1.58 1(2,4),1,192.168.1.59 -a 16 -l 256K -n 100000 -f s16mm.txt =
======================== -, 2, 4, 8 === -a 16 === -m IP1 IP2 ====================
-
Throughput(Mbps)=7695.32 CPU=50.0% Cycles/Byte=2.49 Interrupts/Sec=15678
Throughput(Mbps)=8365.41 CPU=51.2% Cycles/Byte=2.35 Interrupts/Sec=9841
Throughput(Mbps)=8830.10 CPU=53.7% Cycles/Byte=2.34 Interrupts/Sec=7546
======================================================================
В общем, примерно то на то и выходит - в том числе и с загрузкой на vCPU приёмника и передатчика.
То ли я чего-то не понимаю в реализации multiprocessor-multithreding у данной утилиты, то ли в моём случае почти без разницы раскладка тредов по процессорам.
Собственно, первую часть тестирования на этом можно было бы и завершить, но я решил сделать сравнение – прогнать те же тесты на тех же виртуалках, но на другом железе: entry-level-хосте Сферы на C2Q Q9550 (4x2.83GHz) / 16GB RAM.
Остальные условия те же (включая отдельный vSwitch NETTEST без физ.аплинков).
Вначале повторил тест №3:
= ntttcpr -m 1(2,4,8),0,192.168.1.58 -a 16 -l 256K -n 100000 -f s16.txt =
======================== 1, 2, 4, 8 === -a 16 ===================================
Throughput(Mbps)=3388.43 CPU=43.7% Cycles/Byte=5.85 Interrupts/Sec=9172
Throughput(Mbps)=3717.48 CPU=47.5% Cycles/Byte=5.79 Interrupts/Sec=6746
Throughput(Mbps)=3702.41 CPU=49.0% Cycles/Byte=5.99 Interrupts/Sec=3960
Throughput(Mbps)=3566.10 CPU=49.7% Cycles/Byte=6.31 Interrupts/Sec=4913
==========================================================================
Сразу видно, насколько показатели скромнее предыдущих – десктопное железо даже при номинально большей частоте CPU проигрывает серверному.
Причём на четырёх тредах мы упёрлись (вышли на плато), а при восьми – даже слегка потеряли (на таск-менеджере у vCPU 0 в этом месте график загрузки практически слился с линией 100% - скрин я делать поленился, но и так ясно должно быть).
Похоже, много тредов весьма хорошо прогружают десктопный проц.
Для сравнения прогнал 4 и 8 тредов по-другому – с распределением по IP и vCPU (как в тесте №5):
= ntttcpr -m 2(4),0,192.168.1.58 2(4),1,192.168.1.59 -a 16 -l 256K -n 100000 -f s16mm.txt =
======================== -, -, 4, 8 === -a 16 === -m IP1 IP2 ====================
-
-
Throughput(Mbps)=3567.30 CPU=61.1% Cycles/Byte=7.77 Interrupts/Sec=4078
Throughput(Mbps)=3693.90 CPU=66.3% Cycles/Byte=8.13 Interrupts/Sec=3435
=====================================================================
Ясности это, правда, не прибавило, хотя этот тест я прогнал дважды (по пять итераций для каждого к-ва тредов, согласно условию). Решил для себя, что много тредов – это не для такого хоста… J
И промежуточный вывод по итогам первой части – всё-таки откровенно пренебрегать мощностью/производительностью аппаратной части не стОит: как мы видим, потребность в той же «процессорной дури» может быть весьма высокой.
Это я к тому, что на форуме и в блоге периодически встречаю высказывания о желании устроить (пусть даже и тестовый, но не только) хост Сферы на, стыдно сказать, «атомных» системах…

Часть II.

UPD. Новая часть 2 - vSphere network test - vmxnet3, Jumbo Frames

Во второй части тестирования я решил проверить влияние Jumbo Frame`ов на производительность сети – а конкретно в том же акцепте, что и в первой части, т.е. между двумя виртуалками на 10Gb-ном линке (между двумя VMXNET3).
Понятно, что для проверки нужно задать режим JF=ON (9000) на vNIC`ах VMXNET3 (в свойствах драйвера сетевого подключения АКА карты) и включить JF на тестовом vSwitch1 (NETTEST) командой esxcfg-vswitch –m 9000 vSwitch1.
(После этого можно ещё сравнить производительность при стандартном и увеличеннном IP MTU в виртуалках, но вначале, всё же, хотелось разобраться с JF).
ОК, JF включен и на vNIC`ах, и на vSwitch1, делаю проверку (как указано в Книге) с передатчика (1.58) на приёмник (1.56):
ping –f –l 8972 192.168.1.56
и получаю облом:
Packet needs to be fragmented but DF set
Пробую обратно - с 1.56 на 1.58 – то же самое.
Пробую без флага f (без запрета фрагментации) – пинги проходят.
Т.е. большие (8972) ICMP-пакеты без фрагментации идти между виртуалками не хотят.
Переключаю обе тестовые виртуалки на vSwitch0 (VM Network) с аплинком и включаю JF на этом свитче. Пробую
pingfl 8972 192.168.1.56(58)
с физ.машины из этой же подсети (JF на pNIC`е этой физ.машины включен (9014).
Нефрагментированные большие пинги проходят от физ.машины до каждой из тестовых виртуалок.
Пробую пингануть обратно – из тестовой виртуалки физ.машину:
ping –f –l 8972 192.168.1.13
и опять получаю
Packet needs to be fragmented but DF set
Ещё раз делаю пинг с виртуалки на «физику», но уже без запрета фрагментации – всё прекрасно проходит.
По всему выходит так, что JF на Вирт.коммутаторе работают как-то криво – vSwitch пропускает без фрагментации пакеты, входящие в vSwitch из pNIC`ов и не пропускают входящие из vNIC`ов.
Беглая проверка показала, что на хосте ESXi 4.0U1 JF ведут себя абсолютно так же.
Лично у меня этому объяснения пока нет – констатирую голый факт.
Если кто-то сможет объяснить это явление – вэлкам! :)
* * *
Собственно после облома с JF тестирование было прекращено – ну какой интерес лупить большими фреймами, если они всё-равно будут фрагментированы.
Вот как-то так…
С уважением,
Umlyaut.

воскресенье, 20 марта 2011 г.

cloud, vcloud, vcloud director, it-grad


Облака, облачные вычисления, IaaS\SaaS\PaaS - многие источники утверждают, что за этими непонятными словами будущее.

Но что это такое?

Сам я довольно долго не понимал, потом разобрался - в теории - но ведь всегда хочется потрогать руками, чтобы составить окончательное впечатление.

Так что когда мне такая возможность предоставилась - я за нее ухватился.

А предложили мне попользоваться услугами компании, которая как раз специализируется на "Облаках", притом специализируется в том числе в облачных решениях VMware. Так вот - попользоваться, и описать впечатления. Забегая вперед - мне понравилось :-)

Так что, коллеги, вот тут - Как приручить облака: примеры практического использования. Начало - можно прочесть прикладную информацию про меняющие нашу отрасль облака. Это первый пост в серии (публиковаться они будут еще и на хабре).

Мне кажется уместным сделать оговорку -  это, разумеется, реклама - написано же про конкретную компанию и что там все здорово. Но я постарался сделать эту информацию полезной и обоснованной.