다양한 웹 서비스와 통신하는 Django 프로젝트에서 Python을 실행하면 때때로 평소에 < 100ms가 아닌 약 5 초가 걸리는 문제가 있습니다 .Python`socket.getaddrinfo` 요청이 약 0.1 초 정도 걸리는 것
requests
우리가 외부 서비스에 연결할 때 함수가 호출 한 시간이 단축되었지만 클러스터의 Postgres 데이터베이스 상자에 기본 Django 연결이 적용된 것처럼 보입니다. 배포 후 uwsgi
을 다시 시작하면 들어오는 첫 번째 요청에 응답을 보내기 위해 5 초가 걸립니다. 나는 또한 우리의 셀러리 작업이 정기적으로 5 초가 걸린다 고 생각하지만 아직 statsd 타이머 추적을 추가하지 않았습니다.
내가 문제를 재현하는 몇 가지 코드를 작성했습니다 :
import socket
import timeit
def single_dns_lookup():
start = timeit.default_timer()
socket.getaddrinfo('stackoverflow.com', 443)
end = timeit.default_timer()
return int(end - start)
timings = {}
for _ in range(0, 10000):
time = single_dns_lookup()
try:
timings[time] += 1
except KeyError:
timings[time] = 1
print timings
일반적인 결과가를 {0: 9921, 5: 79}
내 동료가 이미 IPv6를 조회 시간의 주위에 잠재적 인 문제를 지적했고 /etc/gai.conf
이 추가되었습니다 :
precedence ::ffff:0:0/96 100
curl
과 같은 비 Python 프로그램의 조회가 확실히 향상되었습니다. 우리는 사용하지만 Python 자체에서는 사용하지 않습니다. 서버 박스는 Ubuntu 16.04.3 LTS를 실행 중이고 파이썬 2를 사용하여 바닐라 VM에서 이것을 재현 할 수 있습니다.
모든 파이썬 조회의 성능을 향상시키기 위해 취할 수있는 조치는 무엇입니까 < 1s ?
결과를 캐싱하고 셀러리 등을 사용하여 결과를 갱신하는 것은 어떻습니까? –
당신의 DNS 리졸버가 느린 것처럼 들리지만, ncsd를 시도해보십시오. – georgexsh
@YaroslavSurzhikov 캐시에 대해 어떤 제안을 하시겠습니까?그리고 파이썬 서버 코드 *가 * 캐시를 업데이트 할 때를 제외하고는 느린 요청을 실행해야하므로 캐시를 업데이트하고 유지해야한다고 제안하는 방법은 무엇입니까? – jamesc