2010-02-10 23 views
5

Chúng tôi đang nhìn thấy một số hành vi lạ và chúng tôi không chắc liệu đó có phải là vấn đề với apache, php, mysql hay OS hay không, do đó, với bộ não lớn của stackoverflow!Quy trình Apache/PHP treo trong khi tương tác với MySQL

Chúng tôi có Apache và mod_php nói chuyện với máy chủ mysql5. Đôi khi, một quá trình sẽ chọn treo, cố gắng đọc từ một bộ mô tả tập tin.

đánh lửa strace một ngày của họ (tất cả các quá trình treo cho thấy kết quả tương tự) đã cho điều này:

[[email protected] ~]# strace -p 8450 
Process 8450 attached - interrupt to quit 
read(57, <unfinished ...> 

Vì vậy, những gì đã được nó cố gắng để đọc?

[[email protected] ~]# lsof -p 8450 
... 
... 
httpd 8450 apache 57u IPv4 5546599    TCP 
prweb133v.local:36615->hadat.local:mysql (ESTABLISHED) 

Đó là máy chủ mysql của chúng tôi! Ok, vì vậy có lẽ nó đã cố gắng để đọc kết quả của một truy vấn, tôi nghĩ. Kiểm tra danh sách tiến trình trên máy chủ mysql, kết nối đã được thiết lập nhưng ở trạng thái SLEEP.

Hmmmm.

Vì vậy, sau đó tôi đã kiểm tra netstat để xem ai đang cố gửi/nhận nội dung gì.

Trên webserver:

[[email protected] ~]# netstat -t -n -a | grep 36615 
tcp  0  5 172.23.179.6:36615   172.23.179.67:3306   
ESTABLISHED 

và trên máy chủ mysql đã có một kết nối được thiết lập nhưng 0 trong gửi hoặc nhận hàng đợi.

Bất kỳ ý tưởng nào về 5 byte bí ẩn này có thể là gì hoặc tại sao chúng ngẫu nhiên không nhận được máy chủ mysql?

Chúc mừng!

Mike

+0

Bạn có thể tự kết nối và truy vấn cơ sở dữ liệu và/hoặc từ các ứng dụng khác không? – jdizzle

+0

Bạn có chắc chắn rằng điều này xảy ra ngẫu nhiên và không liên quan đến một tập lệnh cụ thể? –

+0

Tôi là đồng nghiệp của Mike; khi ở trạng thái lỗi này, bạn có thể mở một trình duyệt mới hơn (nhận một phiên PHP mới) và sử dụng trang web như thể không có gì xảy ra, do đó, DB vẫn OK. Nó có thể được gắn với một kịch bản được bao gồm trên tất cả các trang, nhưng nó (cho đến nay) ngẫu nhiên như những gì trang bạn xem gây ra lỗi. – crb

Trả lời

1

Bạn đang sử dụng công cụ mysql (myisam, innodb, ...)? Bạn có sử dụng giao diện mysql hoặc mysqli ở phía php không?

Tôi sẽ cung cấp "nhật ký" và "log_slow_queries" trong tệp cấu hình mysql một lần thử (có thể tới đĩa RAM) cùng với máng rãnh đầu ra cho "SHOW GLOBAL STATUS;" trong vỏ mysql (mọi biến máy chủ kết thúc bằng "* _waits" hoặc là kết nối liên quan).

Bạn có thay đổi bất kỳ phần nào trong phần "Tinh chỉnh" của tệp cấu hình mysql không? Đã thay đổi một số bộ đệm?

Trong php.ini, bạn có giá trị mặc định (60) cho mysql.connect_timeout không? Đặt "mysql.trace_mode" thành "on" sẽ không bị tổn thương trong một thời gian.

Bạn cũng có thể muốn kiểm tra căng thẳng, nếu có thể, các phần/URL khác nhau của ứng dụng của bạn có công cụ như "ab" để thu hẹp nó.

Hoặc: Khi sử dụng apache với mô-đun prefork, khởi động cục bộ chỉ một máy chủ ("Startservers 1", "MaxSpareServers 0", một cái gì đó tương tự) và kiểm tra căng thẳng cho đến khi nó bị treo. Sau đó, các bản ghi có thể có giá trị hơn.

1

Có người e-mailled tôi từ trang này, vì vậy tôi quay trở lại với OP và nhận được bản cập nhật này về việc sửa chữa cuối cùng chúng tôi đã sử dụng:

Nó được một thời gian, nhưng như xa như tôi nhớ điều này là do một số lỗi mạng giữa máy chủ web và máy chủ mysql.Chúng tôi đã sử dụng kết nối liên tục, vì vậy tài nguyên vẫn được mở bởi apache mặc dù ở đâu đó dọc theo mạng kết nối đã chết mà không có máy chủ nào nhận thức được điều đó, tôi nghĩ đó là do tường lửa được cấu hình kém (hoặc viết) .

Chúng tôi đã ngừng sử dụng kết nối liên tục và sự cố đã biến mất.

Các vấn đề liên quan