为什么boto dynamodb2 get_item速度不一致而且看似频繁可怕?

时间:2014-07-11 05:44:21

标签: python amazon-web-services boto amazon-dynamodb

为什么我的dynamodb请求通过boto:get_item如此缓慢而且经常非常慢? AWS控制台报告我的获取延迟达到了12.5毫秒的高位。我的要求都没有接近那么低的水平。

Python 2.7.5 AWS区域us-west-1 boto 2.31.1 dynamodb表大小~180k记录

代码:

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

更新2014-07-11 08:03太平洋标准时间 实际的用例是为每个Web请求查找用户。正如@gamaat所说,DynamoDB的成本是第一次查找,因为那是在进行HTTPS连接时。因此,似乎我可以在请求之间存储DynamoDB连接并重用它,事情会更快。所以我使用werkzeug.contrib.cache.FileSystemCache来存储连接但它似乎永远不会存储连接以进行检索。其他值得到妥善存储,而不是这个连接对象。有任何想法吗?如果这不是存储请求之间连接的好方法,那么是什么?

更新2014-07-11 15:30太平洋标准时间 由于我使用supervisor和uwsgi管理我的Flask应用程序,似乎问题实际上是如何在我的Flask应用程序请求之间共享连接对象。

1 个答案:

答案 0 :(得分:4)

问题的解决方案似乎产生了更好的响应时间(在平均响应时间为~500ms之前,并且在约50ms之后)是做两件事:

1)将Boto DynamoDB连接对象放在default_settings.py中,以便每次应用程序加载时将其加载到app.config [“DYNDB_CONN”]中;和

2)配置uwsgi有一个更便宜的num_proccesses值 - 1,更便宜 - num_proccesses的初始值 - 1.这告诉uwsgi总是有num_processes - 1个uwsgi进程一直在运行,可以选择再启动一个如果负载需要它。

我这样做是为了最小化重启的uwsgi进程数,从而创建一个新的Boto DynamoDB连接对象(产生HTTP连接设置成本)。