Sự khác biệt lớn về hiệu suất của MySQL trong hai máy chủ


8

Chúng tôi có một máy chủ MySQL được cài đặt trong hai máy khác nhau, máy chủ thử nghiệm và máy chủ sản xuất, cả hai cửa sổ, được sử dụng bởi một ứng dụng web.

Vấn đề là có sự khác biệt hiệu năng HUGE giữa hai máy khi thực hiện một số truy vấn (máy chủ sản xuất là máy chậm hơn). Phiên bản MySQL trong cả hai máy chủ đều giống nhau, ngay cả các tệp cấu hình cũng giống nhau (sự khác biệt duy nhất là đường dẫn của dữ liệu và thực tế là máy chủ sản xuất không ghi lại bất cứ điều gì ngoại trừ lỗi). Sự khác biệt về hiệu suất mà tôi đang nói đến là 3 hoặc 4 bậc độ lớn (ví dụ: một truy vấn trong máy chủ thử nghiệm thực thi trong 0,2 giây, trong khi đó trong máy chủ sản xuất thực hiện trong 84 giây).

Các truy vấn vi phạm sử dụng rộng rãi các mệnh đề với "WHERE [...] IN [...]", theo hiểu biết của tôi rằng chúng thường rất chậm và chúng nên được thay thế bằng THAM GIA. Tuy nhiên, phiên bản MySQL mà chúng tôi đang sử dụng là 5.6.19, tự động tối ưu hóa các truy vấn đó, đó là lý do tại sao chúng hoạt động nhanh trong máy chủ thử nghiệm (và chúng nằm trong một phần của chương trình mà chúng tôi không thể thay đổi để chúng tôi không thể tối ưu hóa chúng theo cách thủ công dù sao).

Như tôi đã nói, cài đặt và cấu hình MySQL là giống hệt nhau, vì vậy tôi hoàn toàn không biết vấn đề có thể xảy ra ở đâu. Một mặt, tôi nghi ngờ rằng đó phải là một vấn đề cấu hình thuộc loại nào đó vì chương trình và DB là như nhau, mặt khác, điều này không có ý nghĩa vì cấu hình giống hệt nhau.

Một số dữ liệu trên máy chủ:
Máy chủ thử nghiệm:

  • Intel Core 2 Quad Q9400 @ 2.66GHz
  • RAM 8GB
  • Tiêu chuẩn Windows Server 2008 R2

Máy chủ sản xuất:

  • Intel Xeon E5530 @ 2.40GHz
  • RAM 5GB
  • Tiêu chuẩn Windows Server 2012 R2

Chỉnh sửa: Tôi quên nói một điều quan trọng: có nhiều truy vấn đang được thực thi sử dụng mệnh đề "WHERE ... IN" cho các mệnh đề "vi phạm". Chúng được thực thi nhanh trong cả hai máy, điều này cho tôi thấy rằng chúng đang được tối ưu hóa chính xác bởi MySQL. Thực tế là một số truy vấn được tối ưu hóa khi những người khác không phải là một bí ẩn đối với tôi, NẾU đây là vấn đề thực tế, điều mà tôi không chắc chắn.

Chỉnh sửa # 2: Đây là tệp cấu hình cho cả hai máy chủ: http://pastebin.ca/2834906

Chỉnh sửa # 3: Đây là GIẢI THÍCH của một trong những truy vấn chậm: https://mariadb.org/ea/v36zj EXPLAIN hoàn toàn giống nhau trong cả thử nghiệm và sản phẩm. Bản thân truy vấn có ở đây: http://pastebin.com/VXgBxXmt Nó đã được định dạng với một bộ lọc tự động, vì vậy có lẽ không rõ ràng lắm. Như bạn có thể thấy, khá dài và phức tạp. Nó không được tạo bằng tay, chúng tự động được tạo ra bởi phần mềm, sử dụng một phương ngữ của SQL tiêu chuẩn với một số chức năng.

Ngoài ra, thêm thông tin: Chúng tôi đã khắc phục tạm thời sự cố bằng cách giảm dữ liệu trong máy chủ sản xuất và xóa hầu hết dữ liệu cũ trong DB, điều này sẽ không được sử dụng. Tất nhiên, đây không phải là một giải pháp vì chúng ta cũng cần dữ liệu cũ và nó sẽ là một vấn đề trong tương lai. DB không lớn lắm: DB đầy đủ là 1308 MB, phiên bản rút gọn hiện đang được sản xuất là 332 MB.

