× К оглавлению На главную Об авторе

   Дата и время публикации:

Проблемы и решение

1. Суть проблемы

Заключалась в больших задержках и подвисании NFS соединения, создаваемого гостевой ОС для доступа к дисковому пространству центральной машины, и купировалась мной командами tracepath и nmon, которые нужно было до установить, как показано в дампе 1.1

Дамп 1.1

# apt search iputils-tracepath nmop

При этом, ранее, мной были сделаны соответствующие установки во время настройки сети для NFS-cоединений. Поэтому на стороне хозяйского узла с ip: 192.168.2.2 с использованием tracepath тестировалось прохождение пакетов [3.1] до гостевой ОС ip: 192.168.2.125, как показано в дампе 1.2

Дамп 1.2

root@home2:~# tracepath -b -l 65535 -4 192.168.2.125
 1?: [LOCALHOST]                      pmtu 1500
 1:  192.168.2.125 (192.168.2.125)                         0.474ms reached
 1:  192.168.2.125 (192.168.2.125)                         0.511ms reached
     Resume: pmtu 1500 hops 1 back 1 

И обратно, прохождение пакетов с гостевой ОС (ip:192.168.2.125) на хозяйский узел (ip:192.168.2.2) как показано в дампе 1.3

Дамп 1.3


root@debian9-univ:~# tracepath -b -l 65535 -4 192.168.2.2
 1?: [LOCALHOST]                      pmtu 1500
 1:  gateway (192.168.2.2)                                 0.487ms reached
 1:  gateway (192.168.2.2)                                 0.422ms reached
     Resume: pmtu 1500 hops 1 back 1 

Результат тестирования прямого и обратного канала передачи данных показали практически идентичные результаты и достаточно высокую скорость прохождения маршрута от гостевой ОС (ip: 192.168.2.125) до хозяйского узла (ip: 192.168.2.0) локальной сети с ip:192.168.2.0/24 виртуальной среды эмулятора Qemu/KVM

Далее, мной была проведена проверка сетевой утилитой nmon, который позволяет получать статистику использования сервиса NFS, как это видится с точки зрения клиента или сервера для нахождение узких мест. Результат применения которого показана на рисунке 1.4

Рисунок 1.4

Рисунок 1.4

Как показано на рисунке 1.4, сетевой утилитой nmon можно получить общую статистику обращения к системным вызовам в секунду, наибольшее же число можно получить, например, при компиляции пакета программного обеспечения, например openssh, которая была достигнута за счет оптимизации NFS, как пороизводить которую расскажу ниже.

2. Решение

В виду полученных достаточно высоких показателей быстродействия самой сети, но не достаточно больших для NFS, провел оптимизацию с использованием следующих опций на стороне клиента, таких как rsize, wsize, nolock, nointr и actimeo с timeo

2.1 Опции rsize и wsize

Указываются на стороне клиента либо непосредственно в команде mount после опции -o или в fstab, как показано в дампе 2.1

Дамп 1.3


192.168.2.2:/path/to/server	/path/to/client/directory	nfs	vers=3,hard,nointr,rsize=31457280,wsize=31457280,nolock,tcp,user,exec,noauto,sync,actimeo=1,timeo=10	0	0

Опции rsize и wsize были установлены 30МБ или 31457280 байт, потому что по умолчанию, начиная ядра с версий 2.4-2.6, они устанавливаются равными не больше чем 32КБайта [3.4], что конечно не так много и существенно влияет на быстродействие.

2.2 Опции nolock

При установке данной опции блокировка файлов производится только в пределах одного и того же клиента, потому что эта опция запрещает использовать NLM протокол, который в свою очередь вносит свои задержки.

2.3 Опции nointr

Хотя данная опция устанавливается по умолчанию,но полезно это делать явно, чтобы точно знать, что сигналы не будут прерывать выполнение файловых операций.

2.4 Опции actimeo или timeo

Как уже писал ранее, когда баловался более предметно с этими опциям, что actimeo=n на стороне клиента, который устанавливает в одно и тоже положение сразу несколько опций отвечающих за своевременное кэширование атрибутов директорий и файлов.

Поэтому мной была установлена рассматриваемые опции: actimeo=1, timeo=10 . Последнюю нужно указывать обязательно больше нуля, а лучше равной 10-ть по 100-миллисекунд промежутоков времени ожидания.

2.5 Почему применять опцию async на стороне сервера небезопасно

