Почему мой сайт Symfony 2.0 работает медленно на Vagrant с хостом Linux?
У меня есть приложение Symfony 2.0, использующее Vagrant с гостем Linux и хостом O/S (Ubuntu). Однако он работает медленно (например, несколько секунд для загрузки страницы, часто более 10 секунд), и я не могу понять, почему. Мои коллеги, которые работают на сайте локально, а не на Vagrant VM, работают быстрее.
Я читал в другом месте, что Vagrant VM запускаются очень медленно, если NFS не включен, но я включил это. Я также использую кеш APC, чтобы попытаться ускорить процесс, но все еще остаются проблемы.
Я запускал xdebug для своего сайта, используя инструкции http://webmozarts.com/2009/05/01/speedup-performance-profiling-for-your-symfony-app, но я не знаю, с чего начать с анализа данных из это. Я добрался до KCacheGrind и искал высокие числа в "Incl". и "Я", но это только что показало, что php::session_start
занимает довольно много времени.
Любые предложения относительно того, что я должен здесь попробовать? Извините за немного широкий вопрос, но я в тупике!
Ответы
Ответ 1
Где я работаю, мы опробовали два решения проблемы медленного использования Vagrant + Symfony. Я рекомендую второй (nfs и bind mounts).
Подход rsync
Для начала мы использовали rsync. Наш подход несколько отличался от подхода, описанного в ответе AdrienBrault. Скорее всего, в нашем Vagrantfile
у нас был код вроде:
config.vm.define :myproj01 do |myproj|
# Networking & Port Forwarding
myproj.vm.network :private_network, type: "dhcp"
# NFS Share
myproj.vm.synced_folder ".", "/home/vagrant/current", type: 'rsync', rsync__exclude: [
"/.git/",
"/vendor/",
"/app/cache/",
"/app/logs/",
"/app/uploads/",
"/app/downloads/",
"/app/bootstrap.php.cache",
"/app/var",
"/app/config/parameters.yml",
"/composer.phar",
"/web/bundles",
"/web/uploads",
"/bin/behat",
"/bin/doctrine*",
"/bin/phpunit",
"/bin/webunit",
]
# update VM sooner after files changed
# see https://github.com/smerrill/vagrant-gatling-rsync#working-with-this-plugin
config.gatling.latency = 0.5
end
Как вы могли заметить из вышеизложенного, мы сохраняли файлы в синхронизации, используя Vagrant gatling rsync plugin.
Улучшенный подход NFS с использованием привязок mount
Подход rsync решает проблему скорости, но мы обнаружили некоторые проблемы с ним. В частности, односторонний характер (в отличие от общих папок) был раздражающим, когда на виртуальной машине были созданы файлы (например, composer.lock
или Doctrine migrations) или когда мы хотели получить код в /vendor
. Нам пришлось SFTP, чтобы скопировать вещи - и, в случае новых файлов, сделайте это, прежде чем они будут очищены следующим запуском плагина gatling!
Поэтому мы перешли к решению, которое использует привязки монтирования для по-разному обрабатывать папки, такие как кеш и журналы. Не имея этих разделов, резко увеличилась скорость.
Соответствующие биты Vagrantfile следующие:
# Binding mounts for folders with dynamic data in them
# This must happen before provisioning, and on every subsequent reboot, hence run: "always"
config.vm.provision "shell",
inline: "/home/vagrant/current/bin/bind-mounts",
run: "always"
Указанный выше bind-mounts
script выглядит следующим образом:
#!/bin/bash
mkdir -p ~vagrant/current/app/downloads/
mkdir -p ~vagrant/current/app/uploads/
mkdir -p ~vagrant/current/app/var/
mkdir -p ~vagrant/current/app/cache/
mkdir -p ~vagrant/current/app/logs/
mkdir -p ~vagrant/shared/app/downloads/
mkdir -p ~vagrant/shared/app/uploads/
mkdir -p ~vagrant/shared/app/var/
mkdir -p ~vagrant/shared/app/cache/
mkdir -p ~vagrant/shared/app/logs/
sudo mount -o bind ~vagrant/shared/app/downloads/ ~/current/app/downloads/
sudo mount -o bind ~vagrant/shared/app/uploads/ ~/current/app/uploads/
sudo mount -o bind ~vagrant/shared/app/var/ ~/current/app/var/
sudo mount -o bind ~vagrant/shared/app/cache/ ~/current/app/cache/
sudo mount -o bind ~vagrant/shared/app/logs/ ~/current/app/logs/
NFS + привязки привязок - это тот подход, который я бы рекомендовал.
Ответ 2
Я видел подобную проблему на моем хосте OS X, я забыл включить NFS!
В Windows Host влияние производительности менее верно...
Для моего очень маленького веб-сайта у меня есть 12649 файлов... Таким образом, ограничение 1000+ файлов довольно легко достигнуто.
Итак, мои два цента: включите NFS, как это в вашем Vagrantfile:
config.vm.share_folder "v-root", "/vagrant", ".." , :nfs => true
И от экспертов:
Его давняя известная проблема, связанная с тем, что производительность общих папок VirtualBox быстро ухудшается по мере увеличения количества файлов в общей папке. Поскольку проект достигает 1000+ файлов, выполнение простых вещей, таких как запуск модульных тестов или даже просто запуск сервера приложений, может быть на несколько порядков медленнее, чем в собственной файловой системе (например, от 5 секунд до более 5 минут).
Если вы видите такой снимок производительности в своих общих папках, общие папки NFS могут предложить решение. Vagrant будет управлять конфигурацией сервера NFS на хосте и будет монтировать папку для вас в гостях.
Примечание. NFS не поддерживается на хостах Windows. Согласно VirtualBox, общие папки в Windows не должны иметь одинаковые ограничения производительности, как в системах на основе unix. Если это не так, не стесняйтесь использовать наши каналы поддержки, и, возможно, мы сможем помочь вам.
Edit:
В Windows я нашел другое решение, я использую символические ссылки (ln -fs) в папках поставщиков в моих проектах, которые ссылаются на не общие папки. Это уменьшает количество файлов, просматриваемых хостом Windows, антивирусом и т.д.
Ответ 3
Банкомат, в основном, не помещает код вашего веб-сайта в /vagrant общую папку.
По мере обмена данными между вашей виртуальной машиной и хостом O/S это происходит медленнее; и я не нашел эффективного решения для получения хорошей производительности.
Решение, которое мы используем, состоит в том, чтобы обслуживать наши приложения для разработки с классического /var/www и синхронизировать их с нашей локальной копией с помощью rsync.
Ответ 4
Следуя инструкциям по этой статье Ускорение Symfony2 на бродячих коробках помогло мне решить эту проблему уменьшая загрузку страниц с 6-10 секунд до 1 секунды в моем проекте Symfony2. В основном все исправление заключается в том, чтобы установить тип синхронизации между хостом и гостем (бранное поле VM) с помощью NFS вместо использования системы общих папок VirtualBox, которая очень медленная.
Также добавляя этот код ниже в AppKernel.php в проекте Symfony2, он изменяет каталог кэша и журнала в каталог разделяемой памяти (/dev/shm) на брандмауэре вместо того, чтобы записывать их в общий ресурс NFS, поэтому он улучшает скорость загрузки страницы еще лучше.
<?php
class AppKernel extends Kernel
{
// ...
public function getCacheDir()
{
if (in_array($this->getEnvironment(), array('dev', 'test'))) {
return '/dev/shm/appname/cache/' . $this->getEnvironment();
}
return parent::getCacheDir();
}
public function getLogDir()
{
if (in_array($this->getEnvironment(), array('dev', 'test'))) {
return '/dev/shm/appname/logs';
}
return parent::getLogDir();
}
}
Ответ 5
Я использую sshfs для обмена каталогами между ОС хоста и VM (Expan drive для окон)
Это намного быстрее, чем собственный каталог VBox