Монтирование NFS становится невыносимо медленным со временем при большом количестве вызовов RPC test_stateid.

Вопрос или проблема

На работе у нас есть несколько рабочих мест в компьютерном пуле с пользовательскими домашними каталогами на нашем центральном NAS, подключенными через NFS. Мы сталкиваемся с проблемой, что доступ к файлам на этих ресурсах иногда становится невыносимо медленным спустя некоторое время (часы, дни и т.д.). Перезагрузка клиентской машины решает проблему. Мы не смогли понять, что вызывает это, но наблюдали следующее, используя наше netdata мониторинг.

введите описание изображения здесь

Похоже, что происходит большое количество вызовов test_stateid. Также есть процесс ядра с загрузкой ЦП 100 % (на одном ядре).

Для сравнения, вот как выглядит ситуация на машине, где NFS еще отзывчив:

введите описание изображения здесь

Мы также наблюдали, что после размонтирования тома (umount -l) количество вызовов test_stateid увеличивается еще больше (с ~ 300/сек до ~ 3000/сек).

Мы также наблюдаем тысячи таких записей в журналах ядра:

Дек 04 10:40:22 myhost01 kernel: nfs41_handle_sequence_flag_errors: "redacted.example.org" (client ID 5709396434020000) flags=0x00000040
Дек 04 10:40:22 myhost01 kernel: --> nfs4_alloc_slot used_slots=0001 highest_used=0 max_slots=10
Дек 04 10:40:22 myhost01 kernel: <-- nfs4_alloc_slot used_slots=0003 highest_used=1 slotid=1
Дек 04 10:40:22 myhost01 kernel: nfs4_free_slot: slotid 1 highest_used_slotid 0
Дек 04 10:40:22 myhost01 kernel: nfs41_sequence_process: Error 0 free the slot 
Дек 04 10:40:22 myhost01 kernel: nfs4_free_slot: slotid 0 highest_used_slotid 4294967295
Дек 04 10:40:22 myhost01 kernel: --> nfs4_alloc_slot used_slots=0000 highest_used=4294967295 max_slots=10
Дек 04 10:40:22 myhost01 kernel: <-- nfs4_alloc_slot used_slots=0001 highest_used=0 slotid=0
Дек 04 10:40:22 myhost01 kernel: encode_sequence: sessionid=1681459543:564:96:0 seqid=176335892 slotid=0 max_slotid=0 cache_this=1
Дек 04 10:40:22 myhost01 kernel: decode_attr_type: type=00
Дек 04 10:40:22 myhost01 kernel: decode_attr_change: change attribute=108
Дек 04 10:40:22 myhost01 kernel: decode_attr_size: file size=149204
Дек 04 10:40:22 myhost01 kernel: decode_attr_fsid: fsid=(0x0/0x0)
Дек 04 10:40:22 myhost01 kernel: decode_attr_fileid: fileid=0
Дек 04 10:40:22 myhost01 kernel: decode_attr_fs_locations: fs_locations done, error = 0
Дек 04 10:40:22 myhost01 kernel: decode_attr_mode: file mode=00
Дек 04 10:40:22 myhost01 kernel: decode_attr_nlink: nlink=1
Дек 04 10:40:22 myhost01 kernel: decode_attr_rdev: rdev=(0x0:0x0)
Дек 04 10:40:22 myhost01 kernel: decode_attr_space_used: space used=0
Дек 04 10:40:22 myhost01 kernel: decode_attr_time_access: atime=0
Дек 04 10:40:22 myhost01 kernel: decode_attr_time_metadata: ctime=1700570570
Дек 04 10:40:22 myhost01 kernel: decode_attr_time_modify: mtime=1700570570
Дек 04 10:40:22 myhost01 kernel: decode_attr_mounted_on_fileid: fileid=0
Дек 04 10:40:22 myhost01 kernel: decode_getfattr_attrs: xdr returned 0
Дек 04 10:40:22 myhost01 kernel: decode_getfattr_generic: xdr returned 0

Какие-либо идеи о том, как дальше отладить это?

Рабочие станции на Ubuntu 22.04 с ядром 6.2.0-37-generic.

Я получал подобные ошибки, в результате чего много процессов зависло в не прерываемом состоянии сна в ожидании ввода-вывода на диске или состоянии D от моего nfs сервера. Я мог читать каталоги, размонтировать/монтировать (с таким же увеличением вызовов test_stateid), но любой доступ к файлам вызывал зависание.

Я нашел процесс ядра, который продолжал работать с момента первоначальной проблемы с монтированием nfs. Я подтвердил время начала с помощью:

ps -o etime= -p pid

Мне нужно было сбросить сетевой интерфейс (в моем случае интерфейс infiniband) и перемонтировать. Это очистило висячий процесс ядра [192.168.0.1-man] и ошибки nfs41_handle_sequence_flag_errors: и NFS call test_stateid 00000000X0b2f606. Я использовал rpcdebug -m nfs -s all для проверки сообщений отладки ядра и rpcdebug -m nfs -c all для остановки.

Ответ или решение

Причины замедления работы NFS и высокая частота вызовов test_stateid

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

Возможные причины замедления

  1. Перегрузка сети: Если в вашей архитектуре используется общая сеть для всех рабочих станций, возможны задержки при работе из-за высокой нагрузки. Анализ трафика может показать, оптимально ли используется пропускная способность сети.

  2. Ошибки конфигурации NFS: Проверьте параметры конфигурации на клиенте и сервере NFS. Параметры, такие как timeo, retrans, и hard могут существенно влиять на производительность при нестабильной работе сети.

  3. Проблемы с кэшированием: Если система работает на настройках, которые не оптимальны для кэширования метаданных, это может приводить к высокой нагрузке на сервер NFS и увеличению числа вызовов test_stateid. Метаданные должны кэшироваться для снижения числа запросов к серверу.

  4. Замедление работы диска на сервере NFS: Поврежденные блоки на диске или высокая нагрузка на ввод-вывод могут привести к замедлению работы. Проверьте журналы (например, dmesg или syslog) на наличие сообщений об ошибках.

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

Рекомендации по диагностике и устранению проблем

  1. Мониторинг сети: Используйте инструменты мониторинга, например, iftop или nload, чтобы контролировать нагрузку на сеть. Это поможет определить, возникает ли задержка из-за перегрузки сети.

  2. Проверка состояния кэша: Оцените использование кэша на клиенте. Это можно сделать с помощью команды cat /proc/fs/nfsfs/, чтобы увидеть статистику, связанную с метаданными и кэшами.

  3. Анализ логов: Следите за журналами (/var/log/syslog и /var/log/kern.log) для выявления ошибок, связанных с NFS. Вызовы test_stateid и сообщения об ошибках, подобные nfs41_handle_sequence_flag_errors, должны быть исследованы более глубоко.

  4. Тестирование конфигураций: Попробуйте изменить параметры монтирования, такие как noac (отключить кэширование атрибутов). Это может снизить нагрузку на сервер, но может снизить производительность.

  5. Обновление драйверов и ядра: Убедитесь, что используются последние версии драйверов и ядра, исправляющие известные проблемы совместимости и производительности.

  6. Перезагрузка сетевого интерфейса: Как показано в вашем опыте, иногда требуется сбросить сетевой интерфейс и выполнить повторное монтирование NFS для решения проблем с зависанием.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...