2013-07-06 29 views
23

Ứng dụng của tôi là thiết lập uwsgi + django. Tôi sử dụng gevent để thực hiện kiểm tra hiệu suất và chạy 1200 yêu cầu đồng thời. Tại thời điểm này, uwsgi sẽ ném ra một lỗi IO với thông điệp log sau:uwsgi ném lỗi IO gây ra bởi đường ống bị hỏng uwsgi_response_write_body_do

uwsgi_response_write_body_do(): Broken pipe [core/writer.c line 260] 
IOError: write error 

Django 1.4.0
uwsgi: 1.9.13
python: 2,6
TCP Nghe hàng đợi: 1000

Nguyên nhân của lỗi ống bị hỏng này là gì?

Trả lời

0

Lỗi này có nghĩa là máy khách đã đóng kết nối trước khi uWSGI/Django gửi phản hồi. Nó thường được gây ra bởi một thời gian chờ trong trình duyệt hoặc máy chủ web lối vào.

Để khắc phục sự cố, bạn cần xác minh rằng thiết lập của bạn là chính xác. Hãy xem để thấy rằng tất cả các phần của ứng dụng của bạn (bao gồm cả bộ điều hợp cơ sở dữ liệu) đều thân thiện với gevent. Nếu không, bạn sẽ không có lợi thế với gevent, và điều này thậm chí có thể dẫn đến giảm hiệu suất.

Ngoài ra, bạn cần đảm bảo rằng máy chủ cơ sở dữ liệu của bạn có thể quản lý 1200 kết nối đồng thời. Nếu không, nó có thể bỏ qua các nỗ lực kết nối.

+0

Không, đơn đăng ký của tôi không sử dụng gevent, tôi chỉ sử dụng gevent để thử nghiệm. – linbo

32

Điều này có thể xảy ra khi NGINX bắt đầu yêu cầu đến uWSGI nhưng uWSGI mất quá nhiều thời gian để phản hồi, sau đó NGINX đóng kết nối tới uWSGI. Khi uWSGI cuối cùng kết thúc, nó cố gắng trả lời lại NGINX, nhưng NGINX đã đóng kết nối trước đó, vì vậy sau đó uWSGI ném một lỗi I/O.

Điều này có nghĩa là quá trình uWSGI của bạn mất quá nhiều thời gian.

Cập nhật:

chế độ Harakiri uWSGI của có thể hữu ích để tự động chấm dứt như vậy quá trình chụp dài nếu bạn muốn: https://uwsgi-docs.readthedocs.io/en/latest/FAQ.html#what-is-harakiri-mode Bạn có thể không muốn làm điều này vì một quá trình có thể kết thúc một số truy vấn dài hoặc một cái gì đó mà là cần thiết.

+2

Tôi cũng gặp lỗi tương tự. Thứ bảy 31 tháng 5 01:29:36 2014 - uwsgi_response_write_body_do(): Kết nối thiết lập lại bằng peer [core/writer.c line 410] trong POST/some/url/(IP) IOError: write error - Bạn đã giải quyết được vấn đề này chưa? –

+0

Tôi tìm thấy trong /var/logs/nginx/error.log rằng nginx đã cố tạo một tệp tạm thời và không thành công do lỗi bị từ chối cho phép. Tôi đã theo dõi http://derekneely.com/2009/06/nginx-failed-13-permission-denied-while-reading-upstream/ để khắc phục sự cố về quyền. –

+0

@VijayendraBapte Liên kết không hoạt động nữa. Giải pháp là gì? – raacer

1

Bây giờ tôi không đề xuất điều này nếu bạn không cân nhắc tình huống của mình. Nhưng bạn có thể biến uwsgi_ignore_client_abort thành "bật". Với điều này bật nginx sẽ giữ cho các kết nối bị hủy mở cho đến khi uwsgi trả về. Tại sao tôi không đề nghị điều này hoàn toàn là bởi vì điều này có nghĩa là một kết nối nginx bây giờ sẽ được gắn lên cho đến khi yêu cầu kết thúc. Nhưng thực sự các chủ đề uwsgi đã không bị hủy bỏ, vì vậy hủy bỏ kết nối nginx sớm không thực sự đạt được bạn nhiều trong quan điểm của tôi.

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