1

我有一个访问 Web 服务(DynamoDB)的 Python 应用程序。它执行 15,000 次 POST 操作,但被限制为每秒 1,000 次。

添加日志后,我注意到每个 POST 之前都有一个资源刷新,返回总是相同的信息。

以下是日志的样子:

DynamoDB_20111205.DescribeTable: id=... time=27ms
DynamoDB_20111205.PutItem: id=... time=22ms
DynamoDB_20111205.DescribeTable: id=... time=27ms
DynamoDB_20111205.PutItem: id=... time=22ms
DynamoDB_20111205.DescribeTable: id=... time=27ms
DynamoDB_20111205.PutItem: id=... time=22ms
DynamoDB_20111205.DescribeTable: id=... time=27ms
DynamoDB_20111205.PutItem: id=... time=22ms

与预期相比:

DynamoDB_20111205.DescribeTable: id=... time=27ms
DynamoDB_20111205.PutItem: id=... time=22ms
DynamoDB_20111205.PutItem: id=... time=22ms
DynamoDB_20111205.PutItem: id=... time=22ms
DynamoDB_20111205.PutItem: id=... time=22ms

当然,我的反应是缓存“DescribeTable”操作的结果,因为它总是相同的(除了一些我不关心的位)并且对性能“增益”感到好奇。以下是我的测试的数量级:

  • 缓存:37.5 秒
  • 班级水平缓存:41.8 秒(由所有实例共享)
  • 实例级缓存:41.7 秒

我在类似的条件下重复了每一次 6 次,但没有尝试任何类型的“科学质量”测量。

编辑:这是我的代码的精简版。这是高度简化的。在真实版本中,我使用未发布版本的 Boto、DynamoDB-mapper 和 gevent 的 greenlets

#!/usr/bin/env python

class RemoteTableInfo(objects):
    def __init__(self):
        load_remote_table_info() # Triggers the "DescribeTable" in logs

class Item(objects):
    def save(self, table, ...):
        do_some_IO() # Triggers the "PutItem" in logs

class ObjectMapper_with_cache(object):
    table = None

    def __init__(self):
        cls = type(self)
        if cls.table is None:
            self.table = RemoteTableInfo()

    def do_work(self):
        cls = type(self)
        Item(cls.table, ...).save()

class ObjectMapper_no_cache(object):
    def do_work(self):
        table = RemoteTableInfo()
        Item(table, ...).save()

# Slow version
for i in range(15000):
    ObjectMapper_with_cache().do_work()

# Fast version
for i in range(15000):
    ObjectMapper_no_cache().do_work()

为什么没有缓存的版本快4我的“最聪明”尝试(类级别)

注意:我真的相信这与 Python 的内部结构有关,而不是与底层框架有关

4

0 回答 0