Sumulacja obciążenia CPU na serwerze SQL

Czasami dla testów potrzebujemy wykonać wymuszone obciążenie procesora. Poniżej przedstawię prosty sposób aby nasze wykresy obciążenia CPU powędrowały pod sufit.

Na początek tworzymy procedurę składowaną dbo._keep_it_100 np. w bazie master

CREATE OR ALTER PROCEDURE dbo._keep_it_100
AS
BEGIN

WITH e1(n) AS
(
SELECT NULL UNION ALL SELECT NULL UNION ALL SELECT NULL UNION ALL
SELECT NULL UNION ALL SELECT NULL UNION ALL SELECT NULL UNION ALL
SELECT NULL UNION ALL SELECT NULL UNION ALL SELECT NULL UNION ALL
SELECT NULL UNION ALL SELECT NULL UNION ALL SELECT NULL UNION ALL
SELECT NULL UNION ALL SELECT NULL UNION ALL SELECT NULL UNION ALL
SELECT NULL UNION ALL SELECT NULL UNION ALL SELECT NULL UNION ALL
SELECT NULL UNION ALL SELECT NULL UNION ALL SELECT NULL UNION ALL
SELECT NULL UNION ALL SELECT NULL UNION ALL SELECT NULL UNION ALL
SELECT NULL UNION ALL SELECT NULL UNION ALL SELECT NULL UNION ALL
SELECT NULL UNION ALL SELECT NULL UNION ALL SELECT NULL
),
e2(n) AS (SELECT TOP 2147483647 NEWID() FROM e1 a, e1 b, e1 c, e1 d, e1 e, e1 f, e1 g, e1 h, e1 i, e1 j)
SELECT MAX(ca.n)
FROM e2
CROSS APPLY
(
SELECT TOP 2147483647 *
FROM (
SELECT TOP 2147483647 *
FROM e2
UNION ALL SELECT * FROM e2
UNION ALL SELECT * FROM e2
UNION ALL SELECT * FROM e2
UNION ALL SELECT * FROM e2
UNION ALL SELECT * FROM e2
UNION ALL SELECT * FROM e2
UNION ALL SELECT * FROM e2
UNION ALL SELECT * FROM e2
UNION ALL SELECT * FROM e2
UNION ALL SELECT * FROM e2
UNION ALL SELECT * FROM e2
) AS x
WHERE x.n = e2.n
ORDER BY x.n
) AS ca
OPTION(MAXDOP 0, LOOP JOIN, QUERYTRACEON 8649);

END;

Commands completed successfully.

Następnie uruchamiamy procedurę

exec dbo._keep_it_100

Obciążenie procesora wzrasta do 100% do czasu kiedy nie zatrzymamy działania naszej procedury.

W naszym serwerze posiadamy 4 CPU i wszystkie cztery są obciążone na 100%. Możemy zmienić konfigurację i do pracy „zatrudnić” tylko dwa z nich. Możemy to zmienić w właściwościach instancji SQL:

lub wydając polecenie

ALTER SERVER CONFIGURATION SET PROCESS AFFINITY CPU = 1,3
GO

Jeśli wydamy to w trakcie działania naszej procedury dwa procesory zostaną wyłączone z SQL-a.

Na koniec zatrzymujemy naszą procedurę i ją usuwamy oraz zmieniamy opcję procesorów na AUTO.

USE [master]
GO
DROP PROCEDURE [dbo].[_keep_it_100]
GO
ALTER SERVER CONFIGURATION SET PROCESS AFFINITY CPU = AUTO
GO

Commands completed successfully.

Poniżej przestawiam jeszcze inne możliwe zapytania obciążające na 100% CPU.


USE master

SELECT MyInt = CONVERT(BIGINT, o1.object_id) + CONVERT(BIGINT, o2.object_id) + CONVERT(BIGINT, o3.object_id)
INTO #temp
FROM sys.objects o1
JOIN sys.objects o2 ON o1.object_id < o2.object_id JOIN sys.objects o3 ON o1.object_id < o3.object_id SELECT SUM(CONVERT(BIGINT, o1.MyInt) + CONVERT(BIGINT, o2.MyInt)) FROM #temp o1 JOIN #temp o2 ON o1.MyInt < o2.MyInt DROP TABLE #temp

Obciążenie CPU na czas 30 sekund


DECLARE @T DATETIME, @F BIGINT;
SET @T = GETDATE();
WHILE DATEADD(SECOND,30,@T)>GETDATE()
SET @F=POWER(2,30);

Ten wpis został opublikowany w kategorii Microsoft SQL. Dodaj zakładkę do bezpośredniego odnośnika.

Dodaj komentarz