如何测量Django缓存性能?

5 投票
5 回答
3423 浏览
提问于 2025-04-15 11:25

我有一个比较小的网站(每天大约有4500次浏览),它是用Django搭建的,数据库用的是PostgreSQL 8.3。

我现在把数据库当作缓存和会话存储来用。我听说用Memcached来做这个会比较好,我也想试试。不过,我想知道换成Memcached后具体会有什么好处:我在想,可能我的网站规模不大,换了更好的缓存系统也未必能有什么明显的改善。关键是:安装和配置Memcached的工作不是我来做的,我不想浪费别人的时间,尤其是如果效果不大的话。

我该如何衡量使用数据库作为缓存后带来的额外负担呢?我看过django-debug-toolbar,但如果我没理解错的话,这个工具不太适合用在生产环境中(因为它需要把DEBUG=True设置为开启)。不幸的是,我在我的笔记本上无法完全复现生产环境的设置(我的操作系统、CPU和内存都不一样)。

有没有人对不同的Django缓存/会话存储做过性能测试?有人知道如果我每次请求都写入一次会话,性能差异会有多大吗?

5 个回答

2

简单来说:如果你的电脑有足够的内存,memcached会一直比数据库快。其实你没法直接比较memcached和数据库缓存的速度,记住,服务器的主要瓶颈在于硬盘的访问,尤其是写入的时候。

不过,如果你有很多对象需要缓存,而且这些对象的过期时间很长,那么硬盘缓存会更好。但在这种情况下,如果你想要超快的性能,最好用Python脚本静态生成页面,然后用lighttpd或nginx来提供这些页面。

对于memcached,你可以调整分配给服务器的内存大小。

3

DiskCache项目发布了一些关于Django缓存的比较数据,这些数据比较了本地内存、Memcached、Redis、基于文件的缓存和diskcache.DjangoCache。DiskCache的一个额外好处是,它不需要单独的进程(这点和Memcached和Redis不同)。它会把缓存的键和值直接映射到Django的进程内存中。一般来说,从缓存中获取数据的速度比在本地使用Memcached要快。还有一些设置可以控制内存中保留多少数据,其余的数据则会被存储到硬盘上。

5

在我之前的工作中,我们尝试测量缓存对我们开发的网站的影响。在同一台机器上,我们对10个最常用的起始页面(物品列表)进行了负载测试,还随机选取了一些从大约200000个页面中挑选的物品详情页面。结果显示,访问请求的数量从每秒150个增加到了每秒30000个,而数据库查询的次数则减少到了每个页面1到2次。

我们缓存了以下内容:

  • 会话信息
  • 每个页面上显示的物品列表
  • 次级物品和常见内容(每个页面都有的内容)
  • 物品类别列表和其他一些分类属性
  • 物品计数器(通过定时任务离线计算)
  • 单个物品

总体来说,我们只使用了低级别的细粒度缓存,而没有使用高级缓存框架。这需要非常仔细的设计(每当数据库状态发生变化,比如添加或修改任何物品时,缓存必须正确失效)。

撰写回答