В очередной раз меня задолбали “тормоза” в WSL, и я предпринял ещё одну попытку его ускорить.
Для разработки на PHP я использую Windows в связке с WSL (Windows Subsystem for Linux).
На WSL у меня установлен Ubuntu и все мои любимые инструменты разработки, включая PHP, SSH, Git, Docker, Node.js и так далее.
Всё круто, всё отлично работает, практически без багов. Но есть одно “но”.
Почему WSL “тормозит”?
Известный факт: то что не тормозит на “родном” Ubuntu, например на арендованном VPS, может тормозить на WSL.
Как это происходит?
Разработчик клонирует репозиторий, запускает сайт в докере или без докера, а страницы открываются по 10-20 секунд. Кошмар.
Кто виноват?
Если коротко, виноват протокол 9p, также известный как “Nine Patch”.
9p в WSL используется для общения между системами. И он не такой уж быстрый, так как под капотом вызовы его функций тратят много лишнего времени на сетевую обработку.
Что значит “общение между системами”?
Выглядит это так.
- Windows -> Windows: Программы Windows обращаются к дискам Windows напрямую, и это быстро.
- WSL -> WSL: Программы WSL (в том числе PHP, Nginx и Docker) обращаются к файлам WSL напрямую, и это быстро.
- Windows -> WSL: Программы Windows обращаются к файлам WSL через 9p, и это медленно.
- WSL -> Windows: Программы WSL обращаются к файлам Windows через 9p, и это медленно.
То есть, грубо говоря, сами по себе программы и ядро WSL не тормозят, но тормозит доступ к файлам на “неродной” системе.
Насколько это плохо?
Больше всего бесят тормоза в программах PhpStorm и SmartGit. Разработчики PhpStorm даже выпустили специальное обновление, которое позволяет PhpStorm работать быстрее на WSL.
SmartGit я использую для управления Git репозиториями. Тормоза в работе с репозиториями расположенными в WSL просто дикие.
Как я решал проблему?
1. Перенос проекта в файловую систему WSL
Базовым решением является перенос репозитория с виндового диска D:\
куда-нибудь в WSL, например в /home/projects
.
После этого сайт локально открывается быстро, и в докере и на чистом PHP. Консольные команды также становятся быстрыми как в нативном Линуксе.
Но это решает только часть проблемы. Windows программы, такие как PhpStorm и SmartGit, всё равно используют 9p для доступа к файлам на WSL, поэтому они тормозят.
2. Git Blaster
Мне даже пришлось написать свой консольный менеджер для Git на замену SmartGit: Git Blaster. Я запускаю его прямо в WSL, поэтому он работает быстро. Он справляется с большинством рутинных операций. Где его недостаточно, я переключаюсь в SmartGit.
Как ускорить?
В очередной раз, наевшись проблем с тормозящим 9p, я решил поискать решение для ускорения доступа к файлам WSL. Может его уже придумали, ведь несколько лет прошло?
Одним из вариантов был подключить диск WSL к Windows не по стандартной схеме а через Samba.
Что такое Samba?
Samba (сокращённо SMB) это софт для расшаривания сетевых дисков между Windows и Linux системами. Я пользовался им ещё в 2008 году.
Утверждалось, что подключенный по Samba диск работает быстрее чем 9p. Я решил проверить.
Как подключить?
1. Установите samba в WSL:
sudo apt update && sudo apt install samba -y
2. Настройте /etc/samba/smb.conf
:
[wsl_share]
path = /home/your_user
read only = no
guest ok = no
force user = your_user
3. Задайте пароль для Samba:
sudo smbpasswd -a your_user
4. Запустите SMB-сервер:
sudo service smbd restart
5. Подключитесь из Windows:
Откройте \\<wsl_ip>\wsl_share
в Проводнике.
IP WSL можно узнать так:
hostname -I
Результат
Подключить папку WSL /home/projects
к Windows через Samba получилось без каких-либо проблем.
1. Тест на запись и чтение
Для проверки скорости я написал синтетический тест на чтение и изменение 1000 файлов на диске, в виде BAT-скрипта.
Прогнав этот тест для Samba и для диска, подключенного через 9p, я получил ускорение на Samba версии на 15%.
Такое ускорение приятно, но общая скорость всё ещё разочаровывает.
2. Скорость SmartGit
Тогда я замерил открытие рабочего проекта в SmartGit с секундомером. Это уже чисто чтение большого количества файлов.
Репозиторий открылся в два раза быстрее! 2,5 секунд вместо 5.
Вот это уже действительно улучшение. Ещё не идеально, но жить стало легче.
P.S.
Жаль, что никто ещё кардинально не решил эту проблему со скоростью доступа к файлам. Проблема чисто техническая, поэтому я абсолютно уверен что она решаема.
Решит её кто-нибудь? Поживём – увидим.
Пока что я рад тому, что ускорил свои программы хотя бы немного.