CẬP NHẬT: GIẢI QUYẾT ??

Tôi nghĩ rằng tôi đã giải quyết vấn đề. Tôi chưa kiểm tra nó, vì máy chủ sản xuất đang thực sự được sử dụng, nhưng vấn đề có thể xảy ra là tham số "innodb_buffer_pool_size", được đặt thành 182M. Trên thực tế, dòng trong tệp cấu hình hiển thị: innodb_buffer_pool_size = 321 là một lỗi do nó không có tiền tố đơn vị, đưa ra một giá trị không hợp lệ (tối thiểu là 52,2880 theo tài liệu), sau đó đặt nó ở giá trị trước đó . Giá trị này trong máy chủ thử nghiệm được đặt ở mức 321M mong muốn.

Như tôi đã nói, tôi đã không kiểm tra nó hoàn toàn. Những gì tôi đã làm là giảm giá trị trong thử nghiệm và thử ứng dụng. Mọi thứ diễn ra chậm hơn và truy vấn cụ thể mà tôi đã đăng thực hiện trong 3 phút.

Tôi đã đưa vào thử nghiệm giá trị 3Gb lành mạnh hơn, mà tôi không biết liệu đó có phải là một ý tưởng hay không, vì vậy nếu ai đó có một số nhận xét về giá trị này, tôi sẽ đánh giá cao nó.

Kết luận của tôi, "giá trị lành mạnh" của 3Gb và thông tin tôi sử dụng cho việc này xuất phát từ hai bài đăng này, đặc biệt là bài thứ hai:

Truy vấn MySQL, 2 máy chủ tương tự, chênh lệch 2 phút về thời gian thực hiện

Làm thế nào lớn nên mysql innodb_buffer_pool_size?

Tôi sẽ đăng kết quả "thực" khi chúng tôi cập nhật các giá trị trong máy chủ sản xuất.

Cảm ơn tất cả mọi người.

GIẢI QUYẾT

Vì vậy, cuối cùng chúng tôi đã thử nghiệm điều này trong prod, và đó là vấn đề tôi đã nhận xét trước đó. Tôi đặt giá trị của innodb_buffer_pool_size trong 321M, đây là giá trị được đề xuất bởi nhà cung cấp SDK mà chúng tôi sử dụng, mặc dù theo các liên kết trước đó, nó phải ở khoảng 3G cho DB có kích thước và mức sử dụng này.

Mặc dù vậy, tôi vẫn có một nghi ngờ: giá trị của 321 là một giá trị không hợp lệ (quá nhỏ), vì vậy MySQL đã lấy một giá trị khác. Sự nghi ngờ của tôi là nó đã lấy số hợp lệ trước đó, 321M trong thử nghiệm và 182M trong prod, do đó có sự khác biệt về tốc độ. Điều đó chỉ gây tò mò, nhưng tôi muốn biết liệu điều này có đúng không.

Cảm ơn tất cả các bạn một lần nữa vì sự giúp đỡ.


1
Các cơ sở dữ liệu thậm chí có cùng kích thước trên mỗi máy chủ? Cơ sở dữ liệu thử nghiệm nhỏ hơn sẽ chạy nhanh hơn cơ sở dữ liệu sản xuất lớn hơn. Ngoài ra, máy chủ thử nghiệm có gần gấp đôi RAM. Việc sử dụng bộ nhớ trông như thế nào?

1
Có, DB là như nhau (thực sự là một bãi chứa DB sản xuất vào DB thử nghiệm). Tôi chưa kiểm tra việc sử dụng bộ nhớ trong máy chủ sản xuất, bây giờ tôi sẽ thông báo.

1
Bạn có thể lấy số liệu thống kê RAM tương tự từ hộp thử nghiệm không? Xem nếu họ trông khác nhau đáng kể?
Chris S

2
Bạn có thể đăng một ví dụ về một truy vấn chạy tuyệt vời trong TEST nhưng thật kinh khủng trong SẢN PHẨM không? Ngoài ra, vui lòng chạy gói EXPLAIN trên truy vấn trong cả hai hệ thống và đăng kết quả.
RolandoMySQLDBA

