Sử dụng CPU cao trên máy chủ SQL - Truy vấn chậm [đóng]


11

MS SQL Server của chúng tôi đang sử dụng khoảng 95% năng lượng CPU.

Sau khi máy chủ (phần cứng) khởi động lại hoặc khởi động lại dịch vụ SQL, mức sử dụng là 0% và tăng chậm trong vòng 1-3 ngày. Tùy thuộc vào mức độ nó được sử dụng.

Khi nó trên 80%, mọi truy vấn đều cực kỳ chậm.

Trang web của chúng tôi đang xử lý rất nhiều truy vấn lớn, vì vậy một số trong số chúng mất 45-60 giây. Sau khi khởi động lại (mức sử dụng CPU dưới 80%), phải mất 11-20 giây cho cùng một Truy vấn.


Làm thế nào tôi có thể sửa lỗi này? Tôi đã đọc trực tuyến rằng mặt nạ ái lực có thể điều chỉnh mức sử dụng CPU, nhưng cài đặt ái lực bị tắt. Tôi không thể thay đổi chúng. Đây có phải là vì tôi chỉ có 1 bộ xử lý?

Có rất nhiều thủ thuật để thực hiện với các truy vấn, nhưng các trang web và dịch vụ của chúng tôi khá lớn và đơn giản là có quá nhiều thứ để thay đổi.

Hầu hết trong số họ đã được tối ưu hóa khá tốt.


Tôi không thể tiếp tục khởi động lại Dịch vụ SQL, mặc dù chỉ mất 2 giây, vì chúng tôi có dịch vụ báo thức cho phép mọi người gọi và ghi lại tin nhắn, một nhóm được chọn sau đó sẽ được gọi và nghe tin nhắn đã ghi.

Hệ thống này được sử dụng bởi hàng trăm đội Tìm kiếm và Cứu nạn và nếu Dịch vụ SQL khởi động lại trong khi có báo động, nó sẽ chấm dứt và người gọi nó vào sẽ không được thông báo.


Tôi đã tìm kiếm khắp nơi, nhưng không tìm thấy gì ngoại trừ những thứ về "Mặt nạ ái lực", thứ mà tôi không thể thay đổi.

Phải có một cách để xóa bộ đệm CPU, mà không chấm dứt các truy vấn hiện tại ... phải không?


SQL: Microsoft SQL Server 11.0.2100.60
OS: Windows Server 2012 x64
Processor: 2.30 GHz
RAM: 4.00 GB

Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Paul White 9

Câu trả lời:


7

Đây là một cú sút xa, nhưng bạn có thể muốn xem qua cài đặt tham số bắt buộc của mình. Nếu bạn đang thấy một số lượng lớn các gói truy vấn khi hiệu suất kém, các truy vấn của bạn sẽ không được lưu trong bộ nhớ cache theo cách bạn mong đợi và các truy vấn sẽ mất nhiều thời gian để quét qua bộ đệm để xem có kế hoạch sử dụng không. Nếu xóa bộ đệm sẽ giải quyết vấn đề này, bạn có thể muốn xem xét thay đổi cài đặt tham số bắt buộc. Bạn có thể xóa bộ đệm bằng cách sử dụng:

DBCC FREEPROCCACHE

Bạn có thể kiểm tra xem cài đặt tham số bắt buộc là gì nếu xóa bộ đệm hoạt động bằng cách:

SELECT name
     , is_parameterization_forced
  FROM sys.databases;

Điều này có thể được đặt thành 0, mặc định. Nếu họ mong muốn, bạn có thể đặt điều đó thành đúng bằng cách thực hiện:

ALTER DATABASE [database_name] SET PARAMETERIZATION FORCED;

Điều này nên được thực hiện trong môi trường dev trước và xem điều này có tác động tiêu cực đến cơ sở dữ liệu theo những cách khác không. Nó có thể được hoàn nguyên bằng cách sử dụng:

ALTER DATABASE [database_name] SET PARAMETERIZATION SIMPLE;

