Công ty của tôi sử dụng một ứng dụng có vấn đề hiệu năng khá lớn. Có một số vấn đề với chính cơ sở dữ liệu mà tôi đang trong quá trình xử lý, nhưng nhiều vấn đề hoàn toàn liên quan đến ứng dụng.
Trong cuộc điều tra của tôi, tôi thấy rằng có hàng triệu truy vấn truy cập vào cơ sở dữ liệu SQL Server truy vấn các bảng trống. Chúng tôi có khoảng 300 bảng trống và một số bảng được truy vấn tới 100-200 lần mỗi phút. Các bảng không liên quan gì đến lĩnh vực kinh doanh của chúng tôi và về cơ bản là một phần của ứng dụng gốc mà nhà cung cấp đã không gỡ bỏ khi chúng được công ty tôi ký hợp đồng sản xuất một giải pháp phần mềm cho chúng tôi.
Ngoài thực tế là chúng tôi nghi ngờ nhật ký lỗi ứng dụng của chúng tôi đang bị ngập trong các lỗi liên quan đến vấn đề này, nhà cung cấp đảm bảo với chúng tôi rằng không có tác động về hiệu suất hoặc tính ổn định cho ứng dụng hoặc máy chủ cơ sở dữ liệu. Nhật ký lỗi bị ngập đến mức chúng ta không thể thấy các lỗi có giá trị hơn 2 phút để chẩn đoán.
Chi phí thực tế của các truy vấn này rõ ràng là sẽ thấp về chu kỳ CPU, v.v. Nhưng có ai có thể đề xuất ảnh hưởng gì đến SQL Server và ứng dụng không? Tôi nghi ngờ rằng các cơ chế thực tế của việc gửi yêu cầu, xác nhận nó, xử lý nó, trả lại và thừa nhận biên nhận của ứng dụng sẽ có ảnh hưởng đến hiệu suất.
Chúng tôi sử dụng SQL Server 2008 R2, Oracle Weblogic 11g cho ứng dụng.
@ Frisbee- Câu chuyện dài, tôi đã tạo một bảng chứa truy vấn văn bản đánh vào các bảng trống trong cơ sở dữ liệu của ứng dụng, sau đó truy vấn nó cho tất cả các tablenames tôi biết đều trống và có một danh sách rất dài. Lượt truy cập cao nhất là 2,7 triệu lượt thực thi trong 30 ngày hoạt động, lưu ý rằng ứng dụng này thường được sử dụng từ 8 giờ sáng đến 6 giờ chiều để những con số này tập trung hơn vào giờ hoạt động. Nhiều bảng, nhiều truy vấn, có thể một số liên quan thông qua các phép nối, một số thì không. Lượt truy cập cao nhất (2,7 triệu vào thời điểm đó) là một lựa chọn đơn giản từ một bảng trống duy nhất có mệnh đề where, không tham gia. Tôi mong đợi các truy vấn lớn hơn khi tham gia vào các bảng trống có thể bao gồm các cập nhật cho các bảng được liên kết, nhưng tôi sẽ kiểm tra và cập nhật câu hỏi này càng sớm càng tốt.
Cập nhật: Có 1000 truy vấn với số lần thực hiện trong khoảng từ 1043 - 4622614 (hơn 2,5 tháng). Tôi sẽ phải đào sâu hơn để tìm hiểu khi kế hoạch lưu trữ bắt nguồn từ đâu. Đây chỉ là để cung cấp cho bạn một ý tưởng về mức độ của các truy vấn. Hầu hết là phức tạp hợp lý với hơn 20 tham gia.
@ srutzky- vâng Tôi tin rằng có một cột ngày liên quan đến thời điểm kế hoạch được biên soạn để có thể quan tâm, vì vậy tôi sẽ kiểm tra xem. Tôi tự hỏi liệu giới hạn luồng có phải là một yếu tố hay không khi SQL Server nằm trên cụm VMware? Rất sớm trở thành một Dell PE 730xD chuyên dụng.
@Frisbee - Xin lỗi vì phản hồi muộn. Như bạn đề xuất, tôi đã chạy một lựa chọn * từ bảng trống 10.000 lần trên 24 luồng bằng SQLQueryStress (thực tế là 240.000 lần lặp) và đạt 10.000 Yêu cầu hàng loạt / giây ngay lập tức. Sau đó, tôi giảm xuống 1000 lần trên 24 chủ đề và chỉ đạt dưới 4.000 Yêu cầu hàng loạt / giây. Tôi cũng đã thử 10.000 lần lặp chỉ trong 12 luồng (vì vậy tổng số 120000 lần lặp) và điều này tạo ra 6,505 Batches / giây duy trì. Hiệu quả trên CPU thực sự đáng chú ý, khoảng 5-10% tổng mức sử dụng CPU trong mỗi lần chạy thử. Chờ đợi mạng là không đáng kể (như 3ms với máy khách trên máy trạm của tôi) nhưng chắc chắn tác động của CPU là điều đó, điều này khá là kết luận theo như tôi nghĩ. Nó dường như sôi sục với việc sử dụng CPU và một chút IO cơ sở dữ liệu không cần thiết. Tổng số lần thực hiện / giây hoạt động chỉ dưới 3000, đó là nhiều hơn trong sản xuất, tuy nhiên tôi chỉ thử nghiệm một trong hàng tá truy vấn như thế này. Hiệu ứng ròng của hàng trăm truy vấn đánh vào các bảng trống với tốc độ từ 300-4000 lần mỗi phút do đó sẽ không đáng kể khi nói đến thời gian của CPU. Tất cả các thử nghiệm được thực hiện đối với một PE 730xD nhàn rỗi với mảng flash kép và RAM 256 GB, 12 lõi hiện đại.
@ srutzky- suy nghĩ tốt. SQLQueryStress dường như sử dụng nhóm kết nối theo mặc định nhưng dù sao tôi cũng đã xem và thấy rằng có, hộp cho nhóm kết nối được chọn. Cập nhật để theo dõi
@ srutzky- Kết nối tổng hợp dường như không được bật trên ứng dụng - hoặc nếu có, nó không hoạt động. Tôi đã thực hiện theo dõi hồ sơ và thấy rằng các kết nối có EventSubClass "1 - Nonpooled" cho các sự kiện Đăng nhập kiểm toán.
RE: Pooling kết nối- Đã kiểm tra weblogics và tìm thấy pooling kết nối được kích hoạt. Chạy thêm dấu vết chống lại trực tiếp và tìm thấy dấu hiệu gộp chung không xảy ra / hoàn toàn:
Và đây là những gì nó trông giống như khi tôi chạy một truy vấn duy nhất mà không tham gia vào một bảng dân cư; các trường hợp ngoại lệ ghi "Đã xảy ra lỗi liên quan đến mạng hoặc trường hợp cụ thể trong khi thiết lập kết nối với SQL Server. Máy chủ không tìm thấy hoặc không truy cập được. Xác minh rằng tên đối tượng là chính xác và SQL Server được cấu hình để cho phép kết nối từ xa. (nhà cung cấp: Nhà cung cấp ống có tên, lỗi: 40 - Không thể mở kết nối với SQL Server) "Lưu ý bộ đếm yêu cầu hàng loạt. Ping máy chủ trong thời gian các ngoại lệ được tạo ra dẫn đến phản hồi ping thành công.
Cập nhật- hai lần chạy thử liên tiếp, cùng một khối lượng công việc (chọn * từEmptyTable), kích hoạt gộp / không bật. Việc sử dụng CPU nhiều hơn một chút và rất nhiều lỗi và không bao giờ vượt quá 500 yêu cầu lô / giây. Các thử nghiệm cho thấy 10.000 Batch / giây và không có lỗi khi gộp BẬT, và khoảng 400 lô / giây sau đó rất nhiều lỗi do gộp chung bị vô hiệu hóa. Tôi tự hỏi nếu những thất bại này có liên quan đến việc thiếu kết nối?
@ srutzky- Chọn Đếm (*) từ sys.dm_exec_connections;
Kích hoạt nhóm: 37 liên tục, ngay cả sau khi thử nghiệm tải dừng lại
Việc gộp nhóm bị vô hiệu hóa: 11-37 tùy thuộc vào việc có ngoại lệ
xảy ra trên SQLQueryStress hay không : khi các máng đó xuất hiện trên
biểu đồ Batches / giây, các ngoại lệ xảy ra trên SQLQueryStress và
số lượng kết nối giảm xuống còn 11, sau đó dần dần lên tới 37 khi các đợt bắt đầu lên đến đỉnh điểm và các ngoại lệ không xảy ra. Rất, rất thú vị.
Kết nối tối đa trên cả hai trường hợp kiểm tra / trực tiếp được đặt ở mặc định là 0.
Đã kiểm tra nhật ký ứng dụng và không thể tìm thấy sự cố kết nối, tuy nhiên, chỉ có một vài phút ghi nhật ký có sẵn do số lượng lớn và kích thước lỗi, ví dụ: rất nhiều lỗi theo dõi ngăn xếp. Một đồng nghiệp về hỗ trợ ứng dụng khuyên rằng một số lượng đáng kể các lỗi HTTP xảy ra liên quan đến kết nối. Dường như dựa trên điều này, vì một số lý do, ứng dụng không kết nối chính xác các kết nối và kết quả là, máy chủ liên tục hết kết nối. Tôi sẽ xem xét nhật ký ứng dụng nhiều hơn. Tôi tự hỏi có cách nào để chứng minh điều này đang xảy ra trong sản xuất từ phía SQL Server không?
@ srutzky- Cảm ơn bạn. Tôi sẽ kiểm tra cấu hình weblogic vào ngày mai và cập nhật. Tôi đã suy nghĩ về chỉ 37 kết nối - nếu SQLQueryStress đang thực hiện 12 luồng với 10.000 lần lặp = 120.000 câu lệnh chọn không được gộp, điều đó có nghĩa là mỗi lựa chọn sẽ tạo ra một kết nối riêng biệt với thể hiện sql?
@ srutzky- Weblogics được cấu hình để kết nối nhóm, vì vậy nó sẽ hoạt động tốt. Nhóm kết nối được cấu hình như thế này, trên mỗi 4 weblogics cân bằng tải:
- Công suất ban đầu: 10
- Công suất tối đa: 50
- Công suất tối thiểu: 5
Khi tôi tăng số lượng luồng thực hiện lựa chọn từ truy vấn bảng trống, số lượng kết nối đạt cực đại khoảng 47. Với việc gộp nhóm kết nối bị vô hiệu hóa, tôi luôn thấy một yêu cầu lô tối đa thấp hơn / giây (từ 10.000 xuống còn khoảng 400). Điều sẽ xảy ra mọi lúc là 'ngoại lệ' trên SQLQueryStress xảy ra ngay sau khi các lô / giây đi vào một máng. Nó có liên quan đến kết nối nhưng tôi không thể hiểu chính xác lý do tại sao điều này xảy ra. Khi không có bài kiểm tra nào đang chạy, #connections giảm xuống còn khoảng 12.
Với việc kết nối bị vô hiệu hóa, tôi gặp khó khăn trong việc hiểu tại sao các ngoại lệ xảy ra, nhưng có lẽ đó là một câu hỏi / câu hỏi stackExchange khác cho Adam Machanic?
@srutzky Tôi tự hỏi tại sao các trường hợp ngoại lệ xảy ra mà không kích hoạt nhóm, mặc dù SQL Server không hết kết nối?
SELECT COUNT(*) FROM sys.dm_exec_connections;
để xem giá trị có khác biệt nhiều giữa việc bật nhóm hay không không phải. Dựa trên những lỗi đó, tôi nghĩ sẽ có nhiều kết nối hơn khi gộp chung bị vô hiệu hóa.
Pooling=false
hay Max Pool Size
?