Почему мой сайт 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 занимает довольно много времени.
Какие-нибудь предложения относительно того, что я должен попробовать здесь? Извините за ... немного широкий вопрос, но я в тупике!
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