Welcome to Azure. Дела железячные…

Живой или мертвый, ты пойдешь со мной!

Робокоп

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

Сегодня же давайте поговорим, о железячной части Ажура.

Мы несколько раз говорили про виртуальные машины, и то что фабричный контроллер реплицирует себя на каждую машину. Все виртулки крутятся на Windows Server 2008 Enterprise Edition x64. Всей виртуализацией занимается Hyper-V. Собственно он и занимается тем что постоянно подымает и опускает виртуалки.Так как использование электроенергии очень важный момент, гипервизор смотрит сколько ядер на физическом компьютере используется в данный момент, и пытается заставить определенное количество ядер на полную мощность, другие же в это время кладутся спать:) чтобы использовать как можно меньше электроенергии.

Как происходит подключение новой ноды?

Когда новый сервер добавлен в Ажур — это просто голый сервак, в котором нету НИ-ЧЕ-ГО, только хард. Когда нода добавленна, на него устанавливается Windows PE — это такой себе предустановочный Windows( Micorosft мечтал что эта версия ОС заменит легендарный DOS), единственная цель которой была подготовка компьютера к установки полной операционной системы.

После этого ОС коннектиться к фабричному контроллеру, и начинает установку образ Windows 2008 Core на сервер. После этого образ разварачивается, и у нас получается компьютер с установленным Windows 2008.После этого, фабричные контроллер перегружает виртуалку, и на ней размещаются необходимые виртуалки.

Процессы которые происходят внутри Ажура намного сложнее, и я ,честно признаться, не особо в них разбираюсь. Мне кажется что построение такой инфраструктуры — это шедевр админского искусства, и мне кажется необходим не один гениальный админ для того чтобы разобрать по полочкам из чего состоит Ажур:)

Так как любая виртуальная машина в Ажуре все же является модифицированной версией Windows Server 2008, мы можем собрать данные с информацией об ОС на которой крутится та или иная роль. Давайте напишем небольшуюю программку, которая выведет нам необходимую информацию!

Как уже прежде рассказывалось — создайте проект Azure с одной веб ролью ASP.NET. Откройте файл Default.aspx и в кодбихайнде впишите следующее:

 

    /// <summary>
    ///
    /// </summary>
    public partial class _Default : System.Web.UI.Page
    {
        /// <summary>
        /// Handles the Load event of the Page control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
        protected void Page_Load(object sender, EventArgs e)
        {
            var computer = new Microsoft.VisualBasic.Devices.Computer();

            Response.Write(string.Format("Computer Name:{0}</br>",computer.Name));
            Response.Write(string.Format("OS Name:{0}</br>", computer.Info.OSFullName));
            Response.Write(string.Format("OS Version:{0}</br>", computer.Info.OSVersion));
            Response.Write(string.Format("OS Platform:{0}</br>", computer.Info.OSPlatform));
            Response.Write(string.Format("Processor Count:{0}</br>", System.Environment.ProcessorCount.ToString()));
            Response.Write(string.Format("CLR Version:{0}</br>", System.Environment.Version.ToString()));
            Response.Write(string.Format("Current Directory:{0}</br>", System.Environment.Version.ToString()));
            Response.Write(string.Format("Time since last restart:{0}</br>",  GetTimeSinceLastRestart()));
            Response.Write(string.Format("Domain Name:{0}</br>", System.Environment.UserDomainName));
            Response.Write(string.Format("User Name:{0}</br>", System.Environment.UserName));
            Response.Write(string.Format("CPU Name:{0}</br>", GetCPUName()));
            Response.Write(string.Format("Architecture:{0}</br>", GetArchitecture()));
        }

        /// <summary>
        /// Gets the current directory.
        /// </summary>
        /// <returns></returns>
        private string GetCurrentDirectory()
        {
            try
            {
                return System.Environment.CurrentDirectory;
            }
            catch
            {
                return "unavailable";
            }
        }

        /// <summary>
        /// Gets the time since last restart.
        /// </summary>
        /// <returns></returns>
        private string GetTimeSinceLastRestart()
        {
            try
            {
                TimeSpan time = new TimeSpan(0, 0, 0, 0,
                    System.Environment.TickCount);
                return time.ToString();
            }
            catch
            {
                return "unavailable";
            }
        }

        /// <summary>
        /// Gets the name of the CPU.
        /// </summary>
        /// <returns></returns>
        private string GetCPUName()
        {
            try
            {
                using (ManagementObject Mo = new
                    ManagementObject("Win32_Processor.DeviceID='CPU0'"))
                {
                    return (string)(Mo["Name"]);
                }
            }
            catch
            {
                return "unavailable";
            }
        }

        /// <summary>
        /// Gets the architecture.
        /// </summary>
        /// <returns></returns>
        private string GetArchitecture()
        {
            try
            {
                using (ManagementObject Mo = new
                   ManagementObject("Win32_Processor.DeviceID='CPU0'"))
                {
                    ushort result = (ushort)(Mo["Architecture"]);
                    switch (result)
                    {
                        case 0:
                            return "x86";
                        case 9:
                            return "x64";
                        default:
                            return "other";
                    }
                }
            }
            catch
            {
                return "unavailable";
            }
        }
    }

