2 июня 2011 в 18:20

Гигагерцы задешево — Win 2008R2 Core на Amazon из песочницы

Занимаясь стартапами я, наконец-то, дошел до той точки, когда нужно быть готовым отмасштабировать приложение на N серверов для 1M просмотров в день и я начал думать, как же это сделать наиболее эффективно с использованием Amazon Ec2.

Примерный план известен всем — сервер помощнее для базы данных и набор небольших серверов, которые запускаются/останавливаются по мере необходимости в зависимости от нагрузки.

Из недорогих серверов у амазона особого выбора нет. Изначально я планировал использовать для этого Small Instance — именно этот вариант рекомендует amazon по умолчанию. В нем 1.7 GB RAM, что довольно комфортно для windows, но только 1 ECU. На практике в памяти можно разместить 5-8 рабочих процессов, однако, толком работать одновременно они не способны — ядро одно и очень слабое: 1 ECU это всего-то 1 Ghz одного ядра Xeon образца 2007 года. По моим оценкам, примерный эквивалент — процессор Celeron на частоте 1.5 Ghz. Стоит такой сервер $0.12 в час ~ $86 в месяц, десяток — $860 в месяц… Было очевидно, что эта конфигурация сервера не совсем отвечает моим задачам.

Поэтому я решил попробовать Micro instance — всего-навсего 613 MB памяти, но зато:
  • производительность достигает 2 ECU
  • он в 4 раза дешевле
  • можно использовать 64 битную платформу Windows Server 2008 R2 Core


Наверное, многих заинтересует — почему я выбрал x64 систему для 613 MB памяти? Аргументы следующие:
  • 2008 R2 — новая система, по сравнению с 2008. 2008 построена на базе Vista, R2 — на базе windows 7.
  • Улучшена работа IIS
  • Улучшена виртуализация на уровне OS, которой мы и будем пользоваться


Server Core — это урезанная установка Windows, без многих GUI элементов — нет Internet explorer, обычного Explorer и даже taskbar!

Разберем шаги настройки такого сервера:

1. Инсталяция Windows

В списке систем, предлагаемых по умолчанию, нет версии Core. Однако, ее можно найти поиском по ключевому слову «2008R2»:
image

Запустив Micro instance мы можем подключиться к нему по RDC, где вместо привычного десктопа нас встречает голая командная строка:

image

Набрав taskmanager видим, что у нас 300 MB памяти занято, общий объем виртуальной памяти примерно 1,4 GB. У инстанса есть единственный диск размером 16 GB, из которых после инсталяции свободно чуть больше 11 GB, чего вполне достаточно для наших задач.

2. Подключение к другим компьютерам cloud

Firewall в Ec2 (называется Security Groups), как обычно, разрешает заданным IP открывать указанные порты. Чтобы не добавлять IP каждого запущенного сервера вручную, можно использовать следующий прием — указать вместо IP имя security group (которое показано на вкладке details, и выглядит примерно «sg-c45ac45a») и разрешить доступ по всем портам.
При создании нового инстанса указываем эту же Security group и новый инстанс автоматически имеет доступ к любым другим ресурсам вашего облака. Мой security groups выглядит следующим образом (обратите внимание именно на первую и последнюю строчку добавленную для ms sql):
image

Соответственно, мы успешно выполнить следующую команду и подключиться по внутреннему IP к основному серверу:

net use z: \\10.20.30.40\C$ /user:Administrator

3. Установка IIS, .NET

Полный набор всевозможных команд детально описан MS на этой странице — http://technet.microsoft.com/en-us/library/ee441260(WS.10).aspx, однако, чтобы не набирать все это каждый раз я сделал «regiis.bat» на основном сервере. Запустив его на blade, выполняем все необходимые инсталяции (я выбросил FTP server, можно убрать еще несколько функций — экспериментируйте):

