Я пытаюсь понять сетевые настройки, связанные с NFS и различными размерами буфера (а их довольно много).
Я запускаю wirehark и проверяю TCP-пакеты, поступающие на сервер NFS. Wireshark показывает максимальный размер пакета 32626 во время расширенной операции записи (клиент-> сервер), предполагая, что я правильно интерпретирую («байты на проводе», которые, как я полагаю, включают все заголовки сетевого уровня и т. Д.)
Параметры NFS «rsize» и «wsize» для экспортированного хранилища установлены на 32k на обоих C / S, поэтому я решил, что приведенные выше результаты были результатом этого параметра. Однако увеличение этих значений НЕ увеличивает размер пакета, отображаемый Wireshark.
Итак, мой вопрос: какие еще ограничения могут быть? Я провел изрядное количество исследований, и до сих пор сталкивался с этим. Мне кажется, что ни одно из сетевых ограничений ниже не ограничивает размер передачи 32 КБ:
Из sysctl:
net.ipv4.tcp_mem = 4096 87380 4194304
net.ipv4.tcp_{r,w}mem = 4096 87380 4194304
net.core.{r,w}mem_max = 131071
net.core.rmem_default = 229376
Мой MTU в настоящее время составляет 8K
Размер NFS {r, w} определяется параметром монтирования клиента и / или возможностями сервера. IOW, вы можете определить их в командной строке, например:
# mount -o rsize=1048576 .....
Клиент Linux имеет разные значения по умолчанию для v3 и v4 - 32k и 1MB. Сервер nfs может запросить меньший или может поддерживать больший размер. Вы должны увидеть это с помощью wirehark в качестве вызова FSINFO для атрибутов файла v3 или FATTR4_MAXREAD / FATTR4_MAXWRITE, которые запрашивались при самом первом вызове GETATTR.
Уровень RPC может разбивать отдельные запросы чтения или записи на несколько фрагментов RPC. Уровень TCP может разбивать один фрагмент RPC на несколько пакетов TCP. С другой стороны, уровень TCP может объединить несколько запросов RPC в один пакет TCP, если они подходят.
Имеется достаточно устаревший документ Оптимизация производительности NFS, но вы получите представление о том, как настроить числа.