2014-07-11 1 views
4

내 dynamodb 요청이 boto : get_item을 통해 너무 느리고 너무 자주 느린 이유는 무엇입니까? AWS 콘솔은 대기 시간이 12.5ms를 넘었 음을보고합니다. 내 요청 중 어느 것도 그 근처에 있지 않습니다.왜 boto dynamodb2 get_item 속도가 일관성이없고 겉으로보기에는 자주 끔찍한가요?

from boto.dynamodb2.fields import HashKey 
from boto.dynamodb2.table import Table 
from boto.dynamodb2.types import STRING 
import boto.dynamodb2 
import time 

REGION = "us-west-1" 
AWS_KEY = "xxxxx" 
AWS_SECRET = "xxxxx" 

start = time.time() 
peeps = ("cefbdadf518f44da8a68e35b2321bb1f", "7e3a691df6134a4f83d381a5507cbb18") 
connection = boto.dynamodb2.connect_to_region(REGION, aws_access_key_id=AWS_KEY, aws_secret_access_key=AWS_SECRET) 
users = Table("users-test", schema=[HashKey("id", data_type=STRING)], connection=connection) 
for peep in peeps: 
    user = users.get_item(consistent=True, id=peep) 
    print time.time() - start 

결과 :

(botot)➜ ~ python test2.py 
0.056941986084 
0.0681240558624 
(botot)➜ ~ python test2.py 
1.05709600449 
1.06937909126 
(botot)➜ ~ python test2.py 
0.048614025116 
0.0575139522552 
(botot)➜ ~ python test2.py 
0.0553398132324 
0.064425945282 
(botot)➜ ~ python test2.py 
3.05251288414 
3.06584000587 
(botot)➜ ~ python test2.py 
0.0579640865326 
0.0699849128723 
(botot)➜ ~ python test2.py 
0.0530469417572 
0.0628390312195 
(botot)➜ ~ python test2.py 
1.05059504509 
1.05963993073 
(botot)➜ ~ python test2.py 
1.05139684677 
1.0603158474 

파이썬 2.7.5 AWS 지역 미국 서부-1 2.31.1 DynamoDB의 테이블 크기 ~ 180K 기록

코드 BOTO 업데이트 2014-07-11 08:03 PST 실제 유스 케이스는 각 웹 요청에 대해 사용자를 찾고 있습니다. @ gamaat에 따르면 DynamoDB의 비용은 HTTPS 연결이 이루어지기 때문에 첫 번째 조회에 있습니다. 따라서 요청간에 DynamoDB 연결을 저장하고 재사용 할 수 있다면 상황이 더 빨라질 것입니다. 그래서 werkzeug.contrib.cache.FileSystemCache를 사용하여 연결을 저장했지만 실제로 검색을 위해 연결을 저장하는 것처럼 보이지는 않습니다. 다른 값은이 연결 객체가 아니라 잘 저장됩니다. 어떤 아이디어? 그리고 이것이 요청 간의 연결을 저장하는 좋은 방법이 아니라면 무엇입니까?

갱신 2014년 7월 11일 태평양 표준시 15시 30분 내가 관리자를 사용하고 있는데 uwsgi 내 플라스크 응용 프로그램을 관리 할 수 ​​있기 때문에, 문제가 내 플라스크에 대한 요청 사이의 연결 개체를 공유 할 수있는 방법 실제로 것 같다 앱. 이 일을하는 것이 었습니다

+0

테스트에는 서비스에 대한 HTTPS 연결을 만드는 데 소요되는 시간 (실제로는 일회성 비용)이 포함됩니다. 또한 평균 대기 시간에 대한보다 정확한 아이디어를 얻으려면 두 개 이상의 항목을 검색해야합니다. 1000 이상을 시도하고 평균을냅니다. – garnaat

답변

4

더 나은 응답 시간을 산출 할 나타나는 문제에 대한 해결책 (평균 응답 시간 ~ 500ms 이내 전에, 그리고 ~ 50ms로이 후) :

1

)는 BOTO DynamoDB의 연결을 넣어 application_config [ "DYNDB_CONN"]에 애플리케이션로드 당 한 번로드되도록 default_settings.py의 객체.

2) uwsgi의 값이 num_proccesses - 1이고 값이 더 싸게 num_proccesses - 1이되도록 구성합니다. 그러면 uwsgi가 항상 num_processes - 1 개의 uwsgi 프로세스가 항상 시작 옵션을 사용하여 실행되도록합니다. 로드가 필요한 경우 하나 더 프로세스.

이 작업은 재시작 할 uwsgi 프로세스의 수를 최소화하여 새로운 Boto DynamoDB 연결 객체 (HTTP 연결 설정 비용 발생)를 생성합니다.

+1

사실, 저는 NAT로 t1.micro를 사용하고 있었고 그게 진짜 진짜 병목이었습니다. – vovel