5
Lưu ý rằng việc giải phóng bộ đệm thủ tục thực sự có thể gây ra sự tăng đột biến trong CPU - vì tất cả các truy vấn bây giờ sẽ phải biên dịch lại các kế hoạch thực hiện của chúng.
Aaron Bertrand

18

Ái lực không "điều chỉnh mức sử dụng CPU" (ví dụ trong trường hợp của bạn làm cho CPU hoạt động ít hơn), nó cho phép bạn tắt CPU (có lẽ để cung cấp cho một phiên bản khác trên cùng một máy) hoặc đặt CPU thành chỉ hỗ trợ I / O. Ngay cả khi bạn có nhiều CPU, bạn sẽ không thể sử dụng cái trước để trợ giúp cho mục tiêu của mình và chúng tôi không thể đoán được cái sau bởi vì chúng tôi không biết điều gì đang thúc đẩy việc sử dụng CPU của bạn quá cao. Nó có thể là do lập chỉ mục cực kỳ kém, biên soạn quá mức, sự phong phú của UDF vô hướng, đập I / O, ai biết? (Và lý do I / O có thể là nguyên nhân là nếu cơ sở dữ liệu của bạn lớn hơn 3 GB hoặc lâu hơn, nó sẽ liên tục phải trao đổi dữ liệu vào và ra khỏi bộ nhớ vùng đệm và điều này sẽ gây thiệt hại cho CPU.)

Bộ nhớ cache CPU cũng là một lỗ thỏ bạn không cần phải đi xuống. Tôi rất nghi ngờ CPU của bạn bị đập ở mức 95% vì các vấn đề với bộ đệm CPU của bạn.

Để giúp thu hẹp nguồn áp lực CPU và giả sử bạn đang sử dụng các quy trình được lưu trữ, bạn có thể xem truy vấn chẩn đoán này từ Glenn Berry ( có nguồn gốc từ đây ) - đảm bảo bạn chạy nó trong ngữ cảnh của cơ sở dữ liệu phù hợp:

-- Top Cached SPs By Total Worker time (SQL Server 2012). 
-- Worker time relates to CPU cost  (Query 44) (SP Worker Time)

SELECT TOP (25) 
  p.name AS [SP Name], 
  qs.total_worker_time AS [TotalWorkerTime], 
  qs.total_worker_time/qs.execution_count AS [AvgWorkerTime], 
  qs.execution_count, 
  ISNULL(qs.execution_count/DATEDIFF(Second, qs.cached_time, GETDATE()), 0) 
    AS [Calls/Second],
  qs.total_elapsed_time, 
  qs.total_elapsed_time/qs.execution_count AS [avg_elapsed_time], 
  qs.cached_time
FROM sys.procedures AS p WITH (NOLOCK)
INNER JOIN sys.dm_exec_procedure_stats AS qs WITH (NOLOCK)
ON p.[object_id] = qs.[object_id]
WHERE qs.database_id = DB_ID()
ORDER BY qs.total_worker_time DESC OPTION (RECOMPILE);

-- This helps you find the most expensive cached stored procedures from a CPU perspective
-- You should look at this if you see signs of CPU pressure

Nếu bạn không sử dụng các thủ tục được lưu trữ, thì ví dụ này từ John Samson có thể giúp cách ly các truy vấn ad hoc ( có nguồn gốc từ đây ):

SELECT TOP (25)
    qs.sql_handle,
    qs.execution_count,
    qs.total_worker_time AS Total_CPU,
    total_CPU_inSeconds = --Converted from microseconds
    qs.total_worker_time/1000000,
    average_CPU_inSeconds = --Converted from microseconds
    (qs.total_worker_time/1000000) / qs.execution_count,
    qs.total_elapsed_time,
    total_elapsed_time_inSeconds = --Converted from microseconds
    qs.total_elapsed_time/1000000,
    st.text,
    qp.query_plan
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
CROSS apply sys.dm_exec_query_plan (qs.plan_handle) AS qp
ORDER BY qs.total_worker_time DESC OPTION (RECOMPILE);

Bạn cũng có thể xem sp_WhoIsActive của Adam Machanic , một quy trình được lưu trữ có thể nhanh chóng phân tích tất cả các truy vấn hiện đang chạy và cho phép bạn sắp xếp nó theo cách bạn muốn (ví dụ trong trường hợp của bạn @sort_order = '[CPU] DESC').