3
@juantxorena: bạn cần loại bỏ lý do, và không giả sử bất cứ điều gì , từ dễ đến khó kiểm tra. Bước 1 lý do: sự khác biệt trong kế hoạch truy vấn. Chạy EXPLAIN trên sản xuất và phát triển, kiểm tra sự khác biệt (ngay cả khi tối thiểu). Thêm thông tin đó và sau đó chúng ta có thể chuyển sang bước 2.
jynus

Câu trả lời:


4

Tôi có thể bị mù trên cái này, nhưng ở đây nó ...

Trong câu hỏi và ý kiến ​​của bạn, bạn đã nêu như sau:

Phiên bản MySQL trong cả hai máy chủ đều giống nhau, ngay cả các tệp cấu hình cũng giống nhau (sự khác biệt duy nhất là đường dẫn của dữ liệu và thực tế là máy chủ sản xuất không ghi lại bất cứ điều gì ngoại trừ lỗi)

Có, DB là như nhau (thực sự là một bãi chứa DB sản xuất vào DB thử nghiệm).

Kết quả tương tự: 2,31Gb một cách ổn định

Bạn nên cung cấp gói EXPLAIN cho một truy vấn. Vì dữ liệu là giống hệt nhau, nó có thể không cần thiết.

Có một vài điều có thể khác

QUY TRÌNH CỦA BẠN

Tôi đã tra cứu Intel Core 2 Quad Q9400 @ 2.66GHz (TEST)Intel Xeon E5530 @ 2.40GHz (PROD) và thấy một sự khác biệt.

  • CPU cho TEST có 4 luồng
  • CPU cho PROD có 8 luồng

Bạn sẽ nghĩ sản xuất nên nhanh hơn.

Tốc độ xe buýt nội bộ của nó có thể là nút cổ chai. Tôi nghi ngờ điều này bởi vì TEST có tốc độ xe buýt cao hơn và hệ số nhân xe buýt là 8. Hệ số xe buýt là gì?

Tần số bên trong của bộ vi xử lý thường dựa trên tần số Bus phía trước. Để tính tần số bên trong, CPU nhân tần số bus với số lượng nhất định, được gọi là hệ số nhân. Điều quan trọng cần lưu ý là để tính toán, CPU sử dụng tần số bus thực tế và tần số bus không hiệu quả. Để xác định tần số bus thực tế thực tế cho các bộ xử lý sử dụng bus tốc độ dữ liệu kép (AMD Athlon và Duron) và bus tốc độ bốn dữ liệu (tất cả các bộ vi xử lý Intel bắt đầu từ Pentium 4), tốc độ bus hiệu quả nên được chia cho 2 hoặc AMD cho Intel.

Dựa trên điều này, tốc độ bus nội bộ cho AMD (TEST) cao hơn ít nhất 2 lần so với Intel (PROD).

THỐNG KÊ INDEX CỦA BẠN

Vì bạn đã tải TEST với cùng một dữ liệu, một điều có thể đã bị bỏ qua. Tôi đang nghĩ về số liệu thống kê chỉ số. Đối với TEST, số liệu thống kê chỉ số sẽ khá mới. Đối với SẢN PHẨM, có thể cũ nếu các bảng được lập chỉ mục có nhiều XÁC NHẬN, CẬP NHẬT và XÓA.

Chạy CHỌN trên hai máy khác nhau với phiên bản mysql giống hệt nhau, cấu hình mysql giống hệt nhau, bộ dữ liệu giống hệt nhau và thậm chí phần cứng giống hệt nhau có thể bị ảnh hưởng bởi thống kê chỉ mục trên bảng liên quan.

Tôi sẽ chạy BẢNG ANALYZE trên tất cả các bảng trên SẢN PHẨM và KIỂM TRA và sau đó thử so sánh hiệu suất.


Cảm ơn bạn đã trả lời kỹ lưỡng của bạn. Tôi đã thực hiện BẢNG ANALYZE trên tất cả các bảng và thời gian thực hiện là tương tự nhau. Sản xuất chậm hơn một chút trong hầu hết các trường hợp, nhanh hơn một chút trong những trường hợp khác, nhưng tôi đang nói về mili giây, vì vậy tôi không nghĩ đó là nguyên nhân. Tôi vẫn đang nhìn.
juantxorena
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.