start /w pkgmgr /iu:IIS-WebServerRole;IIS-WebServer;IIS-CommonHttpFeatures;IIS-StaticContent;IIS-DefaultDocument;IIS-DirectoryBrowsing;IIS-HttpErrors;IIS-HttpRedirect;IIS-ApplicationDevelopment;IIS-ISAPIExtensions;IIS-ISAPIFilter;IIS-ServerSideIncludes;IIS-HealthAndDiagnostics;IIS-HttpLogging;IIS-LoggingLibraries;IIS-RequestMonitor;IIS-HttpTracing;IIS-CustomLogging;IIS-ODBCLogging;IIS-Security;IIS-BasicAuthentication;IIS-WindowsAuthentication;IIS-DigestAuthentication;IIS-ClientCertificateMappingAuthentication;IIS-IISCertificateMappingAuthentication;IIS-URLAuthorization;IIS-RequestFiltering;IIS-IPSecurity;IIS-Performance;IIS-HttpCompressionStatic;IIS-HttpCompressionDynamic;IIS-WebServerManagementTools;IIS-ManagementScriptingTools;IIS-IIS6ManagementCompatibility;IIS-Metabase;IIS-WMICompatibility;IIS-LegacyScripts;WAS-WindowsActivationService;WAS-ProcessModel

Dism /online /enable-feature /featurename:IIS-ManagementService

Dism /online /enable-feature /featurename:WAS-NetFxEnvironment /featurename:IIS-ISAPIExtensions /featurename:IIS-ISAPIFilter /featurename:IIS-NetFxExtensibility /featurename:IIS-ASPNET


Чтобы разрешить удаленное подключение для управления IIS, осталось всего ничего — меняем ключ в реестре (запускаем regedit.exe):
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WebManagement\Server — свойство EnableRemoteManagement ставим в 1.

и запускаем сервис удаленного управления на blade инстансе:
net start wmsvc

Проверяем подключение к IIS с основного сервера — Connect to server..., указываем внутренний IP, Логин/Пароль и сохраняем подключение:


Осталось скопировать код приложения, для чего я создал на основном сервер copylocal.bat, который копирует последние исходники приложения в предопределённую папку с использоваением xcopy.
Опять же, этот .bat нужно выполнить на blade сервере.

С основного сервера настраиваем iis — проверяем использование .net в application pool, количество процессов — я ставил 3, так как средний размер W3WP.exe у меня около 100 MB, и после этого успешно открываем наш сервер в барузере по http:// и его public dns.

Сервер готов к работе и подключению в loadbalancer.

4. Масштабирование

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

Распределение работы между серверами можно поручить loadbalancer от amazon, 1й load balancer в течении 1 года предлагается бесплатно.

Обновление версии сервера выглядит так:
  • поднимаем новый blade с старым кодом в ручном режиме
  • обновляем код (у нас есть батник)
  • проверяем работу по http
  • делаем AMI новой версии
  • размножаем нужное количество серверов
  • меняем используемые сервера в load balancing
  • старые сервера выключаем — команда Terminate

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

5. Тестирование скорости

Я до последнего боялся, что будут неоправданные тормоза на таком маленьком количестве памяти, поэтому нужно было обязательно проверить систему под хоть какой-то нагрузкой.
Для тестирования я использовал loadimpact.com и специальный метод контроллера, который делает redirect на случайную страницу. Результат получился вполне достойный — вот отчет, особенно для стоимости этого сервера в $21/месяц.
Большое время ответа на 10 и 20 клиентах объясняется инициализаицей приложения, свопом ненужных частей системы, так как тест был запущен сразу же после конфигрурирования.

Финансовый результат

Очевидно, что в мире Windows тяжело себе представить жизнь без мышки, контекстных меню и GUI для настройки чего угодно. Однако, это оказалось не так сложно. Самой большой сложностью было подобрать настройки firewall (как амазоновского так и встроенного в windows) и придумать простую схему выкладки, не требующую массы усилий. Я думаю, что с данной инструкцией реально настроить такой сервер за час, а это даст вам существенную ежемесячную экономию.
Общее мое впечатление — эффективность данной конфигурации в пересчете на 1 доллар примерно в 3 раза выше по сравнению с использованием массива small instance. То есть примерно 6 small instance можно смело заменить на 8 micro instance, что в денежном выражении обозначает $173 доллара в месяц вместо $516 — более 4000 долларов в год.

Полезная информация
1. Getting started для Core — http://technet.microsoft.com/en-us/library/ee441260(WS.10).aspx.
2. Если закрыли консоль, можно нажать Ctrl + Alt + End, что аналогично Ctrl + Alt + Del на вашем компьютере и запустить Taskmanager. Команда «выполнить» опять позволит запустить cmd.
3. Для завершения сеанса используем команду logoff.
4. Типы инстансов амазон — http://aws.amazon.com/ec2/instance-types/.
5. Цены на инстансы амазон (зависят от датацентра, в котором вы хотите их разместить) — http://aws.amazon.com/ec2/pricing/.

