Sorl-Thumbnail 中的 URL 序列化性能问题

Posted

技术标签:

【中文标题】Sorl-Thumbnail 中的 URL 序列化性能问题【英文标题】:URL Serialization Performance Issue in Sorl-Thumbnail 【发布时间】:2021-10-07 04:11:21 【问题描述】:

我在使用 sorl-thumbnail 的性能方面遇到了一些困难。我使用 S3Boto3Storage 存储后端在 S3 上托管图像,我使用 Redis 作为我的键值存储,并且所有查询都已缓存在其中。我正在使用以下依赖项:

boto3==1.17.103
botocore==1.20.105
Django==3.2.4
django-redis==4.10.0
django-storages==1.11.1
redis==3.3.11
sorl-thumbnail==12.7.0

现在我运行和计时以下脚本:

from sorl.thumbnail import get_thumbnail

images = Image.objects.all()  # 7 images
for image in images:
    x = image.file
    y = x.url                                           # 1
    x = get_thumbnail(x, '800x600', crop='center')      # 2
    x = x.url                                           # 3
    第 1 步:当我注释掉 #2 和 #3 时,脚本需要 0.193 秒 第 2 步:当我注释掉 #1 和 #3 时,脚本需要 0.0153 秒 第 3 步:当我注释掉 #1 时,脚本需要 0.669 秒 (!)

奇怪的是,当我调试第3步时,x似乎已经有了“url”属性,所以我不知道为什么要花这么长时间才能访问它。

与 Redis 的连接正在工作,对它的查询已在第二步中激活。就像我之前说的,缩略图已经生成,查找缓存在 Redis 中,所以(我相信)它与 S3 缩略图生成问题无关。

在生产中,我经常一次查询大约 50 张图像……这相当于 4 秒以上的 url 序列化……不胜感激! :)

【问题讨论】:

【参考方案1】:

好的,找出问题所在。我在设置中设置了AWS_S3_CUSTOM_DOMAIN,但在我的存储类中不小心覆盖了它:

from storages.backends.s3boto3 import S3Boto3Storage


class DefaultFileStorage(S3Boto3Storage):
     location = settings.AWS_DEFAULT_FILES
     file_overwrite = False
     custom_domain = False  # <-- Bottleneck! 

删除custom_domain = False 后,性能提升了 10 倍(字面意思)。

【讨论】:

以上是关于Sorl-Thumbnail 中的 URL 序列化性能问题的主要内容,如果未能解决你的问题,请参考以下文章

Django:模板中的 sorl-thumbnail

如何使用 sorl-thumbnail? (django)

如何显示存储在 Django 会话系统中的本地 url 的缩略图?

sorl-thumbnail 不生成占位符图像

sorl-thumbnail 的模板标签啥都不做

使用 sorl-thumbnail 的可疑操作