Ускоряем vagrant shared-folder на Windows хосте (UPD. не всё так гладко)



Я полтора года мучился с одной неприятной особенностью ubuntu под vagrant — чертовски медленная расшаренная папка. Простые бенчмарки показывали просадку производительности I/O операций почти на 2 порядка, проекты на php работали до 10 раз медленнее чем на нативном хосте. Так вот, сегодня я задолбался окончательно, хорошо поискал… и оказалось что есть решение, и теперь я просто не могу не поделиться им с кем-то. Решение простое, кому-то покажется очевидным, кто-то знал о нём с рождения (ну или будет так утверждать), но я уверен что знают о нём не все.

А чём проблема то?


По умолчанию vagrant использует файловую систему vboxsf, которая иногда работает крайне медленно (когда это «иногда» случается — я не знаю, у меня оно всегда тормозило). Свой тип файловой системы можно узнать по команде mount.



Можно заменить файловую систему, но пролема в том что официальная документация… врёт! Она говорит мол да, иногда бывают проблемы с перфомансом расшаренных папок, в таких случаях используйте nfs и будет вам счастье. А ниже приписка — на windows не сработает, и не пробуйте.



А знаете в чём соль? Да работает оно и на windows, нельзя верить документации!

И что делать?

Идём сюда https://github.com/winnfsd/vagrant-winnfsd, читаем, ставим, радуемся. Для тех кому лень читать:

  • выполнить в windows консоли «vagrant plugin install vagrant-winnfsd»
  • добавить две строки в Vagrantfile

config.vm.network «private_network», type: «dhcp»
config.vm.synced_folder ".", "/vagrant", type: «nfs»

Перезагружаем vagrant, готово! Не знаю, возможно существуют какие-то подводные камни, может кому-то не поможет, но у меня, вроде, работает отлично. Моя конфигурация: Windows 10 (host) + ubuntu 14.04 (guest). Мой проект на laravel ускорил отдачу страницы с 6.5 секунд до 0.5, что не может не радовать.

P.S. пост получился коротким, сумбурным, но попадись он мне год назад — я был бы безумно рад.

UPD. В комментариях говорят что работает нестабильно. Спустя сутки работы убедился сам — бывают проблемы с синхронизацией файлов. Так что не всё так идеально, как казалось на первый взгляд…
Поделиться публикацией

Похожие публикации

