Vấn đề hiệu năng kỳ lạ với SQL Server 2016


14

Chúng tôi có một phiên bản SQL Server 2016 SP1 duy nhất đang chạy trong máy ảo VMware. Nó chứa 4 cơ sở dữ liệu, mỗi cơ sở cho một ứng dụng khác nhau. Những ứng dụng này đều nằm trên các máy chủ ảo riêng biệt. Không ai trong số họ đang sử dụng sản xuất. Những người kiểm tra các ứng dụng đang báo cáo các vấn đề hiệu suất, mặc dù.

Đây là số liệu thống kê của máy chủ:

  • RAM 128 GB (Bộ nhớ tối đa 110 GB cho Máy chủ SQL)
  • 4 lõi @ 4,6 GHz
  • Kết nối mạng 10 GB
  • Tất cả các lưu trữ là dựa trên SSD
  • Tệp chương trình, tệp nhật ký, tệp cơ sở dữ liệu và tempdb nằm trên các phân vùng riêng biệt của máy chủ
  • asd

Người dùng đang thực hiện truy cập màn hình đơn thông qua ứng dụng ERP dựa trên C ++.

Khi tôi nhấn mạnh kiểm tra Máy chủ SQL với Microsoft ostressbằng nhiều truy vấn nhỏ hoặc truy vấn lớn, tôi sẽ có hiệu suất tối đa. Điều duy nhất điều tiết là khách hàng, bởi vì anh ta không thể trả lời đủ nhanh.

Nhưng khi hầu như không có bất kỳ người dùng nào, SQL Server hầu như không làm gì cả. Tuy nhiên, mọi người phải chờ đợi mãi mãi để lưu bất cứ thứ gì trong ứng dụng.

Theo truy vấn " Hãy cho tôi biết nơi nào đau " của Paul Randal , 50% của tất cả các sự kiện chờ đợi là ASYNC_NETWORK_IO.

Điều này có thể có nghĩa là sự cố mạng hoặc sự cố hiệu suất với máy chủ ứng dụng hoặc máy khách. Không ai trong số họ thậm chí từ xa sử dụng tài nguyên của họ ở công suất tối đa. Hầu hết thời gian CPU là khoảng 26% trên tất cả các máy (Máy khách, máy chủ ứng dụng, máy chủ db).

Độ trễ của kết nối mạng là khoảng 1-3ms. IO của máy chủ db đạt tốc độ ghi tối đa 20MB / s trong quá trình sử dụng bình thường với ứng dụng (avg là 7-9MB / s). Khi tôi căng thẳng kiểm tra, tôi nhận được khoảng 5GB / s.

Kích thước bộ đệm của bộ đệm là 60 GB cho DB của hệ thống ERP của chúng tôi, 20 GB cho phần mềm tài chính của chúng tôi, 1 GB cho phần mềm đảm bảo chất lượng, 3 GB cho hệ thống lưu trữ tài liệu.

Tôi đã cho tài khoản SQL Server quyền sử dụng Khởi tạo tệp tức thì . Điều đó đã không tăng hiệu suất trong một chút.

Tuổi thọ của trang là khoảng 15k + trong khi sử dụng bình thường. Giảm xuống khoảng 0,05k trong khi kết thúc thử nghiệm căng thẳng nặng, dự kiến. Mẻ / giây là khoảng 2-8k, tùy thuộc vào khối lượng công việc.

Tôi muốn nói rằng ứng dụng ERP chỉ được viết kém, nhưng tôi không thể vì tất cả các ứng dụng đều bị ảnh hưởng. Ngay cả ở khối lượng công việc tối thiểu.

Tuy nhiên, tôi không thể xác định chính xác những gì gây ra điều này. Có bất kỳ lời khuyên, hướng dẫn gợi ý, ứng dụng, tài liệu thực hành tốt nhất / tồi tệ nhất hoặc bất cứ điều gì khác mà các bạn có trong tâm trí về vấn đề này?

Đây là kết quả từ sp_BlitzFirst:

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Tôi đã chạy nó 600 giây. Tôi đã khởi động nó trong một khối lượng công việc lớn của ứng dụng. 1/3 thời gian đó ASYNC_NETWORK_IO. Tôi cũng đã thử nghiệm kết nối mạng với NTttcp, PsPing, ipferf3, và pathping. Không có gì bất thường. Thời gian đáp ứng tối đa là 3ms, trung bình 0,3ms. Thông lượng là khoảng 1000 MB / s.

Cuộc điều tra của tôi luôn dẫn đến kết quả ASYNC_NETWORK_IOlà người chờ đợi số một.

Chúng tôi đã điều tra kết quả của việc vô hiệu hóa Large-Receive-Offloadtính năng này trong VMware. Chúng tôi vẫn đang thử nghiệm, nhưng kết quả có vẻ không nhất quán. Kết quả 'điểm chuẩn' đầu tiên của chúng tôi có thời lượng 19 phút (kết quả cao nhất là 13 phút chỉ đạt được khi ứng dụng đang chạy trên máy ảo với chính SQL Server). Kết quả thứ hai là 28 phút, điều này thực sự tồi tệ.

Kết quả đầu tiên của "điểm chuẩn" của chúng tôi là 19 phút. Cái nào tốt. Bởi vì kết quả hàng đầu là 13 phút (chỉ có thể đạt được khi ứng dụng điểm chuẩn trên VM với chính SQL Server). Điều này gợi ý mạnh mẽ về một số vấn đề liên quan đến mạng. Hoặc một vấn đề với cấu hình VMware.

