Tôi có một hệ thống được viết bằng python xử lý lượng lớn dữ liệu bằng cách sử dụng các trình cắm được viết bởi một số nhà phát triển với các mức trải nghiệm khác nhau.Tìm plugin cpu-hogging trong python đa luồng
Về cơ bản, ứng dụng bắt đầu một số chuỗi công việc, sau đó cấp dữ liệu cho chúng. Mỗi chuỗi xác định plugin để sử dụng cho một mục và yêu cầu nó xử lý mục. Một plug-in chỉ là một mô-đun python với một hàm cụ thể được định nghĩa. Quá trình xử lý thường liên quan đến các cụm từ thông dụng và không nên mất nhiều hơn một giây.
Thỉnh thoảng, một trong các plugin sẽ mất phút để hoàn thành, chốt CPU trên 100% trong toàn bộ thời gian. Điều này thường được gây ra bởi một biểu thức chính quy phụ tối ưu kết hợp với một mục dữ liệu cho thấy sự kém hiệu quả đó.
Đây là nơi mọi thứ trở nên phức tạp. Nếu tôi nghi ngờ thủ phạm là ai, tôi có thể kiểm tra mã của nó và tìm ra vấn đề. Tuy nhiên, đôi khi tôi không may mắn như vậy.
- Tôi không thể đi đơn luồng. Có thể mất tuần để tái tạo sự cố nếu tôi làm.
- Việc đặt bộ hẹn giờ trên plugin không hiệu quả, bởi vì khi nó bị đóng băng, sẽ mất GIL với nó và tất cả các plugin khác cũng mất vài phút để hoàn thành.
- (Trong trường hợp bạn đang tự hỏi, SRE engine doesn't release the GIL).
- Theo như tôi có thể nói profiling là khá vô ích khi đa luồng.
Viết lại toàn bộ kiến trúc thành đa xử lý, bất kỳ cách nào tôi có thể tìm ra ai đang ăn tất cả CPU của tôi?
THÊM: Trong câu trả lời cho một số ý kiến:
profiling mã đa luồng trong python không hữu ích vì các hồ sơ đo tổng thời gian chức năng và không phải là lần cpu hoạt động. Hãy thử cProfile.run ('time.sleep (3)') để xem ý tôi là gì. (ghi có vào rog [nhận xét cuối]].
Lý do đi đơn luồng là khó khăn là vì chỉ có 1 mục trong 20.000 gây ra sự cố và tôi không biết đó là vấn đề gì. Chạy đa luồng cho phép tôi trải qua 20.000 mục trong khoảng một giờ, trong khi luồng đơn có thể mất nhiều thời gian hơn (có rất nhiều thời gian chờ của mạng). Có một số biến chứng mà tôi không muốn đi vào ngay bây giờ.
Điều đó nói rằng, không nên cố gắng tuần tự hóa mã cụ thể gọi các plugin để thời gian của một người sẽ không ảnh hưởng đến thời gian của những người khác. Tôi sẽ thử và báo cáo lại.
Phần nào của thông tin lược tả đang bị sai lầm bởi đa luồng? –
Bạn có thể vui lòng giải thích lý do tại sao chuỗi đơn sẽ không hoạt động? Nếu các trình cắm thêm không bao giờ giải phóng GIL, thì bạn sẽ không có bất kỳ xử lý song song nào xảy ra ở tất cả và làm nó đa luồng sẽ không giúp ích gì. –
"Tôi không thể đi đơn luồng. Có thể mất vài tuần để tái sản xuất vấn đề nếu tôi làm"; Sai rồi. Có lẽ sẽ đơn luồng, bạn sẽ có kết quả nhanh hơn so với luồng. – nosklo