Ghi nhật ký làm tổn thương hiệu suất MySQL - nhưng, tại sao?


9

Tôi khá ngạc nhiên khi tôi không thể thấy câu trả lời cho vấn đề này ở bất cứ đâu trên trang web, cũng như trong tài liệu MySQL ( phần 5.2 dường như đã đăng nhập được bảo vệ tốt!)

Nếu tôi bật binlog, tôi sẽ thấy một cú đánh hiệu suất nhỏ (chủ quan), được dự kiến ​​sẽ có thêm một chút IO - nhưng khi tôi kích hoạt nhật ký truy vấn chung, tôi thấy một cú đánh hiệu suất rất lớn (gấp đôi thời gian để chạy truy vấn, hoặc tệ hơn), vượt quá những gì tôi thấy với binlogs. Tất nhiên bây giờ tôi đang ghi nhật ký mọi CHỌN cũng như mọi CẬP NHẬT / CHERTN, nhưng, các trình tiện ích khác ghi lại mọi yêu cầu của chúng (Apache, Exim) mà không bị dừng lại.

Có phải tôi chỉ thấy những tác động của việc gần với "điểm bùng phát" khi nói đến IO, hoặc có điều gì đó về cơ bản là khó khăn khi ghi nhật ký truy vấn khiến điều này xảy ra không? Tôi muốn có thể ghi nhật ký tất cả các truy vấn để giúp phát triển dễ dàng hơn, nhưng tôi không thể biện minh cho loại phần cứng mà chúng tôi cần để có được hiệu suất sao lưu khi đăng nhập truy vấn chung.

Tất nhiên, tôi ghi nhật ký các truy vấn chậm và có sự cải thiện không đáng kể trong việc sử dụng chung nếu tôi vô hiệu hóa điều này.

(Tất cả điều này là trên Ubuntu 10.04 LTS, MySQLd 5.1,49, nhưng nghiên cứu cho thấy đây là một vấn đề khá phổ biến)

Câu trả lời:


9

Nhật ký truy vấn chung có nhiều IO hơn nhật ký nhị phân. Bên cạnh thực tế là hầu hết các máy chủ SQL đều đọc 90% đến 10% ghi, nhật ký nhị phân được lưu trữ ở định dạng nhị phân thay vì văn bản thuần túy sử dụng ít dung lượng đĩa hơn. (Bao nhiêu không gian ít hơn? Tôi không chắc chắn. Xin lỗi.)

Có hai khía cạnh tại sao Apache và Exim có thể ghi lại mọi yêu cầu mà không ảnh hưởng đáng kể đến hiệu suất. Đầu tiên là họ ghi lại thực tế rằng một yêu cầu đã diễn ra nhưng những gì họ đưa vào nhật ký thường nhỏ hơn đáng kể so với yêu cầu thực tế. Yêu cầu HTTP thường lớn gấp đôi dòng ghi trong nhật ký và thậm chí một email văn bản ngắn, đơn giản lớn hơn 10 hoặc 20 lần so với dòng nhật ký đi kèm. Một email có tệp đính kèm 10 MB sẽ vẫn chỉ có một vài dòng được ghi trong nhật ký.

Phần thứ hai là trong một ứng dụng web bình thường, thường có hàng tá truy vấn SQL được liên kết với một trang HTTP. Email có xu hướng đến với số lượng nhỏ hơn so với yêu cầu HTTP. Máy chủ MySQL của bạn có thể đang cố gắng đăng nhập nhiều hơn cả Apache hoặc Exim.

Nhìn vào kích thước (không nén) của nhật ký chung và nhị phân MySQL của bạn và nhật ký Apache và Exim của bạn vào cuối ngày. Tôi cá là bạn sẽ thấy nhật ký chung của MySQL là nhật ký lớn nhất với hệ số ít nhất là 5.


1
Một số điểm tốt - đặc biệt, vâng, một GET cho ứng dụng của chúng tôi có thể gây ra 100 CHỌN, vì mặc dù chúng tôi cố gắng làm hết sức có thể trong một truy vấn duy nhất đôi khi chúng tôi đánh đổi hiệu năng / sạch của điều này cho cấu trúc thanh lịch hơn, mã dễ đọc hơn và DB sạch hơn. (Bên cạnh đó, toàn bộ điều này thực sự bắt đầu từ việc nói về việc ghi nhật ký nội dung của POST cũng như URL từ GET, vì chúng ta thấy các thông số CGI.pm nhìn thấy trong một trường hợp chứ không phải trường hợp khác và từ đó đăng nhập / thực hiện chung). Dù sao, đó là một vài giờ, vì vậy, câu trả lời được chấp nhận. Cảm ơn!
James Green

4

Để thêm vào câu trả lời được cung cấp , bạn cũng sẽ thấy một cú đánh hiệu suất nếu bạn đang đăng nhập vào cùng một thiết bị với kho lưu trữ dữ liệu MySQL của bạn - nếu đó là cùng một đĩa, bạn sẽ đọc và ghi vào nhiều vị trí tất cả thời gian, làm chậm toàn bộ quá trình.

Điều này đúng ngay cả khi đó là một phân vùng khác trên cùng một đĩa vật lý.

Nếu đăng nhập sẽ đến một thiết bị khác, điều đó sẽ làm giảm bớt một số vấn đề về hiệu suất.


1
Không liên quan đến tình huống của tôi - đó là một VM được lưu trữ và các DB nằm trên một khối logic riêng biệt thành / var, được cung cấp lần lượt từ cùng một mảng lưu trữ. Tôi cho rằng về mặt lý thuyết, chúng có thể nằm trên cùng một trục quay, nhưng nó có cảm giác giống như một sự trùng hợp địa ngục :-) Điều đó nói, +1 sang một bên, bởi vì điều này hoàn toàn phù hợp với ai đó với thiết lập Debian / Ubuntu mặc định (DBs in / var / mysql, đăng nhập vào / var / log)!
James Green

@jimbo - cảm ơn vì các đạo cụ ngay cả khi nó không áp dụng trực tiếp vào tình huống cụ thể của bạn :)
warren 23/11/11
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.