gpt4 book ai didi

python - 为什么 boto dynamodb2 get_item 速度不一致而且看起来经常很糟糕?

转载 作者:太空狗 更新时间:2023-10-30 03:01:37 29 4
gpt4 key购买 nike

为什么我通过 boto:get_item 发出的 dynamodb 请求如此缓慢,而且经常非常缓慢? AWS 控制台报告我的获取延迟已达到 12.5 毫秒的最高值。我的要求都没有那么低。

python 2.7.5AWS 区域 us-west-1博图 2.31.1dynamodb 表大小~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 PST实际用例是为每个 Web 请求查找用户。正如@gamaat 所说,DynamoDB 的成本是在第一次查找时产生的,因为那是建立 HTTPS 连接的时间。所以看来,如果我可以在请求之间存储 DynamoDB 连接并重用它,事情会进行得更快。所以我使用 werkzeug.contrib.cache.FileSystemCache 来存储连接,但它似乎从未实际存储连接以供检索。其他值可以很好地存储,只是不是这个连接对象。有任何想法吗?如果这不是存储请求之间连接的好方法,那什么才是?

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

最佳答案

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

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

2) 将 uwsgi 配置为具有 num_processes - 1 的更便宜的值,以及 num_processes - 1 的更便宜的初始值。这告诉 uwsgi 始终让 num_processes - 1 uwsgi 进程始终运行,并可选择再启动一个如果负载需要,则进行处理。

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

关于python - 为什么 boto dynamodb2 get_item 速度不一致而且看起来经常很糟糕?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24690781/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com