Ми зайняті тестуванням навантаження 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
поки ви не зробите повну резервну копію.