Tuy nhiên, điều đầu tiên tôi sẽ làm - đặc biệt nếu đây thực sự là nhiệm vụ quan trọng đối với các đội tìm kiếm và cứu hộ - là mua phần cứng tốt hơn. Bạn nên có nhiều CPU và nhiều RAM hơn để phục vụ ứng dụng của mình. Bạn cũng hoàn toàn cần tính sẵn sàng cao tốt hơn (ví dụ: phân cụm, phản chiếu hoặc các nhóm sẵn có). Không có lý do gì mà việc khởi động lại máy vật lý sẽ khiến ứng dụng của bạn hoàn toàn ngoại tuyến - chúng tôi có giải pháp tốt hơn cho vấn đề đó. Và cuối cùng, tôi cho rằng "máy chủ" này chỉ có một ổ đĩa spinny. Điều này có nghĩa là tất cả I / O - từ HĐH, từ tệp dữ liệu SQL Server, tệp nhật ký, tempdb, v.v. đều đi qua một bộ điều khiển duy nhất và chia sẻ hoạt động đọc / ghi trên một ổ đĩa. Nhận nhiều đĩa hơn. Nhận SSD nếu / nơi bạn có thể. Sử dụng RAID và cố gắng truyền bá I / O càng nhiều càng tốt.

Tất cả đã nói, ném phần cứng vào vấn đề sẽ không phải là phần duy nhất của sửa chữa. Bạn cần cách ly chính xác những gì gây ra việc sử dụng CPU quá mức và sau đó tấn công những vấn đề đó bất kể bạn đang sử dụng phần cứng nào.

Cũng xem câu hỏi StackOverflow này cho một số ý tưởng khác:

/programming/945063/how-do-i-find-out-what-is-hammering-my-sql-server


0

Các đề xuất sau đây là 'bắn trong bóng tối' vì tôi không thể thấy mã thực tế.

Đầu tiên là một SP có thể đang mở các con trỏ và để chúng mở. Đọc về Con trỏ, đặc biệt là Đóng và Giao dịch. Ai đó có thể sẽ đóng cửa, nhưng không giải quyết các con trỏ. Hành vi có thể đã thay đổi do nâng cấp, năm 2012 có thể đối xử với các con trỏ còn sót lại khác với 2008 R2.

Thứ hai là có thể có khóa bảng không bị xóa. Một lần nữa, tôi ở một khoảng cách xa nên tôi không thể nói, nhưng nó sẽ gợi ý rằng ai đó sẽ tạo một bảng tạm thời toàn cầu sau khi 'bắt đầu giao dịch' và không có 'giao dịch cuối' nào được thực hiện hoặc thủ tục được lưu trữ không để lại khóa bảng chiếm không gian trong tempdb.

Bạn có đang sử dụng WinLink không? Một cái gì đó về điều này nghe có vẻ quen thuộc.


-4

Bạn nên có một cơ chế lưu trữ tại chỗ như memcached để cải thiện hiệu suất


Nhưng điều này sẽ không thay đổi việc sử dụng CPU trên SQL-Server, phải không? Nó sẽ chỉ làm cho các truy vấn đi nhanh hơn trên trang web và có thể có vấn đề là đôi khi được thay đổi trong một bảng trong khi người khác đang sử dụng kết quả memcached từ cùng một bảng, phải không?
Levi Johansen

@Levi nếu bạn lưu trữ kết quả truy vấn ở đâu đó trong tầng giữa thì các truy vấn không truy cập cơ sở dữ liệu (ngoại trừ khi bạn cần làm mới bộ đệm).
Aaron Bertrand

1
Nếu CPU cũng ở mức cao khi không có ai trên trang web, thì rõ ràng bộ nhớ đệm cấp web sẽ không giúp ích gì. Memcached là một công cụ tuyệt vời, nhưng không phải là sự thay thế cho một người có thẩm quyền ngồi xuống và tìm hiểu những gì máy chủ đang làm khi được cho là không nên làm gì.
TomTom
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.