Назад | Перейти на главную страницу

Как добиться достойной производительности NFS для таких рабочих нагрузок, как git?

Я управляю vagrant настройка для наших разработчиков, работающих под OSX, для управления системами VirtualBox для разработки.

Чтобы поддержать inotify внутри машины Linux мы избегаем обычного метода совместного использования каталогов с VirtualBox: вместо этого машина Virtualbox предоставляет общий ресурс NFS, который смонтирован в OSX.

Git (и связанные с ним инструменты, такие как sourcetree) запускаются в OSX в общем каталоге. Производительность у него очень низкая: часто просто запускается до 5 секунд. git status. Клонирование небольшого репозитория на смонтированный диск NFS может занять пару минут (5-10 секунд на локальном диске).

Очевидно, что производительность NFS будет хуже, чем при прямой записи на локальный SSD, но NFS просто работает через интерфейс виртуальной частной сети с Virtualbox.

Я провел пару тестов. Первый:

dd if=/dev/zero of=test bs=16 count=16384

Каждый результат основан на 100 образцах.

# local drive
Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
0.990   1.000   1.020   1.021   1.030   1.130

# on the shared NFS drive
Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
6.000   6.278   6.390   6.482   6.570   7.630

# inside the VirtualBox instance
Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
0.3600  0.4800  0.5150  0.5552  0.5400  1.4500

Второй тест:

ioping -c 500

local avg: 6 microseconds
local IOPS: 65.5 k

NFS Latency avg: 703 microseconds
NFS OPS: 1.4 k

Очевидно, некоторая задержка неизбежна, но этого достаточно, чтобы сделать некоторые простые задачи весьма болезненными.

Владелец тома работает под управлением Ubuntu 12.10 (Quantal) с настройками по умолчанию. Система, монтирующая том, работает под управлением OSX Mavericks.

На данный момент основное соединение nfsd работает через UDP, что кажется идеальным для виртуального соединения. Я не уверен statsd и lockd работают по TCP и UDP.

Я пробовал монтировать с async флаг, и с rwsize увеличился, и это не имело большого значения.

Какие есть возможности для серьезного повышения производительности NFS в этой среде?

Попробуйте использовать этот параметр Git, который дает огромную разницу в производительности для общих ресурсов NFS:

git config core.preloadindex true

Цитата из документации, доступной по адресу: https://git-scm.com/docs/git-config#git-config-corepreloadIndex

Это может ускорить такие операции, как git diff и git status, особенно в файловых системах, таких как NFS, которые имеют слабую семантику кэширования и, следовательно, относительно высокие задержки ввода-вывода. Если этот параметр включен, Git будет выполнять сравнение индекса с данными файловой системы параллельно, что позволяет перекрывать операции ввода-вывода. По умолчанию true.

Эта статья содержит несколько полезных советов по настройке производительности NFS.

В частности, использование nfsstat -rc чтобы проверить, сколько было повторных попыток передачи. Если повторных попыток слишком много, значит, nfsd У демона закончились потоки для обслуживания запросов клиентов, и вам необходимо увеличить количество доступных потоков.

Также убедитесь, что ваш экземпляр VirtualBox не имеет тонкой подготовки; хранилище с тонким предоставлением на VirtualBox - это существенный снижение производительности при записи.

В другом ответе уже упоминается проверка статистики NFS.

Возможно, стоит попробовать разные (виртуальные) конфигурации nic для VirtualBox vm - разные виртуальные наборы микросхем и режимы (мостовой режим вместо nat).

Кроме того, если использовался NFSv4, возможно, стоит попробовать NFSv3. Эти версии очень разные, и это может существенно повлиять на производительность.