Почему мой сайт Symfony 2.0 медленно работает на Vagrant с хостом Linux?

У меня есть приложение Symfony 2.0, работающее с использованием Vagrant с гостевой ОС Linux и операционной системой хоста (Ubuntu). Однако он работает медленно (например, несколько секунд для загрузки страницы, часто более 10 с), и я не могу понять, почему. У моих коллег, которые управляют сайтом локально, а не на Vagrant VM, он работает быстрее.

Я где-то читал, что виртуальные машины Vagrant работают очень медленно, если NFS не включена, но я включил это. Я также использую кэш APC, чтобы попытаться ускорить процесс, но проблемы все еще остаются.

Я запустил xdebug на своем сайте, следуя инструкциям на странице http://webmozarts.com/2009/05/01/speedup-performance-profiling-for-your-symfony-app, но я не понимаю, с чего начать анализ данных из этого. Я дошел до того, что открыл его в KCacheGrind и искал большие числа в разделе «Вкл.». и "Я", но это только что показало, что php::session_start занимает довольно много времени.

Любые предложения относительно того, что я должен попробовать здесь? Извините за несколько широкий вопрос, но я в тупике!


person Sam    schedule 28.08.2012    source источник
comment
Связано: whitewashing.de/2013/08/19/   -  person Matthieu Napoli    schedule 19.08.2013
comment
Это кажется действительно хорошей идеей! Я больше не использую Vagrant, но я сообщил об этом людям на работе. Некоторые из них использовали Vagrant, но я не уверен, что они все еще там.   -  person Sam    schedule 20.08.2013
comment
Также тесно связаны: erikaheidi.com/2013/09 /24/   -  person Sliq    schedule 07.01.2014


Ответы (5)


Я видел похожую проблему на моем хосте OS X, я забыл включить NFS! На хосте Windows влияние на производительность меньше ... Для моего очень маленького веб-сайта у меня есть 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. Если это не так, не стесняйтесь использовать наши каналы поддержки, и, возможно, мы сможем вам помочь.

Редактировать:

В Windows я нашел другое решение: я использую символические ссылки (ln -fs) в папках поставщиков в своих проектах, которые ссылаются на папки, не являющиеся общими. Это уменьшит количество файлов, видимых хостом Windows, антивирусом и т. д.

person Alexandre Mélard    schedule 04.12.2012
comment
Я использую следующую строку в своем Vagrantfile, так как это означает, что он загружает его для не-Windows (где он работает), а не для Windows (где он не работает): config.vm.share_folder("v-root", "/vagrant", "./", :nfs => !RUBY_PLATFORM.downcase.include?("w32")) - person Sam; 05.12.2012
comment
Вы пытались не делиться папкой в ​​бродяге и запустить задание rsync, чтобы поместить файлы в ящик бродяги? Это немного сложно, но если ваше время отклика значительно улучшится взамен ... может быть, оно того стоит - person Alexandre Mélard; 08.12.2012
comment
Общие папки «v-root» были переименованы в «vagrant-root» — помните об этом, если используете новую версию Vagrant. - person Scottymeuk; 08.04.2013
comment
Примечание. В синтаксисе Vagrant 1.1 строка должна быть: config.vm.synced_folder ".", "/vagrant", :nfs => !RUBY_PLATFORM.downcase.include?("w32") - person geerlingguy; 08.08.2013
comment
отличным решением для Windows является бродячий плагин: vagrant-winnfsd — включение NFS для Windows. - person Tomek Kobyliński; 19.09.2014
comment
Дает потрясающий прирост производительности на OS X! Спасибо :) Вы исцелили мою жизнь =) - person Nikolay Fominyh; 28.11.2014
comment
Это сократило время загрузки страницы примерно с 30 секунд до 1,2 секунды! - person Oscar Pérez; 16.01.2015
comment
В OP четко указано, что NFS уже включена, но производительность по-прежнему неприемлема. Я подтвердил и это. Кроме того, я подтвердил, что даже при включенном rsync задержка сохраняется. Уже есть много документации о подходах к общим папкам Vagrant, но информации о конкретном варианте использования OP, который кажется распространенным, крайне не хватает. - person Jonathan Neufeld; 08.06.2015

