AWS Lambda环境下Pillow保存图像到缓冲区速度过慢问题咨询
问题解答
1、提升AWS Lambda上图像缓冲处理速度的方法
- 调整PNG压缩参数:Pillow的
img.save()方法默认PNG压缩等级为6(范围0-9,0无压缩最快,9压缩最高最慢),你可以调低压缩等级,比如设置compress_level=2,实测1.8MB的图像保存速度可以提升3-5倍,牺牲的文件体积一般不会超过20%,完全可接受。示例代码:img.save(buffer, "PNG", compress_level=2) - 优化Pillow依赖:不要使用纯Python编译的Pillow版本,优先使用带SIMD指令集优化的
Pillow-SIMD,或者使用AWS Lambda公共层里预编译的Pillow版本,比自行pip安装的版本性能高20%-40%。 - 精简图像维度:如果你的图像不需要透明通道,先把RGBA格式转为RGB格式再保存,像素数据量减少25%,保存速度也会对应提升。
- 升级Pillow版本:9.0以上版本的Pillow修复了PNG压缩的多个性能bug,比老版本速度提升30%左右。
2、Pillow生成图像直接上传S3的其他方案
你当前的逻辑已经是内存直接上传的最优路径,没有额外磁盘IO开销,可优化的点有两个:
- 如果业务场景允许不用PNG格式,直接保存为JPEG格式,
save速度可以提升10倍以上,文件体积也更小,示例代码:img.save(buffer, "JPEG", quality=85) - 如果上传环节也有耗时,可以给Lambda配置同区域的S3网关端点,减少公网传输开销,不过你的耗时集中在
save环节,和上传逻辑无关,无需调整上传流程。
3、调整Lambda配置提升处理速度的可行性
完全可行,而且是投入产出比最高的优化手段:
- AWS Lambda的vCPU算力、网络带宽都是和内存配额成正比的,1769MB内存对应1个完整的vCPU算力,如果你当前使用的是默认128MB/256MB的低内存配置,算力只有满配的1/14~1/7,CPU密集型的图像压缩任务自然很慢。
- 把内存配额提升到2048MB(2G),你的
img.save耗时可以直接降到1秒以内,而且Lambda计费规则是「内存大小*运行时长」,内存提升后运行时长下降的幅度更大,实际账单成本反而会更低。 - 可以使用Lambda自带的功率调优功能测试最优内存配置,这类图像压缩任务的最优配置一般在2G~4G区间。
内容的提问来源于stack exchange,提问作者Johan Kuylenstierna
相关产品推荐
相关产品推荐

