Все о компьтерах

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

Я использовал , отличный инструмент для бенчмаркинга 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

Источник: