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

Почему мой сайт 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 занимает довольно много времени.

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

4b9b3361

Ответ 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