Очереди и проверка хранилища в dcm4chee-arc: как понять, что архив на самом деле здоров

«PACS работает» — фраза, за которой скрываются три совершенно разных утверждения. Порт архива отвечает. Исследования принимаются. Данные действительно лежат там, где считает база, а накопленные задачи выполняются, а не копятся. Мониторинг доступности подтверждает только первое. Две самые тихие аварии PACS он не видит вообще: остановившаяся очередь экспорта и потерянные объекты в хранилище.

Обе обнаруживаются не в момент возникновения, а через недели — когда выясняется, что во второй архив ничего не уходило с мая, или когда исследование не открывается, хотя в списке оно есть. Статья о двух механизмах, которые позволяют увидеть это вовремя: очередях задач архива и проверке хранилища (Storage Verification). Это третья часть разбора прикладной эксплуатации dcm4chee-arc — после удаления исследований и слияния пациентов и исправления атрибутов.

Часть 1. Очереди и задачи архива

Значительная часть работы архива выполняется не в момент обращения, а отложенно, задачами. Пришло исследование — задача на экспорт во второй архив. Настроена проверка хранилища — задача на верификацию. Запрошены данные из внешнего архива — задача на получение. Такая архитектура нужна, чтобы медленный или недоступный получатель не блокировал приём данных от модальности. Обратная сторона: если задачи перестали выполняться, приём продолжает работать, и внешне всё выглядит нормально.

В интерфейсе архива задачи разложены по вкладкам страницы Monitoring: Queues, Export, External Retrieve, Diff, Storage Verification. Это первое место, куда администратор смотрит, когда что-то «не доехало».

Состояния задачи

Задача проходит через понятный набор состояний, и различать их важнее, чем кажется:

Состояние Что означает Реакция администратора
Scheduled Задача поставлена в очередь и ждёт выполнения Нормально, если очередь движется. Тревожно, если число только растёт
In process Задача выполняется сейчас Насторожиться, если задача «выполняется» сутками: обычно это след падения узла
Completed Выполнена успешно Ничего. Такие задачи должны автоматически убираться из базы
Warning Выполнена, но не полностью — например, часть объектов не принята получателем Разобрать обязательно: это не «почти успех», а частичная потеря результата
Failed Не выполнена, попытки исчерпаны Найти причину. Перезапуск без устранения причины даст то же самое
Canceled Отменена вручную Убедиться, что отмена зафиксирована в журнале с причиной

Отдельно про Warning. Это состояние регулярно проскакивают мимо: задача же не упала. На практике за ним стоит ровно то, о чём потом спрашивают через месяц: половина серий ушла во второй архив, половина — нет.

Типовые картины и что за ними стоит

Что видно в Monitoring Вероятная причина Что делать
Очередь экспорта монотонно растёт, задачи уходят в failed Получатель недоступен, изменился его адрес или порт, не зарегистрирован AE Title Проверить связь с получателем (C-ECHO), сверить конфигурацию exporter, и только потом перепланировать задачи
Задачи висят в in process и не двигаются Узел архива был перезапущен или упал во время выполнения Перепланировать задачи; в кластере — при необходимости на другой узел
Много задач в warning Получатель принимает не все объекты: несовместимый transfer syntax, отказ по отдельным SOP Class, нехватка места на приёмнике Разобрать один случай до конца по логам обеих сторон, затем исправлять причину, а не задачи
Очередь пустая, но исследования во второй архив не уходят Правило экспорта не срабатывает: условия не совпадают с данными Проверить условия правила на конкретном исследовании, а не искать неисправность в очередях
База данных архива непривычно растёт, хотя исследований столько же Не настроена автоочистка выполненных задач Настроить удаление отработанных сообщений очередей

Главная ошибка в работе с очередями — массовое «перепланировать всё» до того, как понята причина. Задачи уйдут в работу, снова упадут и вернутся в том же количестве, зато будет потеряна картина: какие именно задачи падали и с какими ошибками.

Отмена и перепланирование

Архив позволяет отменять задачи и планировать их заново — как по одной, так и выборкой. В кластере перепланирование поддерживает указание целевого узла: запрос принимается одним узлом и выполняется тем, который указан параметром, а при его отсутствии задача перепланируется на том же устройстве. Для этого узлы должны быть описаны конфигурацией сетевых соединений и веб-приложений со служебным классом DCM4CHEE_ARC.

Порядок работы, который стоит закрепить в собственном runbook:

    1. Зафиксировать состояние: сколько задач, в каких состояниях, с какого времени, с какими сообщениями об ошибке. Скриншот или выгрузка — до любых действий.
    2. Взять одну упавшую задачу и разобрать её до конца: что за операция, какой получатель, что в логах архива и в логах получателя.
    3. Устранить причину.
    4. Перепланировать одну задачу и убедиться, что она прошла.
    5. Только теперь перепланировать остальные.
    6. Записать в журнал: сколько задач, почему падали, что исправлено, сколько прошло после исправления.

Гигиена: автоочистка отработанных задач

