При развертывании сервера 1С:Предприятия на операционных системах Linux, таких как Astra Linux, Ubuntu 20.04 или Ubuntu 22.04, пользователи могут столкнуться с проблемой, когда процесс dbda, являющийся компонентом сервера 1С, постоянно запускается и сразу же падает с ошибкой "trap invalid opcode". Эта проблема особенно актуальна для платформ 1С версии 8.3.23.1739 и других релизов из ветки 8.3.23. В этом руководстве мы подробно рассмотрим причины возникновения данной ошибки, а также предложим несколько решений, начиная от временных обходных путей до штатных настроек платформы 1С.
Когда мы запускаем сервер 1С:Предприятия, агент сервера (ragent) инициирует работу различных служебных процессов, одним из которых является dbda. В случае возникновения проблемы, мы можем наблюдать в системных журналах (например, через команду dmesg или в /var/log/syslog) записи, аналогичные следующим:
Oct 28 07:30:02 razrab1 kernel: [2086386.895464] traps: dbda[4079047] trap invalid opcode ip:526710 sp:7ffc0c8c8558 error:0 in dbda[400000+4acb000]
Oct 28 07:30:02 razrab1 kernel: [2086386.900857] traps: dbda[4079052] trap invalid opcode ip:526710 sp:7ffdd26a4308 error:0 in dbda[400000+4acb000]
...
Эти сообщения указывают на "trap invalid opcode", что означает попытку выполнения процессором неизвестной или недопустимой инструкции. В данном контексте, наиболее вероятная причина кроется в том, что исполняемый файл dbda был скомпилирован с использованием современных инструкций процессора, таких как AVX (Advanced Vector Extensions). Если сервер, на котором мы разворачиваем 1С, использует старый процессор или является виртуальной машиной, которая не эмулирует или не предоставляет поддержку этих инструкций, то при попытке их выполнения процесс dbda аварийно завершается.
Хотя сервер 1С, как правило, продолжает функционировать даже с этими ошибками, они засоряют логи, постоянно перезапускают процесс dbda и могут создавать временные файлы в директории /tmp. Нам необходимо избавиться от этих ошибок для стабильной и чистой работы системы.
Прежде чем переходить к штатным методам, мы можем применить быстрое, хотя и временное, решение, чтобы остановить постоянные падения dbda. Это можно сделать, лишив исполняемый файл dbda прав на выполнение. Мы должны помнить, что это не является официальным или рекомендуемым подходом, но может помочь в экстренных ситуациях, когда необходимо быстро стабилизировать работу сервера 1С.
Для этого мы выполним следующую команду в терминале сервера:
chmod -x /opt/1cv8/x86_64/8.3.23.1739/dbda
В этой команде /opt/1cv8/x86_64/8.3.23.1739/dbda представляет собой полный путь к исполняемому файлу dbda. Обратите внимание, что путь может незначительно отличаться в зависимости от версии платформы 1С, которую мы используем. После выполнения этой команды компонент dbda перестанет запускаться. По нашему опыту, в большинстве случаев это не влияет на основную работу 1С, если функциональность Дата акселератора не используется активно.
Наиболее корректным и рекомендованным разработчиками 1С способом решения проблемы с dbda является настройка Требований назначения функциональности (ТНФ) в кластере серверов 1С:Предприятия. Этот механизм позволяет нам гибко управлять тем, какие сервисы и объекты требований будут запускаться на определенных рабочих серверах кластера.
Прежде чем приступить к отключению, давайте разберемся, что такое dbda, или Дата акселератор. Это специализированная СУБД, встроенная в сервер 1С:Предприятия, предназначенная для ускорения выполнения сложных аналитических отчетов. Он работает по принципу In-Memory Data Processing, то есть хранит и обрабатывает данные непосредственно в оперативной памяти компьютера. Дата акселератор оптимизирован для OLAP-запросов и агрегации данных, что позволяет значительно повысить производительность при работе с большими объемами информации.
Для работы Дата акселератора предъявляются строгие требования:
Мы отключаем Дата акселератор, если он не используется в нашей конфигурации 1С, если у нас нет необходимой лицензии КОРП, или если наш сервер не соответствует аппаратным требованиям, что и приводит к ошибке "trap invalid opcode".
Чтобы полностью запретить использование Дата акселератора во всем кластере серверов 1С, нам необходимо выполнить следующие действия. Порядок расположения требований имеет критическое значение, поэтому мы должны строго следовать приведенной последовательности:
Мы открываем консоль администрирования серверов 1С и переходим к настройкам нашего кластера. Здесь мы создадим два требования:
Это требование служит общим разрешением на запуск любых сервисов на данном рабочем сервере. Оно должно быть первым, чтобы обеспечить корректную работу других необходимых служб.
Это требование конкретно запрещает запуск сервиса Дата акселератора. Поскольку оно идет после общего разрешения, оно переопределяет его только для dbda.
На каждом из других рабочих серверов в кластере (если они существуют), мы добавим только одно требование:
Это требование явно запрещает запуск Дата акселератора на этих серверах.
После применения этих настроек, сервер 1С должен перестать пытаться запускать dbda, и ошибки "trap invalid opcode" исчезнут из системных журналов.
В более сложных конфигурациях, когда у нас есть выделенный сервер лицензирования, нам необходимо учесть его при настройке ТНФ. Проблема заключается в том, чтобы корректно совместить запрет на запуск Дата акселератора с уже существующими требованиями для сервиса лицензирования. Давайте рассмотрим типовой сценарий.
Если наш "Рабочий Сервер" является основным для клиентских подключений и обработки данных, но не для лицензирования, его настройка ТНФ будет выглядеть следующим образом. Мы должны обеспечить, чтобы он не запускал сервис лицензирования, но при этом работал со всеми остальными необходимыми службами, исключая Дата акселератор.
Это первое требование позволяет рабочему серверу обрабатывать клиентские подключения к информационным базам.
Это требование явно указывает, что данный сервер не должен обрабатывать запросы на выдачу лицензий.
Это общее разрешение обеспечивает запуск всех остальных необходимых сервисов 1С на этом сервере.
Наконец, мы добавляем конкретный запрет на запуск Дата акселератора, который переопределит общее разрешение для данного сервиса.
На выделенном "Сервере Лицензирования" основная задача — обрабатывать запросы на лицензии. В идеале, dbda там не должен запускаться. Однако, если мы видим в консоли запуск dbda и падения ragent, как это было в сообщениях форума, нам нужно явно запретить его.
Это первое требование предписывает серверу обрабатывать лицензии.
Мы можем использовать это требование для того, чтобы сервер лицензирования не занимался ничем, кроме выдачи лицензий. Однако, если мы видим, что dbda все равно пытается запуститься (как в случае, описанном автором), это может указывать на то, что сервис лицензирования каким-то образом инициирует его или это поведение является не до конца контролируемым.
Если, несмотря на общее "Не назначать", dbda продолжает создавать проблемы, мы можем добавить это требование явным образом. В сообщении 11 автор упоминает, что "Не подходит" с такой конфигурацией, что может указывать на специфические сложности или баги в версиях платформы или специфике развертывания. В таких случаях может потребоваться дополнительный анализ или обновление платформы.
Важно помнить, что в версии 8.3.28 платформы 1С:Предприятие планируется добавить индикацию использования требований назначения функциональности, что значительно упростит диагностику и настройку.
Мы выяснили, что ошибка "trap invalid opcode" в dbda с высокой вероятностью связана с компиляцией программного обеспечения 1С с оптимизациями под набор инструкций AVX (Advanced Vector Extensions), AVX2 или другие, которые отсутствуют на целевом процессоре сервера. Эти инструкции значительно повышают производительность при параллельных вычислениях, но требуют аппаратной поддержки.
Если мы сталкиваемся с такой ошибкой, нам следует проверить характеристики процессора нашего сервера. Мы можем использовать команды, такие как lscpu | grep flags или cat /proc/cpuinfo | grep avx, чтобы убедиться в наличии поддержки AVX. Если AVX отсутствует, это подтверждает нашу гипотезу. В таких случаях, помимо отключения dbda, мы можем рассмотреть следующие варианты:
Для глубокого анализа причин падений сервисов на Linux, включая dbda, нам необходимо активно использовать системные и технологические журналы:
dmesg для сообщений ядра (kernel traps) и syslog или journalctl -xe для общих системных событий, связанных с падением процесса.gdb, для их анализа. Это может дать ценную информацию о стеке вызовов и состоянии программы в момент аварии.DBDA, что позволит нам отслеживать его активность, ошибки и потребление ресурсов.Как мы уже упоминали, Дата акселератор крайне требователен к ресурсам. Недостаток оперативной памяти или низкая производительность процессора могут приводить к ошибкам, даже если AVX поддерживается. Мы должны убедиться, что сервер, на котором планируется работа Дата акселератора, имеет:
Нехватка ресурсов может проявляться ошибками при обновлении копии данных для акселератора или при выполнении запросов, даже если сам сервис не падает с "invalid opcode".
Иногда проблемы, связанные с конкретными версиями платформы 1С, могут быть решены в более новых релизах. Разработчики постоянно выпускают обновления, оптимизирующие код, исправляющие ошибки и добавляющие поддержку для различных аппаратных конфигураций. Если мы столкнулись с проблемой, которая кажется трудноразрешимой, нам следует рассмотреть возможность обновления платформы 1С до последней стабильной версии в рамках нашей ветки или даже переход на более новую ветку, если это приемлемо для нашей конфигурации.
В некоторых случаях, когда мы не можем решить проблемы с dbda на Linux-сервере (например, из-за специфических аппаратных ограничений или сложностей с настройкой ТНФ в комплексной среде), мы можем рассмотреть альтернативный подход: вынос сервиса Дата акселератора на отдельную виртуальную машину. Например, мы можем развернуть его на VM под управлением Windows Server, где у нас может быть больше контроля над аппаратными ресурсами и менее вероятны проблемы с поддержкой инструкций процессора. Это позволит нам изолировать проблему и использовать функциональность Дата акселератора без влияния на основной сервер 1С на Linux.
Выбирая этот подход, мы должны обеспечить достаточный объем ОЗУ и другие необходимые ресурсы на выделенной VM, а также корректно настроить сетевое взаимодействие между серверами.
Таким образом, мы видим, что проблема падения dbda на Linux является решаемой. Нам доступен как временный обходной путь, так и штатное решение через ТНФ, которое является предпочтительным. Выбирая подход, мы должны учитывать специфику нашей инфраструктуры, требования к производительности и лицензированию, а также готовы к детальной диагностике с использованием системных и технологических журналов.