В диспетчере задач видно, что MS SQL сервер постоянно грузит процессор на 30%. Причём памяти потребляет немного — около 150-300 МБ.
Идей чем он занят нет. Перезапуск сервиса помогает минуты на 3-4, далее опять аномальная загрузка процессора.
Помогите определить причину этого и исправить её.
Конфигурация:
Windows Server 2012 R2 Standard x64
Intel Core 2Duo 3.0
4Gb memory
MS SQL 2016 RTM
Re: MS SQL как исправить проблему с постоянной загрузкой CPU?
Здравствуйте, #John, Вы писали:
J>Здравствуйте, push, Вы писали:
P>>Помогите определить причину этого и исправить её. J>Надо запустить SQL Server Profiler и посмотреть, какие запросы нагружают сервак.
Я отключил SQL Agent. Запустил профайлер и вижу, что всё время повторяется один и тот же запрос от .NET SqlClient Data Provider:
exec sp_reset_connection
-- network protocol: LPC
set quoted_identifier on
set arithabort off
set numeric_roundabort off
set ansi_warnings on
set ansi_padding on
set ansi_nulls on
set concat_null_yields_null on
set cursor_close_on_commit off
set implicit_transactions off
set language русский
set dateformat dmy
set datefirst 1
set transaction isolation level read committed
exec prc_QueryNotifications @lastEventId=1638
Поиск в сети по поводу того, что происходит ничего не дал.
Здравствуйте, push, Вы писали:
P>Я отключил SQL Agent. Запустил профайлер и вижу, что всё время повторяется один и тот же запрос от .NET SqlClient Data Provider:
P>...
P>Поиск в сети по поводу того, что происходит ничего не дал.
В профайлер можно увидеть БД (DatabaseID, DatabaseName), на которой выполняется запрос. Попробуйте определить БД и посмотреть содержимое ХП prc_QueryNotifications.
Re: MS SQL как исправить проблему с постоянной загрузкой CPU?
Здравствуйте, Olaf, Вы писали:
O>В профайлер можно увидеть БД (DatabaseID, DatabaseName), на которой выполняется запрос. Попробуйте определить БД и посмотреть содержимое ХП prc_QueryNotifications.
Так, сделал свой шаблон профилирования и увидел, что постоянно идут запросы на базу Tfs_Configuration. Так, значит проблема в TFS. Ок, теперь осталось понять как пофиксить аномальную загрузку ЦП. Хорошо, TFS на данный момент никто не пользуется — с чего же там такая активность?
Из профилирования видно, что объектами запроса являются QDS base transaction, prc_QueryNotifications, dbo.func_GetEventClassFromSequence, sp_reset_connection, QDS batch.
Нашёл prc_QueryNotifications:
USE [Tfs_Configuration]
GO
/****** Object: StoredProcedure [dbo].[prc_QueryNotifications] Script Date: 25.09.2016 21:07:57 ******/SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/******************************************************************************************************
** Warning: the contents of this stored procedure are critical to its functioning.
** Modifying the contents of this stored procedure could result in data corruption, performance issues,
** or other bugs in your Team Foundation Server deployment.
** DO NOT MODIFY IT.
******************************************************************************************************/
-- Hash: 6E9896E717BA0A0A813D8CAFE08F71AF1C1E7D16ALTER PROCEDURE [dbo].[prc_QueryNotifications]
@lastEventId BIGINT,
@maxEvents INT = 10000
AS
SET NOCOUNT ON
SET XACT_ABORT ON
SELECT TOP (@maxEvents)
EventClass,
EventId,
EventData,
EventAuthor,
HostId
FROM tbl_NotificationQueue WITH (READCOMMITTEDLOCK) -- We need to use shared locks so we do not skip over uncommitted notificationsWHERE EventId > @lastEventId
ORDER BY EventId ASC-- we currently deliver global events to all hosts in the db, this is ok
-- since we only allow it at the configdb, so there is only 1 host.SELECT dbo.func_GetEventClassFromSequence(s.name) AS EventClass,
CONVERT(BIGINT, s.current_value) AS EventId,
CONVERT(NVARCHAR(MAX), NULL) AS EventData,
CONVERT(UNIQUEIDENTIFIER, NULL) AS EventAuthor,
CONVERT(UNIQUEIDENTIFIER, NULL) AS HostId
FROM sys.sequences s
WHERE s.name LIKE N'Sequence[_]GN[_]%'
Как-то ничего криминального вроде нет.
Куда дальше копать?
Re[2]: MS SQL как исправить проблему с постоянной загрузкой CPU?
Здравствуйте, push, Вы писали:
P>В диспетчере задач видно, что MS SQL сервер постоянно грузит процессор на 30%. Причём памяти потребляет немного — около 150-300 МБ. P>Идей чем он занят нет.
Ты не поверишь, он обрабатывает данные, выполняет запросы !
И это вообще нормально.
При старте без запросов он может ещё некоторое время выполнять database recovery -- это такой специальный процесс,
который физически восстанавливает структуру данных базы данных.
Здравствуйте, akasoft, Вы писали:
A>Попробуй задать на сервере Максимальную степень параллеризма == 1.
Так 1 как раз наоборот, приводит к использованию одного процессора и отключению параллелизма как такового. Для эксплуатации максимального количества процессоров необходимо установить 0 (по умолчанию).
Re[3]: MS SQL как исправить проблему с постоянной загрузкой CPU?
Здравствуйте, Olaf, Вы писали:
O>Так 1 как раз наоборот, приводит к использованию одного процессора и отключению параллелизма как такового. Для эксплуатации максимального количества процессоров необходимо установить 0 (по умолчанию).
Неожиданно, правда? Тем не менее, знаю случаи, когда это решило проблему загрузки и отзывчивости ПО.
Полагаю, это оттого, что писатели тормозящих программ либо вообще не отлаживали своё произведение, либо отлаживали его на усечённых SQL Express с ограничением на 1 процессор.