2012-03-13 30 views
5

Tôi đang cố gắng khám phá lý do tại sao mysqld đôi khi làm bão hòa cpu và quầy hàng.chẩn đoán và tránh đột biến CPU cpu

Tôi cho rằng đó là điều cần làm với việc cập nhật chỉ mục hoặc việc bảo trì khác như vậy. Tôi muốn chứng minh giả thuyết này và xem xét các tùy chọn để tránh nó.

Đây là tình huống. Tôi có hàng chục bảng, nhưng dựa trên hoạt động, có vẻ như có ít nhất hai bảng nhất quán phải chịu đựng điều này. Hãy gọi cho họ BigSmall. Big chứa khoảng 6.000 hàng tổng cộng 1Mb (vì vậy không phải tất cả những gì lớn) và Small có hàng chục hàng, khoảng 50 byte mỗi hàng. Big có khóa ngoài là Small (InnoDB, trên xóa tầng, không phải null).

Có hai tình huống dường như kích hoạt sự cố: a) sửa đổi giá trị Big.small_id hoặc b) thêm hàng vào Small.

Tôi sẽ trực giác mong đợi a) khá nhanh chết tiệt, O(log(size of Big)) và b) hầu như tức thì vì Small quá nhỏ và không có tham chiếu nào của Big đối với nó đã thay đổi.

Trong mỗi trường hợp, lệnh SELECT tiếp theo nhận được thứ gì đó như hai mươi gigacycles (!); cái sau đó không mất thời gian chút nào. Có những bảng khác có khóa ngoài cho cả hai bảng này, nhưng tất cả đều khá nhỏ và tôi cho rằng chúng không chịu trách nhiệm về sự tăng đột biến này.

Làm cách nào tôi có thể tìm ra chỉ mục MySQL đang cập nhật và thời gian mất bao lâu?

Hoặc, nếu nó không cập nhật chỉ mục, làm thế nào tôi có thể tìm hiểu những gì khác mất quá nhiều thời gian?

Cuối cùng, tôi có thể thiết lập mysqld để ưu tiên luồng thấp hơn cho tác phẩm này và/hoặc tạm thời vô hiệu hóa chỉ mục để cho phép các mục không được lập chỉ mục (không chặn) xảy ra đồng thời với tác vụ bảo trì không?

Trả lời

1

Có lẽ có một giải pháp tốt hơn, nhưng trước đây tôi đã có một tình huống mà tôi cần phải tìm thấy những gì db/bảng đã được sử dụng rất nhiều CPU đôi khi. Tôi cronjobbed một "showlist hiển thị" và có đầu ra nối vào một bản ghi cán. Tôi đã làm điều này mỗi giây và giữ một cửa sổ cán trong 6 giờ.

+0

HIỂN THỊ processlist cho thấy một truy vấn là trong "Gửi dữ liệu" nhà nước trong một thời gian dài. Nó không mô tả nhiều hơn thế. Tôi nghi ngờ đó là một nhãn hiệu hợp lý bởi vì tôi đang trên localhost, transmisison không phải là một nút cổ chai. Nơi nào tôi đi từ đây? Cảm ơn – spraff

2

Một công cụ chẩn đoán khác mà bạn có thể xem là mytop. Về cơ bản nó là một trình bao bọc cho SHOW PROCESSLIST, nhưng nó cung cấp truy cập nhanh hơn vào dữ liệu này khi bạn thấy một vấn đề đang xảy ra và không có một cli mysql tiện dụng/có sẵn để chạy các lệnh.

Ngoài ra, có một cái nhìn tại địa chỉ: MySQL "Sending data" horribly slow