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



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



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



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



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

618   5  

5 ответов:

Я видел подобную проблему на моем хосте OS X, я забыл включить NFS ! На хосте windows влияние на производительность меньше... Для моего очень маленького сайта у меня есть kickly 12649 файлов... Таким образом, ограничение в 1000+ файлов достигается довольно легко.

Итак, мои два цента: включить NFS Вот так в вашем Vagrantfile:

config.vm.share_folder "v-root", "/vagrant", ".." , :nfs => true

И от экспертов:

Это давно известная проблема, что производительность общих папок VirtualBox снижается быстро, как количество файлов в общая папка увеличивается. Когда проект достигает 1000 + файлов, выполнение простых вещей, таких как запуск модульных тестов или даже просто запуск сервера приложений, может быть на много порядков медленнее, чем в родной файловой системе (например, от 5 секунд до более чем 5 минут).

Если вы видите такое снижение производительности в общих папках, общие папки NFS могут предложить решение. Залет будет оркестровать настройка NFS сервера на хост и будет монтировать папки на гостевой для тебя.

Примечание: NFS не поддерживается на хостах Windows. Согласно VirtualBox, общие папки в Windows не должны страдать от тех же штрафов за производительность, что и в системах на базе unix. Если это не так, не стесняйтесь использовать наши каналы поддержки,и, возможно, мы сможем вам помочь.

Правка:

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

Там, где я работаю, мы опробовали два решения проблемы замедления Vagrant + Symfony. Я рекомендую второй вариант (NFS и bind mounts).

Подход rsync

Для начала мы использовалиrsync . Наш подход несколько отличался от изложенного в ответе Адриенбро . Скорее, у нас был код, подобный следующему в нашем 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

Как вы могли заметить из вышесказанного, мы держали файлы в синхронизации, используя бродячий Гатлинг rsync plugin .

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

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

Соответствующие биты файла 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 + binding mounts-это подход, который я бы рекомендовал.

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

Следуя инструкциям в этой статьеускорение Symfony2 на Vagrant boxes помогло мне решить эту проблему, сократив загрузку страницы с 6-10 секунд до 1 секунды в моем проекте Symfony2. В основном все исправление состоит в том, чтобы установить тип синхронизации между хостом и гостем (vagrant VM box) с помощью NFS вместо использования системы общих папок VirtualBox, которая очень медленная.

Также добавляем этот код ниже в AppKernel.php на проекте Symfony2, изменяет кэш и лог каталог в каталог общей памяти (/dev/shm) на коробке vagrant вместо записи их в общий ресурс 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();
    }
}

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

Comments

    Ничего не найдено.