Tôi hiện đang bị mất phương pháp sử dụng, để đóng nó vào nút cổ chai.

Hiệu suất tối đa với ứng dụng chỉ có thể đạt được khi ứng dụng đang chạy trên VM với chính SQL Server. Nếu ứng dụng được thực thi trên bất kỳ máy ảo hoặc máy tính để bàn ảo nào khác, thời lượng điểm chuẩn của chúng tôi sẽ tăng gấp ba lần (từ thời lượng 13 phút đến 40 phút trở lên). Tất cả các điểm cuối (VM của SQL Server, VM của máy chủ ứng dụng và Virtual Desktop) đều sử dụng cùng một phần cứng vật lý. Chúng tôi đã chuyển tất cả các điểm cuối khác sang phần cứng khác.

EDIT: Có vẻ như vấn đề đã trở lại. Sau khi thiết lập chế độ tiết kiệm năng lượng từ cân bằng đến hiệu suất cao, chúng tôi thực sự đã cải thiện thời gian phản hồi một cách kịch tính. Nhưng hôm nay tôi đã chạy lại sp_BlitzFirst, với mẫu 300 giây. Đây là kết quả:

Đây là kết quả

Nó cho thấy thời gian chờ của ASYNC_NETWORK_IO nhiều hơn so với giây mà sp_blitzfirst đã chạy.

Câu trả lời:


18

Nếu sự chờ đợi chính của bạn là ASYNC_NETWORK_IO, thì vấn đề không nằm ở SQL Server. Nó gần như luôn luôn là do một nút cổ chai ứng dụng. Tôi không có nghĩa là một nút cổ chai trên máy chủ ứng dụng, mà là một nút cổ chai trong ứng dụng.

Nút cổ chai ứng dụng thường là do xử lý từng hàng trong khi SQL Server đang gửi dữ liệu:

  • Ứng dụng đang yêu cầu dữ liệu từ SQL Server
  • SQL Server đang gửi dữ liệu nhanh
  • Ứng dụng đang bảo SQL Server chờ trong khi nó xử lý từng hàng
  • SQL Server ghi lại thời gian chờ ASYNC_NETWORK_IOtrong khi ứng dụng đang bảo nó chờ

Thay vào đó, ứng dụng cần tiêu thụ tất cả dữ liệu từ SQL Server và THEN thực hiện xử lý theo từng hàng. SQL Server ra khỏi hình ảnh tại thời điểm đó.

sp_BlitzFirst đầu ra

Sự LCK_M_Schờ đợi không cao. Chỉ có 2 giây của mẫu 30 giây trên đó và trung bình của nó chỉ là 400ms. Đó là rất, rất khó có thể là vấn đề. ASYNC_NETWORK_IOlà chờ đợi hàng đầu của bạn trong mẫu đó. Vẫn là một vấn đề ứng dụng. Nếu bạn muốn trợ giúp về LCKnội dung, chúng tôi cần xem các truy vấn có liên quan.

Thậm chí ASYNC_NETWORK_IOkhông tệ trong mẫu đó. Mắt tôi trở nên to khi thời gian chờ bằng hoặc lớn hơn cỡ mẫu. Đó là khi tôi đào.

Toàn bộ vấn đề của bạn là ASYNC_NETWORK_IO. Đây không phải là một vấn đề máy chủ SQL. Đó là một vấn đề với ứng dụng (xử lý từng hàng trong khi SQL Server đang gửi dữ liệu), máy chủ ứng dụng (bạn đã nói nó ổn) hoặc mạng (bạn đã nói rằng mạng vẫn ổn). Vì vậy, vấn đề là với các ứng dụng. Ứng dụng C ++ cần được sửa chữa.


6

Để trả lời câu hỏi của riêng tôi: Lý do chính khiến ASYNC_NETWORK_IO xuất hiện trên SQL Server của chúng tôi là loại chờ hàng đầu, là do energy savingcài đặt của máy chủ windows được đặt thành 'balanced'thay vì 'high performance'. Chúng tôi đã nói chuyện với một số quản trị viên vm ware sau đó, và tất cả họ đều nói rằng cài đặt này sẽ giết chết hiệu suất .

Giải pháp cho việc này là:

  • Không cài đặt kiểm soát năng lượng khi cài đặt máy chủ windows
  • Đặt chế độ tiết kiệm năng lượng thành hiệu suất cao cho tất cả máy chủ thông qua chính sách nhóm

Tất cả các vấn đề / số liệu thống kê khác liên quan đến ASYNC_NETWORK_IO đều liên quan đến ứng dụng ERP của chúng tôi bị viết xấu. Cảm ơn tất cả những người đã giúp tôi giải quyết vấn đề này, ý kiến, đề xuất và lời khuyên của bạn rất được hoan nghênh và hữu ích!


Hiện tại, nhiều BIOS có quyền kiểm soát chi tiết hơn về tiết kiệm năng lượng, ví dụ như quản lý năng lượng NIC. Tôi tự hỏi liệu có thể vẫn mở rộng tần số hay không và tránh IO chờ trên NIC bằng cách vô hiệu hóa các chế độ tiết kiệm năng lượng của nó.
ajeh
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.