Комментарии 36

    0
    Попадись мне этот пост год назад…
      +1
      Настоящий ад, это когда используешь это всё ещё и без ssd :)
        0
        Даа) Я как поставил себе ssd — так словно мир технологий на 10 лет вперёд прыгнул
        0
        Простите за оффтоп: не сравнивали работу в virtualbox со встроенной недавно в вин10 убунтой? Я совсем немного потыкал, вроде всё ок и с папками, и со скоростью в общем.
        А за статью спасибо, когда-то отказался от виртуалки именно из-за этой проблемы.
          0
          Лично я не сравнивал, а коллега сравнивал… да так и остался на ней. Весь LAMP стек вроде, отлично поднялся, проблем не было. Радуется теперь, мол никакого вагранта не надо)
            0
            Преимущество связки VirtualBox c Vagrant в изолированности, то есть можно спокойно экспериментировать в «песочнице», которую потом легко убить если что-то пошло не так или закатать в отдельный бокс для отдельного круга задач с готовыми настройками…
            Так что Vagrant удобен даже если и host и guest системы одинаковые.
              +1
              ИМХО, суть даже не в изолированности, а в том что можно иметь несколько окружений. Допустим, у меня параллельно два проекта на php7 и php5.6, и держать их в одной системе ну очень напряжно, по причинам того что php и apache не умеют быстро переключать версии. А так два отдельных бокса — и весело-удобно)
                0
                Да, а еще возможность не засорять основную систему и точно знать что установлено в данной конкретной сборке конкретного проекта, чтобы потом не гадать чем сервер куда загрузили результат отличается от локального и почему на нем не завелось.
                  0
                  OpenServer (не реклама) переключает версии влёгкую) Дома пользуюсь им
                    0

                    Инструмент отличный, но его хватает ровно до того момента когда проекту нужны unix-специфичные php-модули

                    0
                    Допустим, у меня параллельно два проекта на php7 и php5.6, и держать их в одной системе ну очень напряжно, по причинам того что php и apache не умеют быстро переключать версии
                    очень даже умеют — запуск нескольких версий php
                      0
                      Не, ну то что они умеют это в теории — я знаю. Практика же показала что настройка этого зоопарка — та ещё боль, и потом рано или поздно да вылезают какие-нибудь косяки. Реально проще содержать две виртуальные машины, чем настраивать так одну.
                0
                В первую очередь вагрант используется для переносимости и повторяенмости окружения. И лишь потом для локальной разработки.
                  +1
                  Сможете обосновать? Нет, правда интересно. Уже третий год как разрабатываю исключительно на вагранте — и горя не знаю. Полная повторяемость боевого сервера на *nix, при этом не надо себя мучать, и можно спокойно работать на windows. В чём проблема?
                    0
                    Вы разрабатываете на VirtualBox по сути, а вагрнат лишь некая обвертка. Из личного опыта — за последние пару лет ни один из разработчиков, с которыми работал, никогда не использовал виртуализацию для подобного. Docker + compose вполне хватает для поднятия локального окружения. Возможно мне попадались исключительно правильные разработчики.

                    Не знаю как сейчас обстоят дела при запуске Vagrant на Windows платформе, но в свое время приходилось выдумывать велосипеды

                    P.S.
                    windows не используем, только mac/linux
                      0
                      Может на макоси нужны какие-то велосипеды, но в текущее время, на windows, всё абсолютно прозрачно. Утром пришёл, запустил один ярлык (на самом деле .bat файл который выполняет vagrant up в нужной директории), подождал около минуты, всё, всё готово, можно работать. Поднять полностью готовую к работе машину можно минут за 30, при том что 20 минут будет качаться образ убунты. Я ни в коем случае не фанатик вагранта, просто за пару лет с ним только позитивный опыт, а тут, оказывается, это не комильфо)

                      P.S. о докере слышал, но пока что руки не доходят. да и, как говорится, не хочется чинить то что не сломано (менять то что работает)
                        0
                        Тут речь скорее идет не просто о запуске виртуалки как таковой, а когда вам необходимо выполнить какие-либо дополнительные действия, например тот же проивизион через ansible/chef/etc
                          0
                          Возможно не совсем понимаю о чём вы, но в вагранте можно прописывать provision скрипты, которые выполнятся сразу при загрузке виртуалки. Как автозагрузка в windows
                            0
                            Я это прекрасно знаю, но я уже приводил ссылку выше, когда ansible не работал в среде windows, но при этом отлично работал на linux/mac. Тут конечно вина не самого вагранта как такового, он лишь посредник, а сама возможность создавать повторяемые и независимые окружения без привязки к ОС.
                  0
                  А нет решения для чистого virtualbox?
                    0
                    это не работает как надо, куча проблем, особенно с гитом. когда переключаешь ветку, файлы могут не синхронизироваться, рандомные баги в коде из-за этого. Куча багов на гитхабе про это. Под Винду нет нормального способа разрабатывать. Vagrant + что угодно: баги и медленно, docker +win 10(7): баги с правами. Вечные проблемы с правами на файлы и папки. нормально не пробрасывается. Как итог — пока vagrant + winnfsd и vagrant reload при смене ветки или просто если начались глюки
                      0
                      Буду тестить, пока что гит не жалуется. Если будут проблемы — напишу апдейт поста
                      0
                      «А знаете в чём соль? Да работает оно и на windows, нельзя верить документации! »
                      Зачем вводить людей в заблуждение? Это написано в официальной документации и официально это не поддерживается. Решение которое предлагаете вы — костыль неизвестного человека
                        0
                        А почему заблуждение? Документация говорит что вагрант будет тупо игнорировать запрос на nsf на windows хосте, при том что по факту, он этого не делает. В чём заблуждение? Стабильность «костыля» — другой вопрос, но работоспособность то не вызывает сомнений
                          0
                          В том что документация не распространяется на стороннее допиливание? Вы действительно не понимаете разницы?
                            0
                            Это уже вопрос терминологии. А по факту — документация говорит что что-то не будет работать в принципе, а оно заводится с минимальными телодвижениями
                        –4
                        Уберите этот пост из раздела администрирования, пишите на php, не пишите на habr, пожалуйста
                          +1
                          Есть ещё вариант — мне помог ввиду невозможности установить nfs в гостевую машину — я пользуюсь PHPStorm, там есть опции синхронизации файлов с гостевой машиной. Буквально, после изменения/переключения в другую ветку, файлы просто аплодятся куда надо. Есть некоторые минусы, но всё работает значительно быстрее. «Тебе не придётся терпеть медленный vboxsf, если твой проект будет в самом вагранте»)
                            0

                            Если только этот проект не состоит из охуллиона файлов

                              0
                              Да нет, всё в порядке. Загружаются же только изменённые файлы. Вопрос уже в том, насколько «свежи» ваши ветки от основного бранча)
                                0
                                Правда перед этим они часа четыре качаются.
                            0
                            1. Поднимаем в убунте самбу(Samba Server), шарим нужную директорию простеньким конфигом
                            /etc/samba/smb.conf
                            [Ubintu16SitesShare]
                            path = /srv/www
                            available = yes
                            browsable =yes
                            writable = yes
                            guest ok = yes
                            read only = no
                            force user = username
                            force group = groupname

                            2. Total Commander -> Net->Network connections: привязываем расшаренную папку к свободной букве диска.
                            3. Натравливаем пхпшторм на этот виртуальный диск который светится рядом с С:\ и D:\

                            Работает нааамного быстрее вагрант шаредфолдера
                            Из минусов — симлинки винда не поддерживает, видит как отдельные файлы
                            git в винду не ставить, идём в убунту по ssh, все манипуляции с гитом только там
                              0
                              К сожалению, плагин «vagrant-winnfsd» не является панацеей. При использовании Homestead от Laravel проблем не было, скорость действительно возрасла и стала более чем удовлетворительной (с ssd). При использовании DrupalVM и ряда самодельных машин на базе Ubuntu 16.04 наблюдается проблема при обработке большого количества файлов — виртуальная машина напрочь виснет. Чаще всего это проявляется после установки большого проекта через Composer. Не уверен, что Homestead чем-то лучше других, просто там не разворачивал ничего крупнее Laravel с несколькими зависимостями.

                              Наткнулся на предложение использовать «winnfsd» без плагина, а как отдельный сервис, но пока не проверял — hollyit.net/blog/windowsvagrantwinnfsd-without-file-update-problems
                                0

                                Недавно столкнулся с проблемой, что гостевая ubuntu на vagrant'е самовольно убивала процессы (выдавала сообщение "Killed"). Может кто в курсе, с чем это связано?

                                  0

                                  RSync механизм попробуйте: https://www.vagrantup.com/docs/synced-folders/rsync.html

                                    0
                                    Не слишком понятно, что именно вызывало проблемы у пользователей при работе с nfs, у меня все решилось без проблем вот такой добавкой в Vagrantfile:

                                      if Vagrant.has_plugin? 'vagrant-winnfsd'
                                        config.vm.synced_folder ".", "/var/www",
                                          nfs: true,
                                          mount_options: [
                                          'nfsvers=3',
                                          'vers=3',
                                          'actimeo=1',
                                          'rsize=8192',
                                          'wsize=8192',
                                          'timeo=14'
                                          ]
                                      else
                                        config.vm.synced_folder ".", "/var/www", :mount_options => ["dmode=777", "fmode=666"]
                                      end


                                    Нашел ее в одном из проектов для разворачивания WordPress на Vagrant. При желании наверняка можно поиграться с параметрами в данном коде, у меня лично прирост обнаружился, не критичный, но при этом ощутимый. Еще, кстати, лично мне помогло выделение двух ядер виртуальной машине. В итоге Vagrantfile получился таким (11 ревизия, если что).

                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                    Самое читаемое