Phát hiện sử dụng máy chủ SQL bằng truy vấn


7

Dự án hiện tại của tôi sẽ liên tục gửi truy vấn đến máy chủ sql và nó có thể sử dụng 100% bộ nhớ hoặc CPU.

  • Làm cách nào tôi có thể kiểm tra xem máy chủ có gần sử dụng hết trong quy trình được lưu trữ hay không để tôi có thể quyết định có thực hiện truy vấn hay không hoặc lưu một số cài đặt trong bảng để các truy vấn sau có thể biết khối lượng công việc cao và quyết định làm gì

  • Nếu không, làm cách nào tôi có thể ngăn máy chủ SQL đạt được mức sử dụng đầy đủ?

Thông tin thêm về trường hợp: Ngay bây giờ tôi biết máy chủ thử nghiệm hiện tại của chúng tôi có thể xử lý 40-50 truy vấn mỗi giây (một quy trình được lưu trữ cụ thể). Và bây giờ chúng tôi sẽ quyết định có bao nhiêu truy vấn được gửi đến máy chủ mỗi giây. Nếu chúng ta đặt số lượng thậm chí cao hơn 1 so với dự kiến, về lâu dài, các truy vấn cuối cùng sẽ lấp đầy bộ nhớ ảo và máy khách sẽ phải khởi động lại phiên bản máy chủ sql của chúng theo định kỳ.

Kết quả dự kiến ​​(Đối với thợ săn tiền thưởng):

@memory_usage float, @cpu_usage float; /* in percentage */

Bất kỳ ý tưởng đều được hoan nghênh. Cảm ơn.


4
Phiên bản và phiên bản nào của SQL Server, vui lòng?
Jon Seigel

@JonSeigel 2008+
Uğur Gümüşhan

3
Điều đó không trả lời câu hỏi phiên bản. Resource Governor chỉ là Phiên bản doanh nghiệp.
Martin Smith

1
Phần này của câu hỏi của bạn có vẻ là một sự hiểu lầm hoàn toàn. "Nếu chúng tôi đặt số tiền thậm chí cao hơn 1 so với dự kiến, về lâu dài, các truy vấn cuối cùng sẽ lấp đầy bộ nhớ ảo và khách hàng sẽ phải khởi động lại phiên bản máy chủ sql của họ theo định kỳ." Nếu bạn không muốn SQL Server sử dụng nhiều hơn X bộ nhớ, chỉ cần đặt bộ nhớ máy chủ tối đa.
Martin Smith

Câu trả lời:


11

Nếu bạn thực sự muốn giới hạn bộ nhớ Máy chủ SQL, hãy xem tùy chọn Bộ nhớ máy chủ tối đa .

Có thể sử dụng bộ nhớ, nhưng nó phụ thuộc vào những gì bạn thực sự muốn. Bạn có muốn xem mức sử dụng bộ nhớ dưới dạng phần trăm của tùy chọn "Bộ nhớ máy chủ tối đa" không? Nếu vậy, hãy xem sys.dm_os_ process_memory :

select convert(float, memory_utilization_percentage) / 100 as memory_usage
from sys.dm_os_process_memory

Nếu bạn muốn sử dụng bộ nhớ vật lý so với tổng bộ nhớ hệ thống, hãy xem cả hai sys.dm_os_process_memorysys.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_usage

Tôi không nghĩ bạn có thể sử dụng CPU trừ khi bạn bật Resource Governor . Nếu bạn làm như vậy, hãy xem 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) UsageBase

5

DMV cung cấp cả thông tin sử dụng cpu và bộ nhớ. Các truy vấn này yêu cầu quyền VIEW_SERVER_STATE để chạy.

DECLARE @memory_usage FLOAT
    , @cpu_usage FLOAT

SET @memory_usage = ( SELECT    1.0 - ( available_physical_memory_kb / ( total_physical_memory_kb * 1.0 ) ) memory_usage
                        FROM      sys.dm_os_sys_memory
                    )

SET @cpu_usage = ( SELECT TOP ( 1 )
                            [CPU] / 100.0 AS [CPU_usage]
                    FROM     ( SELECT    record.value('(./Record/@id)[1]', 'int') AS record_id
                                        , record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 'int') AS [CPU]
                                FROM      ( SELECT    [timestamp]
                                                    , CONVERT(XML, record) AS [record]
                                            FROM      sys.dm_os_ring_buffers WITH ( NOLOCK )
                                            WHERE     ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR'
                                                    AND record LIKE N'%<SystemHealth>%'
                                        ) AS x
                            ) AS y
                    ORDER BY record_id DESC
                    )


SELECT  @memory_usage [memory_usage]
        , @cpu_usage [cpu_usage]

không trả lại sử dụng cpu. có ý kiến ​​gì không
Uur Gümüşhan

@StrayCatDBA Việc sử dụng CPU trong bộ đệm vòng là một phép đo riêng biệt (tức là ngay bây giờ) hoặc trung bình kể từ lần đo cuối cùng (tức là trong X giây cuối cùng)?
Paul Williams

Hiểu biết của tôi là nó rời rạc.
StrayCatDBA

đối với việc sử dụng cpu, nó dường như cung cấp một giá trị trung bình mỗi phút đầy đủ của phút cuối
greg121

4

Trong một thủ tục lưu trữ? Bạn sẽ không thể ngay khi truy vấn khiến CPU đạt 100% kết thúc, bạn không thể theo dõi số liệu đó nữa, điều này sẽ được thực hiện bởi truy vấn tiếp theo trong quy trình được lưu trữ.

Nếu bạn đang sử dụng SQL Server 2008 trở lên (và Phiên bản doanh nghiệp), bạn có thể sử dụng bộ điều chỉnh tài nguyên để đảm bảo rằng các quy trình khác có nguồn CPU và bộ nhớ có sẵn cho chúng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.