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);