Что делать, если база MSSQL начала внезапно тормозить и появляется ошибка Buffer Latch Timeout?

Системный администратор 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Ситуация, когда стабильно работающая годами система внезапно начинает «тормозить» без видимых изменений в коде или конфигурации, — это классический сценарий инфраструктурного сбоя. Особенно остро это ощущается в облачных средах, где ресурсы распределены между множеством клиентов. Разберем пошагово, как диагностировать причины резкого падения производительности MSSQL, что означает ошибка Buffer Latch Timeout и как правильно настроить обслуживание крупных баз данных 1С (от 250 ГБ до 1 ТБ).

Выясняем причину: почему «тормозит» диск в облаке

Проанализируем симптомы: загрузка процессоров на сервере MSSQL и 1С низкая (до 30%), память не перегружена, но любая операция (даже простой скроллинг журнала) занимает длительное время. В логах MSSQL при этом может возникать ошибка «A time-out occurred while waiting for buffer latch type 4».

Рассмотрим, что это означает технически. SQL Server использует механизмы кратковременных блокировок (latches) для синхронизации доступа к страницам данных в буферном пуле (оперативной памяти). Если сервер хочет прочитать страницу с диска или записать её, но дисковая подсистема не отвечает в течение долгого времени (обычно порог составляет 15–20 секунд), возникает тайм-аут. Это прямой индикатор того, что проблема кроется в дисковой подсистеме, а не в «кривом» коде или нехватке процессора.

В облачных решениях это часто связано с «ребилдом» (пересборкой) RAID-массива на стороне провайдера после выхода из строя одного или нескольких накопителей. В этот момент показатель IOPS (количество операций ввода-вывода в секунду) падает, а задержка (Latency) вырастает с нормальных 10–20 мс до критических 200–500 мс.

Как самостоятельно проверить производительность дисков

Чтобы предметно разговаривать с техподдержкой облачного провайдера, проанализируем ситуацию с помощью системных мониторов. Воспользуемся встроенным инструментом Windows — Performance Monitor (PerfMon). Нам интересны следующие показатели:

  1. Physical Disk \ Avg. Disk sec/Read — среднее время чтения данных.
  2. Physical Disk \ Avg. Disk sec/Write — среднее время записи данных.

Значения выше 0.020 (20 мс) считаются плохими для систем 1С, значения выше 0.050 (50 мс) — критическими. Если вы видите цифры 0.100 и выше, значит, дисковый массив не справляется с нагрузкой, и это является первопричиной всех «тормозов» базы.

Также полезно выполнить SQL-запрос для анализа типов ожиданий (Wait Stats). Это покажет, чего именно ждет сервер:


SELECT wait_type, wait_time_ms, signal_wait_time_ms, wait_time_ms - signal_wait_time_ms AS resource_wait_time_ms
FROM sys.dm_os_wait_stats
WHERE wait_type IN ('PAGEIOLATCH_SH', 'PAGEIOLATCH_EX', 'WRITELOG')
ORDER BY wait_time_ms DESC;

Наличие в топе ожиданий типов PAGEIOLATCH_SH (ожидание чтения страницы с диска) подтверждает проблемы с оборудованием или дисковым массивом.

Настройка регламентного обслуживания крупных баз (250–750 ГБ)

Когда инфраструктурная проблема будет решена провайдером, важно убедиться, что сама база данных находится в оптимальном состоянии. Для баз объемом в сотни гигабайт и количеством пользователей более 500 человек стандартные «Планы обслуживания» через визуальный конструктор SQL Management Studio работают неэффективно.

Рассмотрим лучший мировой стандарт для этих целей — бесплатные скрипты Олы Халленгрена (Ola Hallengren). Они позволяют реализовать «умное» обслуживание:

Посмотрим на пример команды для запуска обслуживания индексов через SQL Agent:


EXECUTE dbo.IndexOptimize
@Databases = 'USER_DATABASES',
@FragmentationLow = NULL,
@FragmentationMedium = 'INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationHigh = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationLevel1 = 5,
@FragmentationLevel2 = 30,
@UpdateStatistics = 'ALL',
@OnlyModifiedStatistics = 'Y'

Критические настройки MSSQL Server для работы с 1С

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

  1. Max Degree of Parallelism (MAXDOP): Для систем 1С крайне не рекомендуется оставлять это значение равным 0 (использование всех ядер для одного тяжелого запроса). Это может привести к тому, что один неоптимальный отчет «завесит» всю базу. Установите значение 1 (параллелизм выключен) или, для мощных многоядерных систем, от 2 до 4.
  2. Max Server Memory: SQL Server по умолчанию забирает всю доступную память. В облаке, где ОС тоже требуются ресурсы для работы с виртуальными дисками, это может привести к «свопингу» (сбросу памяти на диск). Если на сервере 128 ГБ ОЗУ, ограничьте MSSQL на уровне 110–115 ГБ.
  3. Lock Pages in Memory: Обязательно предоставьте учетной записи, под которой запущен MSSQL, право в групповых политиках Windows (secpol.msc) на «Закрепление страниц в памяти». Это защитит буферный пул SQL от вымывания операционной системой при нехватке ресурсов.
  4. Настройка TempDB: Это «черновик» базы данных, через который проходит огромное количество операций 1С. Разделите TempDB на несколько файлов (равных количеству логических ядер процессора, но не более 8). Сделайте их одинакового фиксированного размера с достаточным запасом.

Что делать, если база ушла в режим In Recovery

Проанализируем ситуацию, когда после сбоя или перезагрузки база данных долго висит в статусе In Recovery. Это происходит потому, что в момент зависания или жесткого сброса сервера выполнялась крупная транзакция (например, бэкап или закрытие месяца), и теперь MSSQL производит откат (Undo) незафиксированных данных или накат (Redo) подтвержденных.

Важное правило: никогда не пытайтесь прервать этот процесс или перевести базу в EMERGENCY без крайней необходимости. Вмешательство в процесс Recovery может привести к потере целостности данных. Если база объемом 750 ГБ долго восстанавливается, значит, объем незавершенных транзакций был велик. Чтобы этого избежать в будущем, настройте бэкап журналов транзакций (Transaction Log) каждые 15–30 минут — это минимизирует объем данных, которые системе придется обрабатывать при восстановлении.

Сетевые нюансы в облачной инфраструктуре

Выясним, как взаимодействуют сервер 1С и сервер MSSQL. Если они разнесены по разным виртуальным машинам (как в рассматриваемом случае), убедитесь, что между ними настроена сеть со скоростью 10 Гбит/с. 1С генерирует очень интенсивный трафик между сервером приложений и базой данных. Любые задержки в виртуальной сети будут восприниматься пользователями как «тормоза» интерфейса.

Если же сервер приложений 1С и SQL установлены на одной машине, проанализируйте строку подключения в консоли администрирования 1С. Использование протокола Shared Memory вместо TCP/IP может дать прирост производительности на операциях обмена данными до 15% за счет исключения сетевого стека из цепочки передачи данных.

Подводя итог: при внезапных замедлениях в облаке первым делом проверяйте Latency дисков. Если показатели в норме — переходите к анализу статистики ожиданий MSSQL и проверке регламентных заданий обслуживания индексов.

← На главную