Update (26.07.2011): Stress testing такого сервера — http://loadimpact.com/result/ec2-50-19-133-136.compute-1.amazonaws.com/en/random-9ec1ada5c887d3d3c8607ecb740547a2
Сергей Осипчук @osypchuk
карма
31,0
рейтинг 0,0
Похожие публикации

Комментарии (29)

  • +2
    MicroInstance имеет сильно выраженный пониженный приоритет, что проявляется как временной подвисание виртуальной машины при большой нагрузке. Они это объясняют, что полностью всеми доступными ECU вы можете воспользоваться только временно. Т.е. в качестве временного ускорителя (они называют это burst).

    Пруф:

    «Micro Instance 613 MB of memory, up to 2 ECUs (for short periodic bursts), EBS storage only, 32-bit or 64-bit platform»

    Пруф от пользователя
    • 0
      Действительно, я часто наблюдал такой эффект на 32х битной Windows Server 2008 на Микро инстансе. Однако, там был и MS SQL и ASP.NET приложение.

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

      Ну а если таки подвиснет, load balancer его уже через 12 секунд объявит unhealthy и исключит.
      • 0
        А что станет с пользовательским запросом во время зависания?
        • +1
          Мы оба отлично знаем, что будет timeout.

          Micro проработал в load balancing всю ночь, за это время зарегистрировано 17 страниц, которые рендерились дольше 7 секунд (в первую очередь по причине DB). Пока он не засыпал
          • 0
            Ну мы также оба знаем, что существуют техники это побороть, если пользовательский запрос настолько важен для системы.
            • 0
              Господа,
              а что делать если
              1) на кластере планируется обрабатывать транзакции и ни в коем случае нельзя терять транзакцию?

              2) если транзакция не прошла за секунду (1000мс), то обработать её по бизнес-логике ещё хуже, чем потерять.

              Какие техники существуют? Подскажите? Дайте ссылки, пож.
              • 0
                Наверное блин взять распределенный кластер по разным ДЦ?
                Вы напоминаете товарища, который софт для слежения за сердечниками поставил на low availability amazon instance и когда EBS упал (или что-то там) вся эта система легла…
                Нельзя HA ставить в одно место и тем более в клауды (клауды — технология не обкатанная, лет 10 еще пройдет прежде чем все нюансы будут ясны и баги исправлены).
                • 0
                  Ну, а что делать то? Что делать?
                  Всё дело в цене на билет.

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

                  Ну, и по надёжности: покупка выделенного сервера по-моему хуже, чем два кластера в разных зонах.
                  (Не говоря уже, что он вообще не масштабируется.)
              • 0
                Я не уверен, что я точно правильно понял вашу задачу.
                Я бы сделал так:
                Сервер, который получает запрос и ставит его в очередь, указывая время валидности. У амазона есть aws.amazon.com/sqs/ — Simple Queue Service, использую и полностью им счастлив.
                Сервер(а) обрабатывающие запросы из очереди, которые проверяют, не истек ли срок годности запроса.

                • 0
                  Спасибо
                  Кажись вот это утверждение решает проблему:
                  When a message is received, it becomes “locked” while being processed. This keeps other computers from processing the message simultaneously. If the message processing fails, the lock will expire and the message will be available again.

                  Но хотелось бы уточнить.
                  Как из вашего опыта, возможно ли так сделать?
                  Что сообщение приходит в очередь, и лимит блокировки 500мс, если его не обработал один микро, то другой берёт с лимитом 500мс, если второй не обработал, то сообщение убивается.

                  (Через 1000мс придёт новое сообщение с обновлённой ситуацией)

                  • 0
                    Автоматически оно убиваться не будет.
                    Но ничего не стоит дописать время валидности в сообщение и в начале обработки каждого из них проверять, валидно ли данное сообщение.
                    Если валидно, обрабатываем и убиваем, иначе — просто убиваем.
    • 0
      Проект на анонсирован на хаббре habrahabr.ru/blogs/development/122168/ и успешно справляется с одноименным эффектом. «Потерь» среди микро инстансов не наблюдаю.
  • 0
    > То есть примерно 6 small instance можно смело заменить на 8 micro instance

    А можно чуть подробнее как было получено такое соотношение?
    • 0
      По логгируемому моим кодом (от begin request до end request) времени выполнения страницы, micro тратит столько же времени, сколько и small.
      Я накинул 33% чтобы снизить вероятность возможного подвисания, упомянутого miolini.
      • 0
        Если Вы загрузите CPU запросами на 100%, то соотношение будет гораздо хуже, нежели 6:8. На 2-3 секунды бурста у них приходится 20-30 секунд тормозов. Когда требуется проц на постоянную нагрузку, 1 small инстанс сопоставим с 3-4 micro.
        Говорю исходя из полугодового опыта использования связки ec2-micro/ec2-small и linux/tomcat.

        И… это… 1-3 секунды на запрос это просто жесткий интерпрайз у вас?
        • 0
          Во-первых, в этом и прелесть cloud, что если эта схема не сработает, то можно все быстро поменять ))

          Откуда взялись 1-3 секунды на запрос? Если с графика Loadimpact, то они в Cтокгольме а сервер в Виржинии, так что тут попадает дополнительно пара пингов.

          Мы целимся на рендеринг 80% (те типы запросов, что чаще всего запрашиваются) страниц до 0.2 s, но да, есть и более сложные запросы, надо которыми еще предстоит работать. Если сложный поиск будет выполняться за 3 секунды то это будет приемлимо.
        • 0
          Скажите, пож, а у small и более крупных бывают подвисания?
          • 0
            нет, начиная с small всегда есть какой-то гарантированный вычислительный ресурс, который вам выделяется, и сервер хоть чуть чуть да продвинется в решении поставленной задачи.

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

            ПО более толстым инстанса у меня пока серьезного опыта нет.
  • 0
    Еще бы ссылку на сервис что там крутится, чтобы пощупать руками. А так даже профиль чист от ссылок. М?
    • 0
      Пока проект не открыт официально и посещаемость там небольшая «орда» микро инстансов пока не используется. Это была подготовка к релизу, который планируется в ближайшую неделю-две.

      Если Вы используете Amazon могу поделиться AMI — вы скопируете туда собственное приложение и проверите, как оно живет.

      Спасибо за напоминание о незаполненном профиле — я так обрадовался инвайту что забыл об этом… чуть заполнил, о себе напишу в течении нескольких дней

    • 0
      Если все еще интересно, то проект анонсирован на Хаббре — habrahabr.ru/blogs/development/122168/

      SQL server — High CPU medium, и N micro instances
  • +2
    Для Micro оптимальным решением будет только *nix платформа. Изначально использовал Win, но тормоза были жуткие… перешел на *nix все стало летать :)
    • +1
      Наверно, вы таки использовали Windows Server 2008 обычную, не R2? У меня тоже были жуткие тормоза и я был полностью разочарован в микро инстансах.

      База данных стояла на этом же сервере?

      Если будут дохнуть — я сделаю обновление этому посту, чтобы не вводит никого в заблуждение

      PS: Вообще я очень рад что столько людей с хаббра использует Amazon Web Services
      • 0
        Сейчас посмотрел, да был просто 2008 (Windows-Server2008-x86_64-BaseMultiLang-v103 (ami-c9517bbd)) Да, база (MySQL5) была на этом же сервере.
        • +2
          ну вот, три отличия сделали свое дело (что больше, что меньше сложно сказать) — R2, внешняя база, и Core Mode.

          Забегая наперед, боюсь в Core режиме не получится поставить Php, так что для php/mysql наверняка *nix действительно лучше, да и дешевле
  • 0
    удовлетворяет ли вас скорость EBS? линейная скорость, кол-во операций IO в секунду? мы заметили, что со временем становится все хуже и все меньше у нас желания использовать их сетевой сторадж для кластеров.
    • 0
      Для хранению пользовательских файлов мы используем S3.

      На EBS хранится только OS, Файлы приложения (~40MB), и MS SQL Server. Пока это не проблема.
      Все что можно — CSS, картинки, пользовательские файлы — отдается через cloudfront; сервер отдает только сгенерированный html и JS (который на самом деле один и тот же и хранится в кэше).

      Скорость копирования примерно 2MB/sec, 1.5MB/s когда мелкие файлы

      Для теста, скопировал по сети с EBS одного инстанса на другой папку (8000 файлов, 350 мегабайт) — заняло ~2,5 минуты.
  • +4
    А вы Azure для этих задач не пробовали, все таки как то будет нативнее для Win Server'a + плюс там тоже есть микро инстансы
    • +1
      Жутко любопытно (не знаю, за что вам поставили минус за коммент), но пока не пробовал.

      Меня настораживает у Azure платить за каждую базу данных, причем довольно ощутимую сумму — $49.95 per database up to 5GB per month.

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