我们现在将Redis用于我们的Django应用程序的内存缓存(我们以前使用过memcached,在性能上没有太大区别,我们使用Redis是因为磁盘转储功能)。
问题是,在我看来,Django缓存的性能非常糟糕。我们有视图,有102次缓存命中(没有未命中),需要81ms(只是缓存部分,用Django调试工具条测量)。在我看来--这是一个巨大的时间。我知道,对数据库进行查询会花费10倍以上的时间(甚至100倍),但即便如此,缓存性能也不是很好。
我们在不同的主机上运行Redis (和之前的memcached ),通过本地网络连接到其他服务器。
有没有办法在Django中调整缓存性能?
发布于 2011-09-06 08:45:07
问题很可能是需要为每个页面检索的项数,而不是缓存本身的性能。102个缓存调用意味着大量的时间损失在网络延迟上。有了对代码的完全控制,你可能可以用多线程或流水线来解决这个问题,但在这种情况下,你没有这个选择-使用框架意味着获得更简单的代码,但代价是在边缘情况下性能较低。
最简单的修复方法可能是将redis缓存移动到web服务器上--本地请求要快得多。这将使使缓存无效变得复杂,但您可能可以使用复制来解决这个问题-要么对主节点执行所有写入并从本地从节点读取,以便所有节点都具有相同的缓存,要么在需要使对象无效时使用主节点在本地写入,用于将del命令复制到所有从节点。
另一件要看的事情是,性能是否真的是一个问题。就单个用户的体验而言,300ms的加载时间并不算太差。只有当它意味着您不能跨所有用户每秒处理超过3个页面时才会有问题-在这种情况下,瓶颈是网络延迟而不是CPU或本地I/O,这是不太可能的。
发布于 2016-03-19 11:13:01
原因可能是主机之间的网络延迟。简单地与本地主机上的Redis通信将花费+200us (微秒)来处理较小的键和值。Memcached还通过网络进行通信,因此也存在同样的延迟问题。根据你分享的数字,每个请求大约需要800us。
并非所有缓存都通过网络进行通信。一种更快的方法是将缓存的部分内存直接映射到进程的内存中。如果你使用多个etc服务器,那么它们每个都有自己的缓存,但是如果你一致地路由请求(通过IP、用户名等)。您可以减少缓存未命中。假设您已经将数据库移动到一个单独的主机上,那么您的got服务器上可能有可用的空闲磁盘周期。
如果您想尝试这种方法,可以考虑使用DiskCache,这是一个Apache2许可的磁盘和文件后备缓存库,用纯Python语言编写,与Django兼容。DiskCache包括多个cache benchmarks和Django cache benchmarks。键和小值被内存映射到Django进程内存中,因此检索速度非常快(比设置快3-12倍)。如基准测试所示,"get“延迟甚至比Memcached (在localhost上)更短。还有许多可调的settings,您可以根据自己的喜好进行定制。
https://stackoverflow.com/questions/7276176
复制相似问题