Решение проблем
Для поиска ошибок рекомендуется временно повысить уровень логирования:
В конфигурационном файле измените значение log-level на debug.
Перезагрузите сервис одним из способов:
systemctl reload storage-csd@${cs_id}или
kill -SIGHUP $pid
Типичные проблемы можно условно разделить на несколько классов.
Падение сервиса (crash, assertion failure, etc)
При падении сервиса обычно остаются кордампы и логи сервиса /var/log/storage/cs.{CS_ID}/*.zst. Иногда подсистема логирования не может или не успевает записать буфер на диск, тогда в логе будут отсутствовать последние строки. В таком случае, стоит проверить stdout файл в той же директории.
При падении сервиса:
Проанализируйте coredump стандартными средствами.
Установите пакет storage-csd-dbg той же версии, что и дамп.
Для анализа бэктрейса выполните:
cat backtrace.txt | seastar/scripts/seastar-addr2line -e /usr/bin/csd
Ошибка сервиса
CS может вернуть ошибку клиентской библиотеки или MDS, это будет отражено в логах. Если ошибка признана критической, CS может получить статус failed.
При ошибке клиентской библиотеки:
Найдите момент возникновения ошибки в логах.
Для поиска записей по чанку используйте подстроку {0xa4c}, где A4C — id чанка в hex. Не все строки следуют данному форматированию, но это позволит получить первое приближение.
Пример логирования входящих и завершенных запросов:
INFO 2024-03-12 16:36:21.611558 csd0 - [0000000000000022;53e3f] WriteReq f:0xd {0x5} (0x208000+0x6000x2) sn: 2 2 frags: [ca..]# расшифровка:# INFO - важность сообщения# локальное время записи# csd0 - логгер сервис, в данном случае общий логгер csd# 0000000000000022 - UID источника запроса в hex, в старших битах кодируется тип (08 в начале означает libsbd клиента)# 53e3f - UID запроса в hex, монотонно возрастает для каждого исходящего запроса у каждого источника (сбрасывается при рестарте)# WriteReq - тип запроса# 0xd - флаги запроса в hex# {0x5} - UID чанка# далее идут поля специфичные для конкретного типа# 0x208000 - смещение записи в чанке# 0x6000 - длина записи# х2 - запись должна быть повторена 2 раза (WRITE_SAME семантика)# sn: 2 - внутренний порядковый номер записи, может быть 0 (не назначен)# 2 frags: [ca..] - сколько фрагментов содержит буфер записи и первый байт запроса в hexDEBUG 2024-03-12 16:36:21.612449 csd0 - [0000000000000022;53e3f] WriteReq success (lat=886us, local)# реквест [22;53e3f] завершился успешно за 886 микросекунд, локально (Write запрос также может включать в себя фазу пересылки данных на другие CS в чанк группе и их ожидание, в таком случае задержка будет указана "with fwd")INFO 2024-03-12 16:36:22.173607 csd0 - [080000000000042c;53faf] ReadReq f:0x1 {0x5} vol 1 (0x7000+0x4000)# аналогично, реквест 53faf от клиента 42c с флагом 1 в чанк 0x5, в volumeid 1, по смещению 0x7000 размером 0x4000DEBUG 2024-03-12 16:36:22.173927 csd0 - [080000000000042c;53faf] ReadReq success (lat=317us, local)# завершился успехом за 317 микросекунд
Таймауты
При потере сетевой связности сервер может быть временно переведен в статус offline.
Если сервис не получает ответ от других сервисов, в логах будут отражены соответствующие ошибки:
ERR_TIMEOUT = 9; // Request was timeoutedERR_NET = 20; // Miscellaneous network errorERR_NET_CLOSED = 21; // RPC call aborted due to closed connection
Если сервис не получает ответа от соседних CS, он выведет сообщения вида:
host 1.2.3.4 is unreachable # где 1.2.3.4 - IP адрес недоступного сервиса
После восстановления связи:
host 1.2.3.4 is reachable again # где 1.2.3.4 - IP адрес недоступного сервиса
Проверьте наличие строк с keepalive. Они могут свидетельствовать о закрытии соединения по таймауту.
Таймауты могут быть следствием перегрузки сервиса. При этом:
Исследуйте метрики в Grafana:
Загрузка CPU;
Количество и latency запросов;
Нетипичная активность (например, высокая скорость recovery).
Найдите аномальную активность и устраните проблему.
- Падение сервиса (crash, assertion failure, etc)
- Ошибка сервиса
- Таймауты