В результате Вы должны видеть что-то вроде этого:
Computer Name: XXX
OS Name: XXX
OS Version:6.1.7600.0
OS Platform:Win32NT
Processor Count:4
CLR Version:4.0.30319.1
Current Directory:4.0.30319.1
Time since last restart:3.05:28:43.1420000
Domain Name:WORKGROUP
User Name:XXX
CPU Name:Intel(R) Core(TM) i5 CPU 661 @ 3.33GHz
Architecture:x64

Сосбтвенно, тот же подход можна использовать для того чтобы получить список всех процессов которые в данные момент крутяться на машине с Вашей веб ролью. Давайте изменим код нашей страницы:

    public partial class _Default : System.Web.UI.Page
    {
        /// <summary>
        /// Handles the Load event of the Page control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
        protected void Page_Load(object sender, EventArgs e)
        {
                var processes = Process.GetProcesses();

                foreach (var process in processes)
                {
                    Response.Write(string.Format("ID:{0}, Name:{1}</br>",process.Id, process.ProcessName));
                }
        }
    }

В результате получим, нечто вроде:
ID:4332, Name:w3wp
ID:588, Name:services
ID:6108, Name:OSE
ID:376, Name:conhost
ID:388, Name:svchost
ID:3144, Name:svchost
ID:2280, Name:cvpnd
ID:5700, Name:conhost
ID:1956, Name:taskhost
ID:5904, Name:DiagnosticsAgent
ID:4316, Name:AdobeARM
ID:5520, Name:chrome
ID:768, Name:svchost
ID:1552, Name:explorer
ID:368, Name:smss
ID:2140, Name:AsSysCtrlService
ID:4304, Name:conhost
ID:1688, Name:svchost
ID:3512, Name:vmnetdhcp
ID:7648, Name:chrome
ID:4968, Name:conhost

Если вы запускаете аппликацию локально — Вы увидите метрики именно Вашего компьютера — но если Вы загрузите эту аппликацию на Ажур, увидите значения для машини на которой раскрутилась Ваша роль.

Вот где-то так вся эта радость и работает:)

Информация в основном взята с книги «Azure in Action.».

 

Полезные ссылки:

http://ru.wikipedia.org/wiki/Microsoft_Hyper-V — что такое Hyper-V и с чем его едят.

http://ru.wikipedia.org/wiki/Windows_Preinstallation_Environment — очень удивился когда узнал про существование данной ОС, потому советую почитать. Достаточно познавательно.

http://itknowledgeexchange.techtarget.com/cloud-computing/how-azure-actually-works-courtesy-of-mark-russinovich/ — как работает Windows Azure by Mark Russinovich.

http://ru.wikipedia.org/wiki/VHD_(%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82_%D1%84%D0%B0%D0%B9%D0%BB%D0%B0) — именно в этом формате лежат все виртуалки на Azure

http://msdn.microsoft.com/en-us/library/ee924680.aspx — описание всех релизов Azure OS. Будет интересным для прочтения разного рода системным администраторам, ибо также включает в себя описание заплаток которые предустановлены на систему.

http://msdn.microsoft.com/en-us/library/gg433107.aspx — достаточно интересная стать о фичи в CTP которой даже небыло:) Надеюсь что у меня дойдут руки и до нее, чтобы напсать че за зверь и с чем его едят. Пока данная фича находится в бете.

http://msdn.microsoft.com/en-us/library/gg433048.aspx — сбор диагностики в Windows Azure.