Dogslow là Django lớp giám sát trung gian mà các bản ghi tracebacks yêu cầu chậm.
Cài đặt:
Cài đặt dogslow:
pips cài đặt dogslow
Sau đó thêm nếu vào danh sách các lớp trung gian trong tập tin settings.py Django của bạn:
MIDDLEWARE_CLASSES = (
& Nbsp; 'dogslow.WatchdogMiddleware',
& Nbsp; ...
)
Để có kết quả tốt nhất, làm cho nó một trong những middlewares đầu tiên được chạy.
Configuration:
Bạn có thể sử dụng các thuộc tính cấu hình sau đây trong tập tin settings.py của bạn để điều chỉnh các cơ quan giám sát:
# Watchdog được kích hoạt theo mặc định, để tạm thời vô hiệu hóa, thiết lập để sai:
DOGSLOW = True
# Vị trí nơi Watchdog lưu file log của nó:
DOGSLOW_OUTPUT = "/ tmp '
Yêu cầu # Log mất nhiều thời gian hơn 25 giây:
DOGSLOW_TIMER = 25
# Khi cả hai định, vết lùi email:
DOGSLOW_EMAIL_TO = 'errors@atlassian.com'
DOGSLOW_EMAIL_FROM = 'no-reply@atlassian.com'
Cách sử dụng:
Mọi yêu cầu HTTP đến được một thời gian chờ 25 giây trong các cơ quan giám sát. Nếu một yêu cầu không trả lại trong thời gian đó, các cơ quan giám sát hoạt và có một cái nhìn tại các chủ đề yêu cầu của ngăn xếp và ghi lùi (bao gồm tất cả các stack biến địa phương - Django phong cách) vào một tập tin log.
Mỗi yêu cầu chậm được đăng nhập vào một tập tin riêng biệt mà trông như thế này:
Yêu cầu Undead cản tại: 16-05-2011 02:10:12 UTC
GET http: // localhost: 8000 / delay = 2
ID chủ đề: 140539485042432
Process ID: 18010
PID Phụ huynh: 17.762
Bắt đầu: 16-05-2011 02:10:10 UTC
& Nbsp; Tệp "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/management/commands/runserver.py", đường 107, trong inner_run
& Nbsp; chạy (self.addr, int (self.port), xử lý, ipv6 = self.use_ipv6)
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", đường 696, trong run
& Nbsp; httpd.serve_forever ()
& Nbsp; File "/usr/lib/python2.7/SocketServer.py", đường 227, trong serve_forever
& Nbsp; self._handle_request_noblock ()
& Nbsp; File "/usr/lib/python2.7/SocketServer.py", đường 284, trong _handle_request_noblock
& Nbsp; self.process_request (yêu cầu, client_address)
& Nbsp; File "/usr/lib/python2.7/SocketServer.py", đường 310, trong process_request
& Nbsp; self.finish_request (yêu cầu, client_address)
& Nbsp; File "/usr/lib/python2.7/SocketServer.py", đường 323, trong finish_request
& Nbsp; self.RequestHandlerClass (yêu cầu, client_address, tự)
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", đường 570, trong __init__
& Nbsp; BaseHTTPRequestHandler .__ init __ (self, * args, ** kwargs)
& Nbsp; File "/usr/lib/python2.7/SocketServer.py", đường 639, trong __init__
& Nbsp; self.handle ()
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", đường 615, trong tay cầm
& Nbsp; handler.run (self.server.get_app ())
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", đường 283, trong run
& Nbsp; self.result = ứng dụng (self.environ, self.start_response)
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/contrib/staticfiles/handlers.py", dòng 68, trong __call__
& Nbsp; trở self.application (môi trường, start_response)
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/handlers/wsgi.py", đường 273, trong __call__
& Nbsp; phản ứng = self.get_response (yêu cầu)
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/handlers/base.py", đường 111, trong get_response
& Nbsp; phản ứng = callback (yêu cầu, * callback_args, ** callback_kwargs)
& Nbsp; File "/home/erik/work/middleware/middleware/sleep/views.py", dòng 6, trong giấc ngủ
& Nbsp; time.sleep (float (request.GET.get ('chậm trễ', 1)))
Full lùi với các biến địa phương:
& Nbsp; Tệp "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/management/commands/runserver.py", đường 107, trong inner_run
& Nbsp; chạy (self.addr, int (self.port), xử lý, ipv6 = self.use_ipv6)
& Nbsp; ... tải nhiều hơn ...
Ví dụ trên cho thấy rằng các chủ đề yêu cầu đã bị chặn lại trong time.sleep () tại thời dogslow mất bản chụp của nó.
Các yêu cầu trả lại trước khi thời gian chờ của dogslow hết hạn không bị thoát.
Lưu ý dogslow mà chỉ mất một peek tại của thread stack. Nó không làm gián đoạn các yêu cầu, hoặc ảnh hưởng đến nó trong bất kỳ cách nào khác. Sử dụng dogslow do đó là an toàn để sử dụng trong sản xuất.
Hãy cẩn thận
Dogslow sử dụng đa luồng. Nó có một nền tảng duy nhất luồn tay cầm các timeouts cơ quan giám sát và lấy tracebacks, do đó đề nghị ban đầu không bị gián đoạn. Điều này có một số hậu quả.
Đa luồng và GIL
Trong CPython, GIL (Global Interpreter Lock) ngăn cản nhiều chủ đề từ thực thi mã Python cùng một lúc. Chỉ khi một chủ đề một cách rõ ràng phát hành khóa của nó trên GIL, có thể một sợi thứ hai chạy.
Thả GIL được thực hiện tự động bất cứ khi nào một chương trình Python cho việc loại bỏ các cuộc gọi bên ngoài của người phiên dịch, ví dụ như khi làm IO.
Đối dogslow này có nghĩa là nó chỉ có thể đánh chặn đáng tin cậy yêu cầu đó là chậm vì họ đang làm IO, gọi giấc ngủ hay bận rộn chờ đợi để có được khóa tự.
Trong hầu hết các trường hợp này là tốt. Một nguyên nhân quan trọng của yêu cầu Django chậm là một truy vấn cơ sở dữ liệu đắt tiền. Vì đây là IO, dogslow có thể chặn những mỹ. Một kịch bản mà GIL CPython là có vấn đề là khi chủ đề của yêu cầu truy cập một vòng lặp vô hạn trong Python mã (hoặc Python hợp pháp mà là cực kỳ tốn kém và mất nhiều thời gian để thực thi), không bao giờ phát hành GIL. Mặc dù watchdog timer dogslow của không trở thành Runnable, nó không thể đăng nhập vào stack.
Co-thói quen và Greenlets
Dogslow được dự định để sử dụng trong một cấu hình đồng bộ công nhân. Một máy chủ web có sử dụng chủ đề dành riêng (hoặc, quá trình lao động chuyên dụng đơn luồng) để phục vụ yêu cầu. Được xây dựng trong máy chủ wsgi Django thực hiện điều này, cũng như Gunicorn ở chế độ mặc định đồng bộ-nhân viên của mình.
Khi chạy với một "đồng thói quen khuôn khổ", nơi nhiều yêu cầu được phục vụ đồng thời bởi một sợi, có thể trở thành vô nghĩa vết lùi
Yêu cầu .
- Python
- Django
Bình luận không