Dogslow 느린 요청의 역 추적을 기록 장고 감시 미들웨어 클래스입니다.
설치 :
dogslow 설치 :
dogslow를 설치 PIP
그런 다음 장고 settings.py 파일에서 미들웨어 클래스 목록에있는 경우 추가 :
MIDDLEWARE_CLASSES = (
& NBSP; 'dogslow.WatchdogMiddleware'
& NBSP; ...
)
최상의 결과를 위해, 처음 실행될 미들웨어의 하나.
구성 :
당신은 조정 감시로 settings.py 파일에서 다음과 같은 구성 속성을 사용할 수 있습니다 :
# 워치 독은 False로 설정, 일시적으로 사용하지 않도록, 기본적으로 활성화되어 있습니다 :
DOGSLOW = TRUE
워치 독은 로그 파일을 저장 # 위치 :
DOGSLOW_OUTPUT은 = '/ tmp를'
이상 25 초 복용 # 로그 요청 :
DOGSLOW_TIMER = 25
# 모두 지정, 이메일을 역 추적 :
DOGSLOW_EMAIL_TO = 'errors@atlassian.com'
DOGSLOW_EMAIL_FROM = 'no-reply@atlassian.com'
사용법 :
모든 들어오는 HTTP 요청은 감시에서 25 초 시간 제한을 가져옵니다. 요청이 그 시간 내에 반환하지 않는 경우, 감시는 활성화하고 요청 스레드의 스택을 들여다 소요 (모든 지역 스택 변수를 포함하여 - 장고 스타일) 역 추적 기록하는 로그 파일을.
각 느린 요청은 다음과 같습니다 별도의 파일에 기록됩니다
16-05-2011 세계 협정시 02시 10분 12초 : 언데드 요청에 차단
GET에 http : // localhost를 : 8000 / 지연 = 2
스레드 ID : 140539485042432
프로세스 ID : 18010
부모 PID : 17762
시작 : 16-05-2011 세계 협정시 02시 10분 10초
& NBSP; 파일 "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/management/commands/runserver.py", 라인 (107), inner_run에서
& NBSP; 실행 (self.addr, INT (self.port), 핸들러, IPv6를 = self.use_ipv6)
& NBSP; 파일 "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", 라인 (696), 실행에
& NBSP; httpd.serve_forever ()
& NBSP; serve_forever에서, 라인 227, "/usr/lib/python2.7/SocketServer.py를"파일
& NBSP; self._handle_request_noblock ()
& NBSP; _handle_request_noblock에서, 라인 (284), "/usr/lib/python2.7/SocketServer.py를"파일
& NBSP; self.process_request (요청, 수 client_address)
& NBSP; process_request에서, 라인 (310), "/usr/lib/python2.7/SocketServer.py를"파일
& NBSP; self.finish_request (요청, 수 client_address)
& NBSP; finish_request에서, 라인 (323), "/usr/lib/python2.7/SocketServer.py를"파일
& NBSP; self.RequestHandlerClass (요청, 수 client_address, 자기)
& NBSP; 파일 "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", 라인 (570), __init__에서
& NBSP; BaseHTTPRequestHandler .__의 init __ (자기, * 인수, ** kwargs로)
& NBSP; __init__에서, 라인 639, "/usr/lib/python2.7/SocketServer.py를"파일
& NBSP; self.handle ()
& NBSP; 파일 "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", 라인 (615), 핸들
& NBSP; handler.run (self.server.get_app ())
& NBSP; 파일 "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", 라인 (283), 실행에
& NBSP; self.result = 응용 프로그램 (self.environ, self.start_response)
& NBSP; 파일 "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/contrib/staticfiles/handlers.py"선 (68), __call__에서
& NBSP; 반환 self.application (싸다, start_response)
& NBSP; 파일 "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/handlers/wsgi.py", 라인 (273), __call__에서
& NBSP; 응답 = self.get_response (요청시)
& NBSP; 파일 "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/handlers/base.py", 라인 (111), get_response에서
& NBSP; 응답 = 콜백 (요청, * callback_args, ** callback_kwargs)
& NBSP; 잠에서 "/home/erik/work/middleware/middleware/sleep/views.py", 6 행, 파일
& NBSP; time.sleep (플로트 (request.GET.get ( '지연', 1)))
지역 변수와 전체 역 추적 :
& NBSP; 파일 "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/management/commands/runserver.py", 라인 (107), inner_run에서
& NBSP; 실행 (self.addr, INT (self.port), 핸들러, IPv6를 = self.use_ipv6)
& NBSP; ...로드 더 ...
위의 예는 요청 스레드의 스냅 샷을했다 dogslow시 () time.sleep에서 차단 된 것을 알 수있다.
dogslow의 제한 시간 전에 반환 요청은 기록되지 않습니다 만료됩니다.
그 dogslow는 스레드의 스택에 엿봄을 취합니다. 이것은 인터럽트 요청, 또는 임의의 다른 방식으로 영향을 미치지 않는다. dogslow 사용하기 때문에 생산에 사용하는 것이 안전합니다.
주의 사항
Dogslow는 멀티 스레딩을 사용합니다. 그것은 하나의 배경이 핸들을 워치 독 시간 초과 스레드가 원래 요청 스레드가 중단되지 않도록, 역 추적을합니다. 이것은 어떤 처벌을 받게됩니다.
멀티 스레딩 및 GIL
CPython에있어서, GIL (글로벌 통역 잠금)을 동시에 파이썬 코드를 실행에서 다중 스레드를 방지 할 수 있습니다. 만 스레드가 명시 적으로 할 수있는 두 번째 스레드 실행, GIL에 잠금을 해제 할 때.
GIL은 파이썬 프로그램이 IO를 수행 할 때 예를 들어, 인터프리터의 외부 전화를 차단하게 할 때마다 자동으로 수행됩니다 해제.
dogslow이는 만 안정적으로 그들이 잠금 자신의 취득을 대기하고, IO를하고 잠을 전화 또는 바쁜 때문에 느린 요청을 요격 할 수 있다는 것을 의미한다.
대부분의 경우이 괜찮습니다. 느린 장고 요청의 중요한 원인은 고가의 데이터베이스 쿼리이다. 이 IO이기 때문에, dogslow 그 벌금을 가로 챌 수 있습니다. 요청의 스레드가 결코 길을 방출하지, 파이썬 코드의 무한 루프 히트 (매우 비싼 또는 정당한 파이썬을하고 실행하는 데 시간이 오래 걸립니다) 때 CPython과의 GIL이 문제가 시나리오입니다. dogslow의 워치 독 타이머가 실행 가능하게 않더라도, 그것은 스택을 로그온 할 수 없습니다.
공동 루틴 및 Greenlets
Dogslow는 동기 노동자 구성에서 사용하기위한 것입니다. 전용 스레드 (또는 단일 스레드, 전용 작업자 프로세스)를 사용하는 웹 서버는 요청을 처리합니다. 기본 동기 노동자 모드에서 Gunicorn을 수행 장고에 내장 된 WSGI 서버는이 작업을 수행합니다.
여러 요청은 하나의 스레드가 동시에 제공됩니다 "공동 루틴 프레임 워크"를 실행하는 경우, 역 추적은 무의미하지 않을 수 있습니다
이 요구 사항 : 있습니다.
파이썬
장고
댓글을 찾을 수 없습니다