Мы заняты нагрузочным тестированием OLTP-системы, разработанной нами в .NET 4.0, и запускаем SQL Server 2008 R2 в задней части. Система использует очереди SQL Server Service Broker, которые очень производительны, но при обработке мы наблюдаем особую тенденцию.
SQL Server обрабатывает запросы с высокой скоростью в течение 1 минуты, после чего увеличивается ~ 20 секунд активности записи на диск. Следующий график иллюстрирует проблему.
Yellow = Transactions per second
Blue = Total CPU usage
Red = Sqlsrv Disk Write Bytes/s
Green = Sqlsrv Disk Read Bytes/s
Во время устранения неполадок мы попробовали следующее без каких-либо существенных изменений в шаблоне:
- Остановлен агент SQL Server.
- Убил практически все остальные запущенные процессы (без A / V, SSMS, VS, Windows Explorer и т. Д.)
- Удалены все остальные базы данных.
- Отключены все таймеры разговоров (мы не используем триггеры).
- Отошел от подхода, управляемого очередью сообщений, к простой / грубой схеме мониторинга таблиц.
- Используются разные нагрузки от легких до тяжелых.
- Исправлены все тупики.
Кажется, что SQL Server может создавать свой кэш и записывать его на диск через определенные промежутки времени, но я не могу найти ничего в Интернете, чтобы поддержать эту теорию.
Затем я планирую перенести решение в нашу специальную среду тестирования, чтобы посмотреть, смогу ли я воспроизвести проблему. Любая помощь в промежуточный период будет принята с благодарностью.
Обновление 1 В соответствии с запросом приведен график, включающий число контрольных точек страниц / сек , продолжительность жизни страниц и некоторые счетчики задержки диска.
Похоже, что контрольная точка (голубая линия) является причиной снижения производительности (желтая линия), которую мы наблюдаем.
Задержка диска остается относительно постоянной во время обработки, и ожидаемый срок службы страницы не оказывает заметного влияния. Мы также скорректировали количество оперативной памяти, доступной для SQL Server, что также не имело большого эффекта. Изменение модели восстановления с SIMPLE
на FULL
также мало что изменило.
Обновление 2 Изменив «Интервал восстановления» следующим образом, нам удалось сократить интервал, через который возникают контрольные точки:
EXEC sp_configure 'show advanced options',1
GO
RECONFIGURE
GO
EXEC sp_configure 'recovery interval', '30'
GO
RECONFIGURE
GO
EXEC sp_configure 'show advanced options',0
GO
RECONFIGURE
Я не уверен, что это плохая практика, хотя?
FULL
или BULK_LOGGED
, она все равно SIMPLE
будет вести себя так, как если бы она находилась до полного резервного копирования.