Как ускорить 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 ...

Как установить Redis 2.8 (новейший) + PhpRedis на Ubuntu из исходных кодов

redis

Redis это современное и очень быстрое хранилище данных "ключ-значение". Кто-то причисляет его к "NoSQL" хранилищам, кто-то просто считает, что это "кэш в оперативной памяти". И каждый по своему прав - в любом случае Redis это мощный инструмент, который может быть очень эффективен во многих случаях.

Изучаем Redis

Если вы тесно не знакомы с Redis. Начните с Маленькой книге о Redis от Карла Сегуина. Книга даёт базовое понимание и вдохновляет к использованию. После неё вы уже легко разберётесь в какую сторону "копать" дальше в изучении Redis (материалов и документации в Интернете великое множество).

Redis активно разрабатывают и часто обновляют новым функционалом, и потому многие менеджеры пакетов для Linux содержат устаревшие версии. Я рекомендую устанавливать Redis и php_redis (PHP расширание для связи с Redis) из свежайших исходных кодов - это легко и просто.


Read more ...

Как исправить "дублирование" иконки Google Chrome в Elementary OS Plank

chrome

После недавнего апдейта Google Chrome, его иконка стала "раздваиваться" в доке (Plank). Одна "копия" прикреплена в доке (и не активна), а "вторая" появляется при запуске и уже отвечает за активное окно.

Исправить это можно, внеся изменения в ярлык запуска :
sudo gedit /usr/share/applications/google-chrome.desktop

Внутри каждой секции "[Desktop Entry]" надо добавить строку
StartupWMClass=Google-chrome-stable

Затем закрыть Chrome, удалить иконка из Plank, перезапустить Chrome. Перезакрепить иконку.

Проблемы ?

Если вы получаете ошибку Your profile could not be opened correctly при запуске браузера - попробуйте "убить" процесс (фоновый процесс может блокировать файлы профиля) :
sudo killall -9 chrome


Как установить Elance Tracker на последний Ubuntu 14.04 (Linux Mint 17)

Elance Tracker

Приложение Elance Tracker использует Adobe Air, а т.к. Adobe остановило поддержку Air для Linux (последняя версия 2.6) - запуск Air приложений на Linux стал проблемой.
В Интернет можно найти множество мануалов (разной степени корректности и работоспособности) о том как решить проблему с установкой Air на Linux (такие как линкование libgnome-keyring.so и т.д.), но с каждым новым релизом Ubuntu совместимость всё меньше.

В Ubuntu 13.10 долгое время я вобще не мог найти рабочего способа для установки Adobe Air. Только способ от tkalin.com помог это сделать.

  • Вот вся установка одним скриптом. Сохраните его в файл, например, install_adobe_air.sh
#!/bin/bash
apt-get install libgtk2.0-0:i386 libstdc++6:i386 libnss3-1d:i386 lib32nss-mdns libxml2:i386 libxslt1.1:i386 libcanberra-gtk-module:i386 gtk2-engines-murrine:i386
cd /tmp
apt-get download libgnome-keyring0:i386
dpkg-deb -R libgnome-keyring0_3.8.0-2_i386.deb gnome-keyring
cp gnome-keyring/usr/lib/i386-linux-gnu/libgnome-keyring.so.0.2.0 /usr/lib/i386-linux-gnu/
ln -s /usr/lib/i386-linux-gnu/libgnome-keyring.so.0.2.0 /usr/lib/i386-linux-gnu/libgnome-keyring.so.0
ln -s /usr/lib/i386-linux-gnu/libgnome-keyring.so.0 /usr/lib/libgnome-keyring.so.0
ln -s /usr/lib/i386-linux-gnu/libgnome-keyring.so.0.2.0 /usr/lib/libgnome-keyring.so.0.2.0
wget http://airdownload.adobe.com/air/lin/download/2.6/AdobeAIRInstaller.bin
chmod a+x AdobeAIRInstaller.bin
./AdobeAIRInstaller.bin
rm ./AdobeAIRInstaller.bin
rm /usr/lib/libgnome-keyring.so.0
rm /usr/lib/libgnome-keyring.so.0.2.0
  • Сделайте его исполняемым sudo chmod a+x install_adobe_air.sh
  • И запустите sudo ./install_adobe_air.sh (в ходе процесса появится графическое окно установки Abode Air )
  • Потом скачайте Elance Tracker для Linux и установите самым обычным способом

Read more ...
Евгений
Кузьминов "iJackUA"
Web Team Lead
в MobiDev (Харьков, Украина)
Code in PHP and Ruby, play with JS/Node.JS, evaluate Elixir, explore databases, use Ubuntu and MacOS, think about IT people and management

Заметки