Danh sách quy trình MySQL Ngủ
Thường thì bạn không cần, nhưng khi bạn muốn xem truy vấn nào mà máy chủ MySQL của bạn hiện cần xử lý (và nếu có khóa, v.v.), bạn có thể nói Show Nhóm phát triển của bạn có đầy đủ hồ sơ tồn đọng?
Thật không may,
Điều đó cũng cho phép bạn chỉ hiển thị một số giá trị hoặc sắp xếp khác nhau, như vậy
Một ví dụ khác -- xem tất cả các truy vấn không ngủ mất một chút thời gian, ví dụ: ít nhất 2 giây
Gợi ýKhi kiểm tra danh sách quy trình trong trình bao Khi máy chủ Mysql của bạn gặp sự cố và bạn cần xác định các SQL có hiệu suất kém nhất, điều đầu tiên mà mọi quản trị viên máy chủ đang làm là mở bảng điều khiển mysql và bắt đầu đào trong SHOW PROCESSLIST hoặc SHOW FULL PROCESSLIST Trên các máy chủ có nhiều kết nối đồng thời tới nhiều cơ sở dữ liệu, bạn sẽ thấy rất nhiều hàng có các lệnh có văn bản. Ngủ Trong thời gian khi tôi đang tìm kiếm các sqls chậm, tôi không muốn bị làm phiền với các kết nối đang ngủ đó và tôi chỉ muốn xem các SQL gây rắc rối thực sự Giải pháp cho tôi trên các phiên bản Mysql mới hơn là không sử dụng lệnh SHOW PROCESSLIST, nhưng SQL tải dữ liệu từ lược đồ thông tin @runtime - Bài đăng trên blog này từ Percona có một vài gợi ý về lý do tại sao các quy trình ngủ này đang được tạo. Một số nguyên nhân phổ biến là sự cố hết thời gian chờ với máy chủ web của bạn, các truy vấn đang chạy trong thời gian dài hoặc nhiều kết nối đang chờ truy vấn hoàn tất. Cũng có thể các ứng dụng truy vấn MySQL chỉ tạo nhiều kết nối theo mặc định, như đã đề cập tại đây. Tôi đặc biệt muốn thu hút sự chú ý đến dòng này. "trừ khi ứng dụng của bạn là một ứng dụng rất bận rộn, điều bình thường là hầu như không phải mọi quy trình SQL đều có việc phải làm, vì vậy chúng ngủ. " Tùy thuộc vào số lượng quy trình đang ngủ mà bạn thấy, điều đó có thể là bình thường và không ảnh hưởng đến hiệu suất. Tuy nhiên, nếu có hàng nghìn, bạn sẽ muốn kiểm tra cấu hình của mình và điều tra thêm Bạn đã bao giờ thấy một kết nối trong đầu ra SHOW PROCESSLIST ở trạng thái "Ngủ" trong một thời gian dài và bạn không biết tại sao điều này lại xảy ra? MySQL ngủTôi thấy nếu thường xuyên với các ứng dụng web và đó thường là dấu hiệu của sự cố. Điều đó không chỉ có nghĩa là bạn có thể hết kết nối MySQL nhanh hơn dự kiến mà còn thường xuyên chỉ ra các sự cố nghiêm trọng trong ứng dụng. Nếu bạn không sử dụng các kết nối liên tục và bạn có kết nối ở chế độ Ngủ trong 600 giây thì đó có thể là gì? . Hoặc có thể bạn có một số kết nối với máy chủ MySQL và hiện đang chạy truy vấn mất nhiều thời gian như vậy? Nhiệm vụ đầu tiên là tìm xem kết nối thuộc về tiến trình nào. Sử dụng các tên người dùng khác nhau cho các ứng dụng khác nhau là một cách thực hành tốt, tuy nhiên, nó sẽ không cho bạn biết con apache nào đang xử lý yêu cầu được đề cập. Nếu bạn chỉ muốn sửa nó, tức là bằng cách khởi động lại apache thì thế là đủ nhưng nếu bạn muốn tìm hiểu tại sao nó lại xảy ra, bạn cần thêm thông tin Bạn có thể nhận thấy trong tệp “Máy chủ” của đầu ra SHOW PROCESSLIST không chỉ máy chủ mà còn cả cổng được chỉ định, hiển thị cho bạn thông tin như “192. 168. 1. 70. 58555” Cổng này có thể được sử dụng để xác định quá trình sở hữu kết nối được đề cập 1 2 [root@w1 ~]# netstat -ntp | grep :45384 tcp 0 0 192.168.1.70. 45384 192. 168. 1. 82. 3306 ĐÃ THÀNH LẬP 28540 /< php-cgi Như bạn có thể thấy trong trường hợp này, chúng ta có thể thấy php-cgi đang giữ kết nối được đề cập (đây là hệ thống dựa trên lighttpd với fastcgi) Bây giờ bạn đã biết quy trình và bạn có thể sử dụng các công cụ yêu thích của mình để kiểm tra xem quy trình đó đang làm gì 1 2 3 4 5 6 7 8 [root@w1 ~]# netstat -ntp | grep 28540 tcp 0 0 192.168.1.70. 58555 192. 168. 1. 90. 11211 ĐÃ THÀNH LẬP 28540 /< php-cgi tcp 0 0 192.168.1.70. 52711 192. 168. 1. 88. 8080 ĐÃ THÀNH LẬP 28540 /< php-cgi tcp 0 0 192.168.1.70. 45384 192. 168. 1. 82. 3306 ĐÃ THÀNH LẬP 28540 /< php-cgi tcp 0 0 192.168.1.70. 45399 192. 168. 1. 82. 3306 ĐÃ THÀNH LẬP 28540 /< php-cgi tcp 0 0 192.168.1.70. 45407 192. 168. 1. 82. 3306 ĐÃ THÀNH LẬP 28540 /< php-cgi tcp 0 0 192.168.1.70. 45408 192. 168. 1. 82. 3306 ĐÃ THÀNH LẬP 28540 /< php-cgi tcp 0 0 192.168.1.70. 35556 192. 168. 1. 92. 11211 ĐÃ THÀNH LẬP 28540 /< php-cgi Sử dụng cùng một lệnh netstat và lọc trên PID, chúng ta có thể tìm thấy quá trình này có những kết nối nào. Ở đây bạn có thể thấy nó có vài kết nối memcached. Ít kết nối MySQL (với cùng một máy chủ, nếu thường là ý tưởng tồi) và kết nối với một số máy chủ web bên ngoài Bạn có thể sử dụng strace -p để xem máy chủ đang làm gì, nó thường đưa ra manh mối. Trong trường hợp này, ví dụ, tôi đã tìm thấy quy trình bị kẹt trong cuộc gọi hệ thống pool() đọc từ mạng. Sử dụng netstat có thể cho bạn biết nó có thể là gì nhưng nếu bạn không thích đoán, bạn có thể sử dụng gdb -p. Nó sẽ không in dòng mã chính xác của bạn trong PHP đang chạy nhưng có thể cung cấp cho bạn một số ý tưởng hay – ví dụ như trong trường hợp này, tôi có thể tìm thấy dấu vết ngăn xếp có nguồn gốc từ các hàm luồng php chứ không phải từ libmysql hoặc memcache. vì vậy, điều đó có nghĩa là không phải kết nối MySQL hoặc memcache khiến ứng cử viên cuối cùng là lựa chọn duy nhất. Tôi cũng có thể thấy một số biến trong đầu ra lệnh GDB “bt” cũng gợi ý vấn đề có thể là gì Nhân tiện, có ai biết bất kỳ trình gỡ lỗi nào có thể kết nối với tiến trình PHP hoặc apache với mod_php và cung cấp backtrace theo thuật ngữ PHP không phải trình gỡ lỗi cho công cụ zend không? Một công cụ tuyệt vời khác mà bạn có thể sử dụng là server-status nếu bạn đang chạy apache. Bằng cách này, bạn sẽ thấy URL mà quy trình đó đang xử lý và do đó, bạn sẽ nhận được thêm một số gợi ý về những gì có thể đang xảy ra hoặc thậm chí nhận được ví dụ có thể lặp lại trong một số trường hợp Các công cụ tôi đã đề cập liên quan đến việc tìm hiểu những gì đang xảy ra với quy trình của chúng tôi không chỉ hữu ích để gỡ lỗi các kết nối đang ngủ với MySQL mà còn nhiều trường hợp khác khi bạn thấy ứng dụng web bị khóa hoặc bắt đầu chạy trong vòng lặp chặt chẽ tiêu tốn quá nhiều thời gian của CPU Nếu bạn biết bất kỳ công cụ nào khác có thể hữu ích về vấn đề này sẽ đánh giá cao nhận xét của bạn. Có thể có một số công cụ thông minh hơn để theo dõi quá trình sản xuất Làm cách nào để kiểm tra kết nối ngủ trong MySQL?Về cơ bản, bạn nhận được các kết nối ở trạng thái Ngủ khi. . một tập lệnh PHP kết nối với MySQL một số truy vấn được thực hiện sau đó, tập lệnh PHP thực hiện một số nội dung cần có thời gian. mà không ngắt kết nối với DB và cuối cùng, tập lệnh PHP kết thúc. có nghĩa là nó ngắt kết nối với máy chủ MySQL Làm cách nào để tránh truy vấn ngủ trong MySQL?Để khắc phục vấn đề lệnh ngủ SQL này, MySQL sử dụng hai tham số. thời gian chờ tương tác và thời gian chờ_ chờ . Những giá trị này yêu cầu phải đặt các giá trị nhất định để giúp chạy truy vấn đến thời gian đã đặt đó. Theo mặc định, cả hai tham số đã đặt giá trị là 28800 giây (i. e. 8 giờ).
Làm cách nào để xử lý truy vấn ngủ trong MySQL?Truy vấn MySQL đang ngủ là một kết nối mở không hoạt động . Khi có quá nhiều truy vấn tồn tại cùng lúc, máy chủ MySQL sẽ hết kết nối khiến máy chủ không thể xử lý các truy vấn. Tuy nhiên, giết chết các truy vấn ngủ một cách mù quáng có thể có kết quả xấu, chẳng hạn như hỏng cơ sở dữ liệu hoặc mất dữ liệu.
Cột thời gian trong danh sách quy trình hiển thị là gì?Thời gian tính bằng giây mà chuỗi ở trạng thái hiện tại . Đối với luồng SQL bản sao, giá trị là số giây giữa dấu thời gian của sự kiện được sao chép cuối cùng và thời gian thực của máy chủ bản sao. |