Main > stdout.in Ievgen Kuzminov IT blog

Posts by tag : performance

Как ускорить Vagrant (общие папки)

vagrant

Я разрабатываю PHP и Ruby веб приложения с использованием Vagrant и мне кажется, что это хорошее направление. Но есть одно "но" - плохая производительность веб приложений в Vagrant.
Основная проблема это низка скорость виртуализированной дисковой системы (папок с общим доступом между Хост машиной и Vagrant машиной).

Папки с общим доступом по-умолчанию

При стандартной конфигурации Vagrant-а, как
config.vm.synced_folder "./", "/var/www"
используется стандартный механизм папок с общим доступом в VirtualBox, но это работает медленно. И мы ощущаем последствия этого в виде медленного отклика веб приложений (это происходит из-за автоподгрузки классов и других операций связаных с диском).

Но есть пути улучшить это :

rsync

Если изменить конфигурацию на использование rsync
config.vm.synced_folder "./", "/var/www", type: "rsync"
то после vagrant reload
он не будет монтировать синхронизированную папку, а сделает физическое синхронизирование файлов в хранилище VirtualBox. Самое интересное, что внутренняя ФС VirtualBox очень быстрая (в отличии от ФС с общим доступом) и мы получаем очень хорошую производительность.

Но есть "ложка дегтя" :

  • для автоматизации синхронизации изменений с Хост машины на VB надо запускать vagrant rsync-auto каждый раз при запуске Vagrant машины

  • после каждого изменения файла проходит 2-3 сек. до синхронизации в VB

  • синхронизация односторонняя, нет нормальной возможности синхронизировать изменения обратно с VB на Хост машину (разработчики Vagrant обещали подумать над двусторонней синхронизацией, но пока это невозможно)

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

NFS

Другой способ это использовать примонтированные NFS диски. Vagrant также поддерживает эту возможность
config.vm.synced_folder "./", "/var/www", type: "nfs"
и не забудьте запустить vagrant reload

После этого всё выглядит также, как и дисках с общим доступом по-умолчанию. Не надо ждать синхронизации или запускать синхронизацию вручную. Но производительность будет лучше (хотя и не такая, как при rsync).
Один минус - это не будет работать под Windows. А на Linux требуется установить спец. NFS пакет на Host и Vagrant машины.
На Host sudo apt-get install nfs-kernel-server nfs-common portmap.
На Vagrant sudo apt-get install nfs-common portmap.
Также NFS требует настроить в Vagrant Private network (а не public или bridget), должно быть примерно так
config.vm.network :private_network, ip: "10.10.11.11"

После единоразовой настройки всё будет работать автоматически и достаточно надежно. И это мой выбор на данный момент.

Иногда я встречал странные замедления при работе NFS в некоторых проектах. Пробуя разные параметры подключения, определил, что это может быть связано с локами файловой системы. И данная конфигурация улучшала производительность :
config.vm.synced_folder "./", "/var/www", type: "nfs", nfs_version: "4,nolock"

PHP opcode кэш (и подобные)

Ещё один аспект, который можно улучшить. использование opcode-ОЗУ кэша. Для PHP есть несколько вариантов - APC или Zend Opcache. Я не уверен, но для других скриптовых языков также могут быть подобные вещи. Например, включить APC кэш в Ubuntu можно так :
~~~ sudo apt-get install php-apc sudo service apache2 restart ~~~ В Vagrant машине вы увидете существенное ускорение PHP приложения с APC.

С другой стороны - рассматривайте это замедление работы диска в Vagrant, как хороший индикатор производительности вашего веб приложения. Если оно тормозит в Vagrant - возможно, будет тормозить и в Production :)


Read more ...

Notes by tag : performance

No results found.
Ievgen
Kuzminov "iJackUA"
Web Team Lead
at MobiDev (Kharkiv, Ukraine)
Code in Ruby and Elixir, but still love PHP. Explore ES6 and Vue.js. Explore databases, use Ubuntu and MacOS, think about IT people and management

Notes


Gor tool for capturing and replaying live HTTP traffic into a test environment in order to continuously test your system with real data. It can be used to increase confidence in code deployments, configuration changes and infrastructure changes.