Вопрос или проблема
На работе у нас есть несколько рабочих мест в компьютерном пуле с пользовательскими домашними каталогами на нашем центральном 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
, может быть следствием нескольких факторов, связанных как с конфигурацией клиентского устройства, так и с сервером.
Возможные причины замедления
-
Перегрузка сети: Если в вашей архитектуре используется общая сеть для всех рабочих станций, возможны задержки при работе из-за высокой нагрузки. Анализ трафика может показать, оптимально ли используется пропускная способность сети.
-
Ошибки конфигурации NFS: Проверьте параметры конфигурации на клиенте и сервере NFS. Параметры, такие как
timeo
,retrans
, иhard
могут существенно влиять на производительность при нестабильной работе сети. -
Проблемы с кэшированием: Если система работает на настройках, которые не оптимальны для кэширования метаданных, это может приводить к высокой нагрузке на сервер NFS и увеличению числа вызовов
test_stateid
. Метаданные должны кэшироваться для снижения числа запросов к серверу. -
Замедление работы диска на сервере NFS: Поврежденные блоки на диске или высокая нагрузка на ввод-вывод могут привести к замедлению работы. Проверьте журналы (например,
dmesg
илиsyslog
) на наличие сообщений об ошибках. -
Проблемы с интерфейсом сети: Из вашего описания видно, что один из клиентов наблюдал зависание процессов. Это может указывать на проблемы с драйверами сетевых интерфейсов или аппаратной частью сетевых карт, особенно если используется Infiniband.
Рекомендации по диагностике и устранению проблем
-
Мониторинг сети: Используйте инструменты мониторинга, например,
iftop
илиnload
, чтобы контролировать нагрузку на сеть. Это поможет определить, возникает ли задержка из-за перегрузки сети. -
Проверка состояния кэша: Оцените использование кэша на клиенте. Это можно сделать с помощью команды
cat /proc/fs/nfsfs/
, чтобы увидеть статистику, связанную с метаданными и кэшами. -
Анализ логов: Следите за журналами (
/var/log/syslog
и/var/log/kern.log
) для выявления ошибок, связанных с NFS. Вызовыtest_stateid
и сообщения об ошибках, подобныеnfs41_handle_sequence_flag_errors
, должны быть исследованы более глубоко. -
Тестирование конфигураций: Попробуйте изменить параметры монтирования, такие как
noac
(отключить кэширование атрибутов). Это может снизить нагрузку на сервер, но может снизить производительность. -
Обновление драйверов и ядра: Убедитесь, что используются последние версии драйверов и ядра, исправляющие известные проблемы совместимости и производительности.
-
Перезагрузка сетевого интерфейса: Как показано в вашем опыте, иногда требуется сбросить сетевой интерфейс и выполнить повторное монтирование NFS для решения проблем с зависанием.
Заключение
Проблема с замедлением NFS является многогранной и требует комплексного подхода к диагностике и устранению. Регулярный мониторинг и оптимизация конфигурации клиента и сервера могут значительно улучшить производительность. Если проблемы остаются нерешенными, возможно, стоит рассмотреть консультацию с экспертами по NFS для более глубокого анализа вашей системы.