Там, где я работаю, мы пробовали два решения проблемы медленной работы 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.

Улучшенный подход NFS с использованием привязки (рекомендуемое решение)

Подход rsync решает проблему скорости, но мы обнаружили некоторые проблемы с ним. В частности, его односторонний характер (в отличие от совместного использования папок) раздражал, когда файлы (такие как composer.lock или миграции Doctrine) генерировались на виртуальной машине или когда мы хотели получить доступ к коду в /vendor. Нам пришлось использовать SFTP, чтобы скопировать все обратно, а в случае с новыми файлами сделать это до того, как они будут очищены при следующем запуске плагина гатлинга!

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

Соответствующие биты 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 выглядит следующим образом:

#!/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 +.

person Sam    schedule 08.10.2014
comment
Чтобы уточнить: мы использовали это и в более поздних версиях Symfony2, а не только в версии, упомянутой в моем первоначальном вопросе (2.0). - person Sam; 08.10.2014
comment
С новым макетом Symfony вам нужно только привязать mount var — все, что изменится, попадет туда. См. stackoverflow.com/a/23994473/3408. - person rjmunro; 18.05.2015

Банкомат, как правило, не размещает код вашего веб-сайта в общей папке /vagrant. Поскольку он используется совместно между вашей виртуальной машиной и операционной системой хоста, он работает медленнее; и я не нашел никакого эффективного решения для получения хорошей производительности. Решение, которое мы используем, состоит в том, чтобы обслуживать наши приложения для разработки из классического каталога /var/www и синхронизировать их с нашей локальной копией с помощью rsync.

person AdrienBrault    schedule 28.08.2012
comment
Итак, вы все еще используете возможности vagrant по созданию виртуальных машин, но не часть общей папки? Я прав, что вы используете rsync для синхронизации кода на вашем хосте с /var/www в гостевой системе? Просто хотел убедиться, что я понял, что вы предлагаете! Спасибо - person Sam; 29.08.2012
comment
Хорошо спасибо. Я подожду и посмотрю, есть ли у кого-нибудь какие-либо предложения, которые позволят мне продолжать использовать Vagrant стандартным способом, но если нет, я могу изучить вариант, который вы упомянули. Спасибо за вашу помощь. - person Sam; 29.08.2012
comment
В конце концов, я решил работать с моей локальной машины, а не с виртуальной машины, поскольку это соответствует тому, что делает остальная часть команды в этом проекте, и я могу повторно использовать настройку локальной машины для других проектов, которым она понадобится. . Спасибо за ваш вклад, я все еще могу попробовать это в будущем. - person Sam; 31.08.2012
comment
@AdrienBrault, вы можете автоматически синхронизировать рабочую копию и /var/www или вам нужно выполнить этот шаг вручную? - person shanethehat; 03.03.2013
comment
@shanethehat Я использую PHPStorm, и вы можете настроить удаленный сервер и phpstorm для автоматической загрузки на него при сохранении файла - person AdrienBrault; 03.03.2013
comment
Vagrant теперь имеет встроенную поддержку rsync docs.vagrantup.com/v2/synced. -folders/rsync.html - person Brian Ortiz; 19.04.2014

Следуя инструкциям в этой статье Ускорение Symfony2 на Бродячие блоки помогли мне решить эту проблему, сократив загрузку страницы с 6-10 секунд до 1 секунды в моем проекте Symfony2. В основном все исправление заключается в том, чтобы установить тип синхронизации между хостом и гостем (бродячий ящик виртуальной машины) с помощью 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();
    }
}
person elvismdev    schedule 06.12.2014

Я использую sshfs для совместного использования каталогов между хост-ОС и виртуальной машиной (расширение диска для Windows). Это намного быстрее, чем общий доступ к каталогам VBox.

person Alex Leschenko    schedule 12.10.2012
comment
Вы когда-нибудь использовали это с Vagrant? - person Sam; 24.10.2012