Эта опция несет с собой не только проблемы в безопасности, но так же возможность потери данных [3.4]. Также нужно учитывать, то версию протокола через опции монтирования nfsvers, ее альтернатива vers и minorversion(только для протокола версии 4) , как было показано в дампе 2.1.1

Так, при использовании протокола NFSv2

клиент считает, что он работает с устойчивым и стабильным хранилищем данных на стороне сервер. Поэтому любой отказ на стороне которого приводит неминуемо к потери данных из того, что буфера с записанными данными уже очищены. Поэтому, как показано в дампе 2.5.1, следующая экспортная запись в файле /etc/exports будет небезопасна.

Дамп 2.5.1


/path/to/server/directory 192.168.2.0/24(rw,async,insecure,no_root_squash,no_subtree_check)

Так же клиент/серверное соединение, созданное по протоколу NFSv2 не обладает какими-либо знаниями когда и какие данные были переданы, поэтому в этой версии протокола данные записываются прежде чем сервере даст ответ клиенту.

Поэтому при любом малейшем сбое в работе сервера , даже если клиент все еще хранит модифицированные данные в своем КЭШе, данные на стороне сервера больше не соответствуют тем что клиент записал в свой КЭШ Поэтому скорее всего в будущем данные будут кэшироваться на стороне клиента из угрозы повреждения передаваемых файлов.

При использовании протокола версий протокола NFSv3

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

В итоге, нужно позаботится, что все экспортные записи в файле были /etc/exports использовали опцию "sync", которая лучше явно указывать даже несмотря, что все современные дистрибутивы используют пакет nfs-utils версии 1.0.1 и выше, как показано в дампе 2.5.2

Дамп 2.5.2


/path/to/server/directory 192.168.2.0/24(rw,sync, wdelay, insecure,no_root_squash,no_subtree_check)

Как показано в дампе 2.5.2, для повышения быстродействия также мной была задействована опция wdelay [3.6], которая вносит задержку записи полученных от клиента данных на диск, если сервером ожидаются какие-либо подобные запросы от клиента.

Для отключения времени ожидания, устанавливаемое опцией wdelay на получения запросов по записи, следует указывать опцию no_wdelay, которая доступна только, когда указана опция sync

Кроме того,

Соответственно, наличие описанных выше проблем опции secure, root_squash и subtree_check только приводят ухудшению быстродействия с минимально возможным повышения быстродействия. Кроме того, учитывая характер использования клиент/серверного соединения NFS в вычислительной сети с IP=192.168.2.0/24, которая находится внутри безопасного периметра и недоступного субъектам внешнего доступа, вместо них необходимо использовать insecure, no_root_squash и no_subtree_check, как это собственно и делается в дампе 2.5.2

2.6 Применение экспортных опций и их проверка

После внесения всех изменений в файл /etc/exports на серверной стороне и в файл /etc/fstab была проведена проверка с использованием утилиты nmon и запуском на гостевой ОС исполнительной части bitbake сборочной машины Yocto/poky

Поэтому до начала проверки был выполнен перезапуск:

После чего, запустил пресборку пакета openssh и приступил к оценке, быстродействия с использованием утилиты nmon , которая выявила необходимость использования "опасной" опции async вместо sync в купе со всеми остальными и вышеприведенными в файле /etc/exports на стороне сервера, как показано в листинге 2.6.1

Листинге 2.6.1

...
/path/to/server/directory 192.168.2.0/24(rw,async,wdelay,insecure,no_root_squash,no_subtree_check)
...

Оценка быстродействия производилась визуально, как было показано на рисунке 1.1 выше. В ходе, который было выявлено, что использование опции sync на стороне клиента, /etc/fstab, как показано в листинге 2.6.1 файла /etc/fstab, позволяет сохранить надежность передачи информации с достаточно приемлемым уровнем быстродействия

А вот опция async на стороне сервера не влияет на качество сохраняемой информации, но при определенных условиях снижает быстродействие соединения NFS

3. Библиография

3.1 Tracepath: Article about Tracepath by The Free Dictionary

3.2 nmon Command - IBM Documentation

3.3 NFS performance tuning - Real-time monitoring - Programmer Sought

3.4 Linux NFS faq

3.6 Red Hat's Docs. Chapter 4. Exporting NFS shares Red Hat Enterprise Linux 8 | Red Hat Customer Portal

3.7 exports(5) - Linux man page

3.8 Setting up reserved (privileged) ports - IBM Documentation

3.9 Create a root-squashing rule for the default NFS export

3.10 Using nfsstat and nfsiostat to troubleshoot NFS performance issues on Linux

3.11 Performance testing of nmon monitoring of linux server