Записи о задачах хранятся в базе данных архива. Если их не удалять, база растёт, а страница Monitoring со временем становится нечитаемой. Удаление настраивается отдельно для каждого состояния — и это удобно: выполненные можно убирать быстро, а упавшие держать долго, чтобы было что разбирать.

Атрибут Что задаёт
dcmPurgeQueueMessagePollingInterval Как часто запускается очистка. Пока не задан, очистка не работает
dcmPurgeQueueMessageCompletedDelay Через какое время удалять успешно выполненные задачи
dcmPurgeQueueMessageWarningDelay То же для задач со статусом warning
dcmPurgeQueueMessageFailedDelay То же для упавших задач
dcmPurgeQueueMessageCanceledDelay То же для отменённых
Интервалы и задержки задаются в формате ISO-8601: PT1H — час, P1D — сутки, P30D — тридцать суток.

Разумная отправная точка: выполненные — через сутки, warning и failed — через две-четыре недели. Держать упавшие задачи неделями стоит именно потому, что заявка «а почему в июне не выгрузилось» приходит в июле.

Часть 2. Storage Verification: проверка хранилища

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

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

Уровни проверки и их цена

Проверять можно с разной глубиной, и это главный выбор при настройке. Логика уровней такая:

Что проверяется Цена Что поймает и что пропустит
Существование объекта в хранилище — OBJECT_EXISTS Дёшево: только обращение к метаданным файловой системы Поймает пропавшие файлы и неподключённое хранилище. Пропустит повреждённое содержимое
Совпадение контрольной суммы — OBJECT_CHECKSUM, значение по умолчанию Дорого: каждый объект читается целиком Поймает и пропажу, и порчу содержимого. Создаёт заметную нагрузку на диск и сеть
Набор доступных политик зависит от версии архива — точный список смотрите в интерфейсе и документации своей версии.

Про цену стоит сказать прямее. Проверка по контрольной сумме означает чтение всего проверяемого объёма. Для архива в единицы терабайт на локальных дисках это вопрос планирования; для хранилища на NFS или для nearline-уровня это может означать многочасовую нагрузку на сеть и заметное замедление обычной работы. Поэтому у механизма есть и расписание, и ограничители.

Настройки

Настраивается на уровне устройства архива и Archive AE. Основные атрибуты:

Атрибут Что задаёт
dcmStorageVerificationPollingInterval Как часто планировщик берётся за работу. Не задан — проверка не выполняется вовсе
dcmStorageVerificationInitialDelay Отсрочка первой проверки после поступления данных: свежие объекты проверять сразу смысла мало
dcmStorageVerificationPeriod Периодичность повторной проверки уже проверенных объектов
dcmStorageVerificationSchedule Окно, в которое разрешено выполнять проверку — например, только ночью
dcmStorageVerificationMaxScheduled Предел одновременно запланированных задач: защита от того, чтобы проверка не вытеснила обычную работу
dcmStorageVerificationFetchSize Размер порции, которую планировщик берёт за раз
dcmStorageVerificationPolicy Глубина проверки, по умолчанию OBJECT_CHECKSUM
dcmStorageVerificationStorageID Какие хранилища проверять
dcmStorageVerificationAETitle От имени какого AE выполняется проверка
dcmStorageVerificationUpdateLocationStatus Обновлять ли статус расположения объекта по результату проверки
dcmStorageVerificationBatchID Идентификатор пакета для группировки задач в Monitoring

Запускать проверку вручную для отдельных исследований можно из интерфейса архива: страница Studies, меню дополнительных функций, пункт проверки хранилища. Наблюдать за выполнением — на странице Monitoring, вкладка Storage Verification. Отдельно инициировать подтверждение хранения через DIMSE или REST для этого не требуется: планировщик делает всё сам.

Как читать результат

Расхождение — это сигнал, а не приговор. Прежде чем говорить о потере данных, проверьте более прозаические причины, расположенные в порядке убывания частоты:

    1. Хранилище не смонтировано. Классика: сервер перезагрузился, NFS-ресурс не подключился, каталог на месте, но пустой. Проверяется первым делом.
    2. Права доступа. Процесс архива перестал читать каталог после смены владельца или обновления.
    3. Объекты перемещены вручную. Кто-то переносил данные между дисками, не используя средства архива.
    4. Незавершённая операция удаления. Записи удалены, файлы ещё нет, или наоборот — смотрите разбор двух стадий удаления в первой части.
    5. Аппаратная проблема. Сбойные секторы, деградировавший массив, отказывающий контроллер. Смотрите SMART и состояние RAID.
    6. Реальная потеря объектов. Вывод, к которому приходят последним, а не первым.

Чего при расхождении делать нельзя категорически: удалять записи из базы, «чтобы расхождений не было». Это не устранение проблемы, а уничтожение единственного свидетельства о том, что объекты когда-то существовали. Пока запись есть, известно, что именно потеряно, и остаётся шанс найти копию — во втором хранилище, в nearline, во внешнем архиве, куда исследование выгружалось, или в резервной копии.

