2009-08-15 38 views
157

Gần đây, CPU máy chủ của tôi đã hoạt động rất cao.Sử dụng CPU cao của MySQL

Trung bình tải CPU 13.91 (1 phút) 11.72 (5 phút) 8.01 (15 phút) và trang web của tôi chỉ có lưu lượng truy cập tăng nhẹ.

Sau khi chạy lệnh trên cùng, tôi thấy MySQL đang sử dụng CPU 160%!

Gần đây tôi đã tối ưu hóa các bảng và tôi đã chuyển sang kết nối liên tục. Điều này có thể khiến cho MySQL sử dụng một lượng lớn CPU không?

+4

Kết nối liên tục là _almost_ luôn không phải là điều phù hợp để sử dụng. – jason

+0

tôi sẽ đưa chúng ra ngay bây giờ và xem cho một sự khác biệt bởi vì tôi không bao giờ nhớ cpu được trên 2 một tháng trước đây! – Juddling

+2

Máy chủ có xu hướng có nhiều hơn một lõi. Phần trăm sử dụng CPU được tính toán tương đối so với một lõi, anotherwords một quá trình sử dụng hết hai lõi hoàn toàn sẽ có mức sử dụng CPU là 200%. Ở đây, MySQL đang sử dụng hết 100% của một lõi và 60% lõi khác. Điều đó không có nghĩa là tất cả CPU được sử dụng hết, rất có thể anh ta vẫn có ít nhất hai CPU miễn phí. – xaav

Trả lời

211

Trước tiên tôi muốn nói có thể bạn muốn để tắt các kết nối liên tục vì chúng hầu như luôn gây hại nhiều hơn là tốt.

Thứ hai tôi muốn nói rằng bạn muốn kiểm tra lại người dùng MySQL của mình, chỉ để đảm bảo không ai có thể kết nối từ máy chủ từ xa. Đây cũng là một điều bảo mật quan trọng để kiểm tra. Thứ ba, tôi muốn nói rằng bạn muốn bật Nhật ký MySQL Slow Query để theo dõi bất kỳ truy vấn nào mất nhiều thời gian và sử dụng điều đó để đảm bảo rằng bạn cũng không có bất kỳ truy vấn nào cũng khóa các bảng quan trọng. Dài.

Một số điều khác mà bạn có thể kiểm tra sẽ được chạy truy vấn sau đây trong khi CPU đang hoạt cao:

SHOW PROCESSLIST; 

này sẽ cho bạn thấy bất cứ thắc mắc rằng hiện đang chạy hoặc trong hàng đợi để chạy, những gì truy vấn là gì và nó đang làm gì (lệnh này sẽ cắt ngắn truy vấn nếu nó quá dài, bạn có thể sử dụng SHOW FULL PROCESSLIST để xem văn bản truy vấn đầy đủ). Bạn cũng sẽ muốn theo dõi những thứ như kích thước bộ đệm, table cache, query cacheinnodb_buffer_pool_size (nếu bạn đang sử dụng bảng innodb) vì tất cả các cấp phát bộ nhớ này có thể ảnh hưởng đến hiệu suất truy vấn có thể gây ra MySQL để ăn lên CPU.

Bạn cũng có thể muốn cung cấp cho những người đọc sau khi chúng chứa một số thông tin tốt.

Nó cũng là một ý tưởng rất tốt để sử dụng một hồ sơ. Một cái gì đó bạn có thể bật khi bạn muốn nó sẽ cho bạn thấy những gì các ứng dụng của bạn đang chạy, nếu có các truy vấn trùng lặp, chúng mất bao nhiêu thời gian, v.v. PHP Profiler nhưng có rất nhiều ở đó. Nếu bạn đang sử dụng một phần mềm như Drupal, Joomla hoặc Wordpress, bạn sẽ muốn hỏi xung quanh cộng đồng vì có thể các mô-đun có sẵn cho họ cho phép bạn nhận thông tin này mà không cần tích hợp bất kỳ thứ gì theo cách thủ công.

+10

cảm ơn rất nhiều vì điều này, tôi đã xóa các kết nối liên tục và sau đó thiết lập nhật ký truy vấn chậm. tôi đã đọc nhật ký và hầu hết các truy vấn đến từ hai bảng và các bảng chưa được lập chỉ mục đúng cách! nó chỉ được khoảng 10 phút nhưng đây là kết quả: CPU trung bình tải 0,48 (1 phút) 0,95 (5 phút) 2,42 (15 phút) cảm ơn rất nhiều – Juddling

+0

cùng một vấn đề, giải quyết bằng cách lập chỉ mục các bảng mà chậm quá trình, cảm ơn bạn Steven và Juddling – gabrielem

+0

@Juddling Bạn có thể xây dựng trên làm thế nào để lập chỉ mục một bảng xin vui lòng? Có lẽ một số liên kết? Tôi biết nó đã được một thời gian, nhưng tôi thực sự mới đến điều này. Xin lỗi fr câu hỏi noobish – JayVDiyk

21

Nếu máy chủ này được hiển thị cho thế giới bên ngoài, Đó là giá trị kiểm tra nếu nó có nhiều yêu cầu kết nối từ thế giới bên ngoài (tức là người đang cố gắng đột nhập vào nó)

+0

Không chắc chắn lý do tại sao điều này thu hút một downvote vô danh, vì đây là một nguyên nhân trong quá khứ đối với một số hệ thống. –

+0

Tôi nghĩ rằng bỏ phiếu xuống là bởi vì có MySQL nhìn thấy được với thế giới bên ngoài không phải là một ý tưởng tốt. – MikeKulls

+6

@MikeKulls Không, nó không phải là một ý tưởng tốt, vì nó sẽ hoạt động như một mục tiêu cho rất nhiều người để thử và đạt được mục nhập, mà sẽ cung cấp cho một tải CPU cao - vì vậy câu trả lời của tôi là một trong những lý do có thể. –

157

Vì đây là bài đầu nếu bạn google cho MySQL sử dụng CPU cao hay tải, tôi sẽ thêm một câu trả lời thêm:

Trên ngày 01 tháng 7 năm 2012, một bước nhảy vọt thứ hai đã được thêm vào UTC- hiện tại thời gian để bù đắp cho sự quay chậm của trái đất do thủy triều.Khi chạy ntp (hoặc ntpd) thứ hai này được thêm vào đồng hồ/máy chủ của máy tính của bạn. MySQLd dường như không thích thứ hai này thêm vào một số OS'es, và mang lại một tải CPU cao. Sửa chữa nhanh là (dưới dạng gốc):

$ /etc/init.d/ntpd stop 
$ date -s "`date`" 
$ /etc/init.d/ntpd start 
+20

Kể từ khi đăng bài ban đầu là khoảng 3 năm trước đây, tôi nghi ngờ đó là nguyên nhân của vấn đề của poster ban đầu. Nhưng đó là nguyên nhân của vấn đề của tôi, và đã cứu tôi ngay bây giờ - vì vậy cảm ơn! Thông tin thêm: http://blog.mozilla.org/it/2012/06/30/mysql-and-the-leap-second-high-cpu-and-the-fix/ –

+5

Cùng một vấn đề và giải pháp cho tôi trên Ubuntu 12.04. Các bước giải quyết hơi khác nhau: dịch vụ ntp stop && date -s "' date' "&& service ntp bắt đầu Sử dụng CPU MySQL ngay lập tức giảm từ 50 - 100% xuống 0 - 1% –

+0

yup đã thực hiện trên AM2 Linux AMI của Amazon là tốt, chỉ cần hoán đổi 'dịch vụ ntpd stop/start' cho công cụ init.d. –