Как повысить производительность Vagrant

Разработка: Блог им. serg: Как повысить производительность Vagrant
Vagrant – это бесценный инструмент для создания стандартизированных виртуализированных сред. Вместо требования от пользователя установить Postgres, Redis, Elasticsearch и т.д. для запуска и разработки приложения, — Вы просто говорите им сделать три действия (возможно первые два уже не нужны):

  • Скачать и установить VirtualBox
  • Скачать и установить Vagrant
  • Из папки проекта запустить команду:
vagrant up && vagrant ssh

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

Используйте NFS

По умолчанию, VirtualBox обеспечивает совместное использование между хостом и гостевыми операционных систем с помощью собственных механизмов обмена. Несмотря на то что этот метод работает на всех типах хостов, — это невероятно медленно, по крайней мере, в Unix системах. Решение — использовать NFS, которая намного быстрее. Насколько быстрее, спросите вы? Включение NFS удвоило производительность Rails-приложения, в зависимости от количества запросов она смогла служить в течение 2 минут. В конце статьи Вы узнаете о технологии замера производительности.
Добавьте следующие строки в Ваш файл конфигурации Vagrant, чтобы включить NFS:
# Required for NFS to work, pick any local IP
config.vm.network :private_network, ip: '192.168.50.50'
# Use NFS for shared folders for better performance
config.vm.synced_folder '.', '/vagrant', nfs: true

Обратите внимание: по большому счету тут Vagrant не виноват, — это издержки VirtualBox. Однако было бы не плохо, если бы в документации по Vagrant был раздел «Производительность». Данная настройка кажется несущественной до того момента, пока Вы не решите оценить производительность, и не понимаете, что теряли половину того, что могли бы получить.
Используйте все ядра процессора и четверть памяти.
Большинство людей не утруждается указанием Virtualbox-у необходимости использовать более одного ядра CPU и стандартного объема оперативной памяти. Это в принципе понятно, — сложно придумать настройки, которые будут давать одинаковую производительность, на разных хостовых системах. Это заняло некоторое время, но я собрал параметры, которые должны задать правильные настройки для каждого компьютера:
config.vm.provider "virtualbox" do |v|
  host = RbConfig::CONFIG['host_os']

  # Give VM 1/4 system memory & access to all cpu cores on the host
  if host =~ /darwin/
    cpus = `sysctl -n hw.ncpu`.to_i
    # sysctl returns Bytes and we need to convert to MB
    mem = `sysctl -n hw.memsize`.to_i / 1024 / 1024 / 4
  elsif host =~ /linux/
    cpus = `nproc`.to_i
    # meminfo shows KB and we need to convert to MB
    mem = `grep 'MemTotal' /proc/meminfo | sed -e 's/MemTotal://' -e 's/ kB//'`.to_i / 1024 / 4
  else # sorry Windows folks, I can't help you
    cpus = 2
    mem = 1024
  end

  v.customize ["modifyvm", :id, "--memory", mem]
  v.customize ["modifyvm", :id, "--cpus", cpus]
end

Используйте vagrant package

Обычно процесс установки Vagrant включает в себя загрузку базовой ОС (обычно lucid64 или precise64) и установку необходимых пакетов с помощью Puppet или Chef. Я обнаружил что вместо мороки с написанием скриптов инициализации, проще запустить базовую систему, установить все вручную, выйти из SSH-сессии и затем запустить команду:
vagrant package --output NAME

На выходе Вы получите пакет NAME.box, который можно загрузить в облако (я использовал S3) и в конфигурационном указать файле Vagrant следующее:
config.vm.box = 'NAME'
config.vm.box_url = 'https://s3.amazonaws.com/BUCKET/vagrant/NAME.box'

Таким образом, пр запуске команды vagrant up вместо повторной инициализации, — скачается и сразу запустится предварительно настроенная среда.

Дополнительно: оценка производительности NFS

Я использовал wrk, отличный инструмент для бенчмаркинга HTTP, по моему мнению удобнее чем ab.
Запуск Vagrant при использовании встроенных средств virtualbox:
→ wrk -d120s http://localhost:3333/
Running 2m test @ http://localhost:3333/
  2 threads and 10 connections
  Thread Stats   Avg      Stdev     Max   ± Stdev
    Latency    49.14s    29.37s    1.17m   100.00%
    Req/Sec     0.00      0.00     0.00    100.00%
  12 requests in 2.00m, 490.39KB read
  Socket errors: connect 0, read 0, write 0, timeout 588
Requests/sec:      0.10
Transfer/sec:      4.09KB

Запуск приложения на хостовой системе (Macbook):
→ wrk -d120s http://localhost:3000/
Running 2m test @ http://localhost:3000/
  2 threads and 10 connections
  Thread Stats   Avg      Stdev     Max   ± Stdev
    Latency    40.04s    10.71s   47.93s    82.35%
    Req/Sec     0.00      0.00     0.00    100.00%
  27 requests in 2.00m, 1.10MB read
  Socket errors: connect 0, read 0, write 0, timeout 573
Requests/sec:      0.22
Transfer/sec:      9.37KB

Запуск приложения в Vagrant при использовании NFS:
→ wrk -d120s http://localhost:3333/
Running 2m test @ http://localhost:3333/
  2 threads and 10 connections
  Thread Stats   Avg      Stdev     Max   ± Stdev
    Latency    41.46s    12.49s    1.03m    50.00%
    Req/Sec     0.00      0.00     0.00    100.00%
  24 requests in 2.00m, 0.96MB read
  Socket errors: connect 0, read 0, write 0, timeout 576
Requests/sec:      0.20
Transfer/sec:      8.18KB

Источник: stefanwrobel.com

1 комментарий

Satchitananda
Для того чтобы под Windows заработал NFS нужно поставить плагин для Vagrant:

vagrant plugin install vagrant-winnfsd

Вот ссылка на плагин на GitHub: github.com/winnfsd/vagrant-winnfsd

Оставить комментарий