Правильная последовательность: зафиксировать перечень расхождений с идентификаторами → проверить монтирование и права → проверить состояние дисков и массива → искать копию → эскалировать с полным перечнем. И только по решению ответственного — что-либо менять в записях.

Чем не является страница Metrics

У архива есть встроенные показатели производительности: скорости чтения и записи в хранилище, время удаления объектов, скорости передачи внешним получателям, число одновременных ассоциаций от модальностей и к удалённым системам, время обновления базы данных. Смотрят их на странице Monitoring, вкладка Metrics, настраивают в расширении устройства архива.

Важное ограничение, которое стоит знать до того, как вы начнёте на них опираться: эти показатели не хранятся в базе данных. Они существуют только пока сервер запущен, по умолчанию удерживаются около часа и теряются при перезапуске и при изменении конфигурации.

Отсюда практический вывод: встроенные показатели хороши для разбора «что происходит прямо сейчас» — упала скорость выгрузки, выросло число ассоциаций. Для истории, трендов и прогноза заполнения нужна внешняя система мониторинга, которая собирает и хранит данные у себя. Встроенные метрики её не заменяют.

Что проверять регулярно

Оба механизма бесполезны, если в них никто не смотрит. Минимальный регламент, который имеет смысл превратить в скрипт и в привычку:

Периодичность Что смотреть
Ежедневно Свободное место и inode на всех хранилищах. Число задач в failed и warning по каждой вкладке Monitoring. Есть ли задачи, висящие в in process дольше суток. Результат последнего прогона проверки хранилища
Еженедельно Динамика: очередь растёт или движется. Рост базы данных и хранилища. Состояние RAID и SMART. Сроки сертификатов и CRL
Ежемесячно Полный обзор расхождений проверки хранилища. Прогноз заполнения и остаток ёмкости. Контрольное восстановление по ротационному графику. Проверка, что автоочистка задач работает и база не пухнет

Ключевая мысль: наблюдать нужно за динамикой, а не за абсолютным числом. Сто задач в очереди — норма, если через час их десять, и авария, если вчера их было пятьдесят. Поэтому в ежедневной проверке полезно фиксировать числа, а не просто смотреть на них.

Чек-лист «архив действительно здоров»

    • DICOM-порт отвечает на проверку связи, web-интерфейс открывается.
    • Тестовое исследование принимается, находится поиском и открывается во вьювере.
    • Все настроенные хранилища смонтированы и доступны на запись.
    • Свободного места и inode достаточно с запасом до следующей проверки.
    • Очереди движутся: число задач в failed не растёт, нет задач, зависших в in process.
    • Задачи в состоянии warning разобраны, а не просто присутствуют.
    • Проверка хранилища выполняется по расписанию, и известно, когда был последний успешный прогон.
    • Расхождения проверки либо отсутствуют, либо по каждому есть объяснение и решение.
    • Автоочистка отработанных задач настроена, база не растёт без причины.
    • Последняя резервная копия выполнена успешно, и это проверено, а не предполагается.

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

Частые ошибки

    • Считать, что «сервис отвечает» равно «архив здоров». Порт может отвечать при неподключённом хранилище и вставшей очереди.
    • Перепланировать все упавшие задачи разом, не разобрав ни одной. Причина не устранится, а картина сотрётся.
    • Игнорировать статус warning. За ним стоит частичная передача данных.
    • Оставить проверку хранилища на значениях по умолчанию, не задав окно и ограничители. Проверка по контрольной сумме способна сама создать инцидент, заняв диск и сеть в рабочее время.
    • Никогда не включить проверку вообще. Тогда о расхождении вы узнаёте от врача, которому исследование нужно сейчас.
    • Удалять записи о ненайденных объектах. Это уничтожение свидетельства, а не решение проблемы.
    • Не настроить автоочистку задач. База растёт, интерфейс перестаёт быть пригодным для диагностики.
    • Полагаться на встроенные показатели как на историю. Они живут только до перезапуска.


Итог

Доступность архива и его исправность — разные вещи. Очереди показывают, выполняет ли архив отложенную работу; проверка хранилища — соответствуют ли файлы тому, что записано в базе. Обе аварии тихие: приём данных продолжается, порт отвечает, мониторинг молчит.

Минимум, который стоит сделать один раз и потом поддерживать: включить проверку хранилища с разумным окном и ограничителями, настроить автоочистку отработанных задач, добавить в ежедневный обход число задач в failed и warning и дату последнего успешного прогона проверки. Это несколько строк в скрипте и одна привычка, которая избавляет от вопроса «почему во второй архив ничего не уходило три месяца».

Источники

    • dcm4chee-arc wiki: Metrics — встроенные показатели производительности и их ограничения.
    • Export Rule и DICOM Exporter — настройка экспорта, задачи которого чаще всего и появляются в очередях.

Названия настроек, состав политик проверки и вкладок интерфейса приведены по актуальной на момент написания ветке dcm4chee-arc 5.35.x. В более старых инсталляциях они отличаются — сверяйтесь с документацией и интерфейсом своей версии.

Прокрутить вверх