Рейтинг:1

Kerberized NFS4 занимает 5 секунд, чтобы открыть файл

флаг fr

Я установил сервер NFSv4 и клиент под управлением Debian 11.3 в Linux 5.10.0-13. В основном это работает, т. Е. Я вижу все файлы с правильными разрешениями и могу открывать, изменять и т. Д. Однако открытие файла вызывает 5-секундную задержку.

Сервер экспортирует такие каталоги в /etc/экспорт:

/путь/к gss/krb5(rw,sync,fsid=0,crossmnt,no_subtree_check)
/path/to/NFS gss/krb5(rw,sync,no_subtree_check)

Экспорт NFS4 монтируется с использованием этого типа /etc/fstab вход:

сервер:/NFS/путь/к/nfs nfs4 по умолчанию,авто,sec=krb5,proto=tcp,port=2049,nolock 0 3

Следующие данные относятся к открытию файла в емакс и закрыть емакс как только появится.

Анализ стрейс Я вижу, что соответствующий открыть() системный вызов занимает вполне стабильно 5,1 секунды! Другой openat(), stat(), ... системные вызовы, относящиеся к NFS, выполняются в течение микросекунд. Это то, что я постоянно вижу, когда делаю, например. лс, который ничем не отличается от локальной файловой системы. Это выдержка из системных вызовов, относящихся к рассматриваемому файлу, с добавлением времени, затраченного на системный вызов:

0.000014 openat(AT_FDCWD, "/path/to/nfs/file", O_RDONLY|O_CLOEXEC|O_PATH|O_DIRECTORY) = -1 ENOTDIR (Ist kein Verzeichnis)
0.000005 readlinkat(AT_FDCWD, "/path/to/nfs/file", 0x7fff202f6880, 1024) = -1 EINVAL (Аргумент не указан)
0.000006 openat(AT_FDCWD, "/path/to/nfs/file", O_RDONLY|O_NOFOLLOW|O_CLOEXEC|O_PATH) = 14
0.000005 readlinkat(AT_FDCWD, "/path/to/nfs/file", 0x7fff202f64d0, 1024) = -1 EINVAL (Аргумент не указан)
0.000005 openat(AT_FDCWD, "/path/to/nfs/file", O_RDONLY|O_NOFOLLOW|O_CLOEXEC|O_PATH) = 14
5.108682 openat(AT_FDCWD, "/path/to/nfs/file", O_RDONLY|O_CLOEXEC) = 14
0.000006 faccessat(AT_FDCWD, "/path/to/nfs/file", W_OK) = 0
0.000005 stat("/path/to/nfs/file", {st_mode=S_IFREG|0640, st_size=2192, ...}) = 0
0.000007 faccessat(AT_FDCWD, "/path/to/nfs/file,v", F_OK) = -1 ENOENT (Datei oder Verzeichnis nicht gefunden)
0.000009 openat(AT_FDCWD, "/path/to/nfs/file", O_RDONLY|O_CLOEXEC|O_PATH|O_DIRECTORY) = -1 ENOTDIR (Ist kein Verzeichnis)
0.000008 openat(AT_FDCWD, "/path/to/nfs/file", O_RDONLY|O_CLOEXEC|O_PATH|O_DIRECTORY) = -1 ENOTDIR (Ist kein Verzeichnis)
0.000008 openat(AT_FDCWD, "/path/to/nfs/file", O_RDONLY|O_CLOEXEC|O_PATH|O_DIRECTORY) = -1 ENOTDIR (Ist kein Verzeichnis)
0.000008 openat(AT_FDCWD, "/path/to/nfs/file", O_RDONLY|O_CLOEXEC|O_PATH|O_DIRECTORY) = -1 ENOTDIR (Ist kein Verzeichnis)
0.000008 openat(AT_FDCWD, "/path/to/nfs/file", O_RDONLY|O_CLOEXEC|O_PATH|O_DIRECTORY) = -1 ENOTDIR (Ist kein Verzeichnis)
0.000012 stat("/path/to/nfs/file", {st_mode=S_IFREG|0640, st_size=2192, ...}) = 0
0.000015 запись(14, "/путь/к/nfs/файлу"..., 90) = 90 

В wirehark вижу следующее:

№ Время Источник Назначение Длина протокола Информация
7 0.623097 client.ip server.ip Вызов NFS 276 V4 (ответ в 8) GETATTR FH: 0xecf8d891
8 0.624231 server.ip client.ip Ответ NFS 376 V4 (вызов 7) GETATTR
9 0.624239 client.ip server.ip TCP 72 951 – 2049 [ACK] Seq=601 Ack=917 Win=4176 Len=0 TSval=1071244404 TSecr=3950562910
10 0.624696 client.ip server.ip Вызов NFS 344 V4 (ответ в 11) OPEN DH: 0xecf8d891/
11 0.625669 server.ip client.ip Ответ NFS 452 V4 (вызов 10) OPEN StateID: 0xb42f
12 0.625693 client.ip server.ip TCP 72 951 – 2049 [ACK] Seq=873 Ack=1297 Win=4176 Len=0 TSval=1071244405 TSecr=3950562911
13 5.742166 client.ip server.ip Вызов NFS 340 V4 (ответ в 14) CLOSE StateID: 0xb42f
14 5.743331 server.ip client.ip Ответ NFS 232 V4 (вызов 13) ПОСЛЕДОВАТЕЛЬНОСТЬ | Статус PUTFH: NFS4ERR_STALE
15 5.743359 client.ip server.ip TCP 72 951 – 2049 [ACK] Seq=1141 Ack=1457 Win=4176 Len=0 TSval=1071249523 TSecr=3950568029

не знаю, то ли это NFS4ERR_STALE условие является намеком на проблему. Согласно RFC7530 это указывает на то, что объект файловой системы был удален. Ну и файл в задержке открыть() точно не удаляется. Итак, я не уверен, к чему это относится. Однако он также показывает задержку в 5,1 секунды между 12 и 13.

Должен признаться, что я не совсем понимаю, что я здесь вижу. Однако я наблюдаю такие же задержки и с другими программами, т.е. это не причуда емакс. Сохранение в либреофис может даже зависнуть, пока к файлу не обратится другая программа.

Поскольку я где-то видел, что есть проблемы с крб5п в некоторых средах я уменьшил до крб5, но это ничего не изменило.

И клиент, и сервер работают gssproxy. На клиенте я вижу отладочные записи нфсидмап, а после настройки sysctl sunrpc.rpc_debug = 0xFFFF Я вижу следующее для емакс сценарий:

[423544.865600] RPC: gss_get_mic_v2
[423544.865628] RPC: xs_tcp_send_request(200) = 0
[423544.867049] RPC: xs_data_ready...
[423544.867309] RPC: gss_verify_mic_v2
[423545.373665] RPC: gss_get_mic_v2
[423545.373691] RPC: xs_tcp_send_request(200) = 0
[423545.374692] RPC: xs_data_ready...
[423545.374748] RPC: gss_verify_mic_v2
[423545.375009] RPC: gss_get_mic_v2
[423545.375025] RPC: xs_tcp_send_request(268) = 0
[423545.375909] RPC: xs_data_ready...
[423545.375957] RPC: gss_verify_mic_v2
[423550.467227] RPC: gss_get_mic_v2
[423550.467307] RPC: xs_tcp_send_request(216) = 0
[423550.468395] RPC: xs_data_ready...
[423550.468513] RPC: gss_verify_mic_v2
[423550.468621] RPC: gss_get_mic_v2
[423550.468646] RPC: gss_get_mic_v2
[423550.468689] RPC: xs_tcp_send_request(264) = 0
[423550.469403] RPC: xs_data_ready...
[423550.469541] RPC: gss_verify_mic_v2
[423550.469564] RPC: gss_verify_mic_v2
[423550.472794] RPC: gss_get_mic_v2
[423550.472849] RPC: xs_tcp_send_request(208) = 0
[423550.473758] RPC: xs_data_ready...
[423550.473903] RPC: gss_verify_mic_v2
[423550.474234] RPC: gss_get_mic_v2
[423550.474290] RPC: xs_tcp_send_request(200) = 0
[423550.475147] RPC: xs_data_ready...
[423550.475257] RPC: gss_verify_mic_v2

Я понятия не имею, как именно интерпретировать этот лог, но он также четко показывает 5-секундную задержку, и мне кажется, что все вызовы RPC обрабатываются в течение 100 мс.

Любые идеи, что происходит, или, по крайней мере, как еще больше определить проблему?

user1686 avatar
флаг fr
Регистрирует ли что-нибудь клиентский файл rpc.gssd в режиме отладки? Регистрирует ли что-нибудь gssproxy сервера (или rpc.svcgssd, в зависимости от того, что использует Debian 11)? Если вы запустите `sysctl sunrpc.rpc_debug=0xFFFF` на клиенте, начнет ли ядро ​​что-либо регистрировать в dmesg? В вашем файле экспорта используется устаревший синтаксис; `*(sec=krb5:krb5i:krb5p,rw)` - это обычный способ записи.
флаг fr
Спасибо @ user1686 за вашу помощь. Я еще не переписывал синтаксис экспорта сервера. Однако из отладочной информации RPC я подозреваю проблему на стороне клиента, и я понятия не имею, что это должно быть.
user1686 avatar
флаг fr
Запускается ли клиент rpc.gssd? gssproxy заменяет только rpc.svcgssd на стороне сервера, но не полностью заменяет rpc.gssd на клиентах.
флаг fr
Да, клиент запускает rpc.gssd.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.