2011-09-01 6 views
0

우리는 이제 Django 응용 프로그램 용 메모리 내장 캐시에 Redis를 사용하고 있습니다 (이전에는 memcached를 사용했지만 성능에는 큰 차이가 없었습니다. 디스크 덤프 기능 때문에 Redis를 사용하고 있습니다).장고 캐시 성능

문제는 장고 캐시의 성능이 제 생각에는 끔찍한 점입니다. 우리는 102 개의 캐쉬 히트 (no misses)를 가진 view를 가지고 있으며, 81 ms (장고 디버그 툴바로 측정 된 캐시 부분)를 필요로합니다. 제 의견으로는 엄청난 시간입니다. DB에 쿼리하는 데 10 배 (또는 심지어 100 배)가 걸리 겠지만, 사실 캐시 성능은 좋지 않습니다.

우리는 다른 호스트와 로컬 네트워크에 연결된 다른 서버에 Redis (및 이전에 memcached)를 실행하고 있습니다.

장고에서 캐시 성능을 조정할 수있는 방법이 있습니까?

+0

항상 캐시에서 물건을 가져 오는 데 81 밀리 초입니까? 아니면 다른 것이 포함되어 있습니까? 너는 무엇을 캐싱하고 있는가? HTML 조각 또는 복잡한 개체 또는 모델 인스턴스를 pickling합니까? –

+0

원격 호스트에서 응답을받을 때까지 81ms가 전체 요청이면 실제로 시간이 꽤 걸립니다.:) –

+0

캐시 물건 만 가져 오는 데 81 밀리 초가 걸렸습니다. 전체 요청 (캐시, 캐싱 할 수없는 SQL, 템플릿 구문 분석 등)은 약 250-300 밀리 초가 걸립니다. 우리는 작은 덩어리의 텍스트 (대다수)에서 더 큰 HTML 덩어리에 이르기까지 다른 것들을 캐싱하고 있습니다. – ThomK

답변

2

문제는 대부분 캐시 자체의 성능보다는 각 페이지에 대해 검색해야하는 항목의 수입니다. 102 캐시 호출은 네트워크 대기 시간에 많은 시간을 낭비했다는 것을 의미합니다. 코드를 완전히 제어하면 멀티 스레딩이나 파이프 라이닝으로 문제를 해결할 수 있지만이 경우에는 프레임 워크를 사용하면 훨씬 간단한 코드를 얻을 수 있습니다.

가장 쉬운 방법은 웹 서버에 redis 캐시를 옮기는 것입니다. 로컬 요청은 훨씬 빠릅니다. 캐시를 무효화하는 것은 복잡하지만 마스터 노드에 대한 모든 쓰기 작업과 로컬 슬레이브 읽기 작업을 통해 모든 노드가 동일한 캐시를 갖거나 복제에 사용 된 마스터 노드와 함께 로컬로 쓸 수 있습니다. del 명령을 사용하여 객체를 무효화해야합니다.

성능에 실제로 문제가 있는지 살펴볼 또 다른 사항은 다음과 같습니다. 페이지를로드하는 데 300ms가 걸리므로 개별 사용자의 경험과 관련해서는별로 좋지 않습니다. 그것은 모든 사용자에 대해 초당 3 페이지 이상을 처리 할 수 ​​없다는 것을 의미하는 경우에만 문제입니다.이 경우 병목 현상이 CPU 또는 로컬 I/O가 아닌 네트워크 대기 시간 인 경우는 거의 없습니다.

2

호스트 간의 네트워크 대기 시간이 그 원인 일 수 있습니다. 로컬 호스트의 Redis와 통신하기 만하면 작은 키와 값에 대해 + 200us (마이크로 초)가 소요됩니다. Memcached는 네트워크를 통해 통신하기 때문에 동일한 대기 시간 문제가 발생합니다. 공유 한 번호에 따라 각 요청은 약 800us 걸립니다.

모든 캐시가 네트워크를 통해 통신하는 것은 아닙니다. 더 빠른 방법은 캐시의 일부를 프로세스의 메모리에 직접 메모리 맵핑하는 것입니다. 여러 웹 서버를 사용하는 경우 각자 자신의 캐시를 갖지만 요청을 일관되게 (IP, 사용자 이름 등으로) 라우팅하면 캐시 실패를 줄일 수 있습니다. 데이터베이스를 별도의 호스트 시스템으로 옮겼다 고 가정하면 웹 서버에서 여분의 디스크주기를 사용할 수 있습니다.

이 방법을 사용하려면 DiskCache, Apache2 라이센스 디스크 및 파일 백업 캐시 라이브러리, 순수 Python으로 작성되었으며 Django와 호환되는 것을 사용해보십시오. DiskCache에는 cache benchmarksDjango cache benchmarks이 포함됩니다. 키와 작은 값은 Django 프로세스 메모리에 메모리 맵핑되므로 검색 속도가 매우 빠릅니다 (설정보다 3 ~ 12 배 빠름). 벤치 마크에서 볼 수 있듯이 "대기"시간은 Memcached (로컬 호스트)보다 적습니다. 원하는대로 사용자 지정할 수있는 튜너 블 settings도 있습니다.