patternsqlModerate
Detecting SQL Server Utilization with a query
Viewed 0 times
sqlwithqueryserverutilizationdetecting
Problem
My current project will send queries to an sql server constantly and It may use 100% of the memory or CPU.
-
How can I check if the server is nearing full utilization in a stored procedure so that I can decide whether to execute the queries or not or save some settings in a table so that the following queries can know the workload is high and decide what to do
-
If not, how can I prevent SQL server to reach full utilization?
More information about the case:
Right now I know our current test server can process 40-50 queries per second (one specific stored procedure). And now we'll decide how many queries are sent to the server every second. If we set the amount even 1 higher than the expected, in the long run, the queries will eventually fill the virtual memory and out client will have to restart their sql server instance periodically.
Expected Results (For bounty hunters):
Any ideas are welcomed. Thanks.
-
How can I check if the server is nearing full utilization in a stored procedure so that I can decide whether to execute the queries or not or save some settings in a table so that the following queries can know the workload is high and decide what to do
-
If not, how can I prevent SQL server to reach full utilization?
More information about the case:
Right now I know our current test server can process 40-50 queries per second (one specific stored procedure). And now we'll decide how many queries are sent to the server every second. If we set the amount even 1 higher than the expected, in the long run, the queries will eventually fill the virtual memory and out client will have to restart their sql server instance periodically.
Expected Results (For bounty hunters):
@memory_usage float, @cpu_usage float; /* in percentage */Any ideas are welcomed. Thanks.
Solution
If you really want to limit SQL Server memory, look at the Maximum server memory option.
Getting memory usage is possible, but it depends on what you really want. Do you want to see memory usage as a percent of the "Maximum server memory" option? If so, look at sys.dm_os_process_memory:
If you want physical memory use vs. total system memory, look in both
I don't think you can get the CPU usage unless you have the Resource Governor enabled. If you do, look at sys.dm_os_performance_counters:
Getting memory usage is possible, but it depends on what you really want. Do you want to see memory usage as a percent of the "Maximum server memory" option? If so, look at sys.dm_os_process_memory:
select convert(float, memory_utilization_percentage) / 100 as memory_usage
from sys.dm_os_process_memoryIf you want physical memory use vs. total system memory, look in both
sys.dm_os_process_memory and sys.dm_os_sys_info:select * from sys.dm_os_sys_info
declare @physicalMemoryInUseKB bigint
declare @totalSystemMemoryBytes bigint
select @physicalMemoryInUseKB = physical_memory_in_use_kb from sys.dm_os_process_memory
select @totalSystemMemoryBytes = physical_memory_in_bytes from sys.dm_os_sys_info
select convert(float, @physicalMemoryInUseKB) * 1024
/ convert(float, @totalSystemMemoryBytes) as memory_usageI don't think you can get the CPU usage unless you have the Resource Governor enabled. If you do, look at sys.dm_os_performance_counters:
select
case CPUUsageBase
when 0 then 0
else convert(float, CPUUsage) / convert(float, CPUUsageBase)
end as 'cpu_usage'
from
(select cntr_value as [CPUUsage]
from sys.dm_os_performance_counters
where counter_name like 'CPU usage%'
and object_name like '%Workload Group Stats%'
and cntr_type = 537003264) Usage
cross join
(select cntr_value as [CPUUsageBase]
from sys.dm_os_performance_counters
where counter_name like 'CPU usage %'
and object_name like '%Workload Group Stats%'
and cntr_type = 1073939712) UsageBaseCode Snippets
select convert(float, memory_utilization_percentage) / 100 as memory_usage
from sys.dm_os_process_memoryselect * from sys.dm_os_sys_info
declare @physicalMemoryInUseKB bigint
declare @totalSystemMemoryBytes bigint
select @physicalMemoryInUseKB = physical_memory_in_use_kb from sys.dm_os_process_memory
select @totalSystemMemoryBytes = physical_memory_in_bytes from sys.dm_os_sys_info
select convert(float, @physicalMemoryInUseKB) * 1024
/ convert(float, @totalSystemMemoryBytes) as memory_usageselect
case CPUUsageBase
when 0 then 0
else convert(float, CPUUsage) / convert(float, CPUUsageBase)
end as 'cpu_usage'
from
(select cntr_value as [CPUUsage]
from sys.dm_os_performance_counters
where counter_name like 'CPU usage%'
and object_name like '%Workload Group Stats%'
and cntr_type = 537003264) Usage
cross join
(select cntr_value as [CPUUsageBase]
from sys.dm_os_performance_counters
where counter_name like 'CPU usage %'
and object_name like '%Workload Group Stats%'
and cntr_type = 1073939712) UsageBaseContext
StackExchange Database Administrators Q#34421, answer score: 11
Revisions (0)
No revisions yet.