小编Ric*_*rdo的帖子

为什么运行 django 的会话清理命令会杀死我的机器资源?

我有一个一年的生产站点,配置了django.contrib.sessions.backends.cached_db后端和 MySQL 数据库后端。我选择 cached_db 的原因是安全性和读取性能的结合。

问题是,负责删除所有过期会话的清理命令从未执行过,导致会话表数据长度为 2.3GB,行数为 600 万,索引长度为 500Mb。

当我尝试运行./manage.py cleanup(在 Django 1.3 中)命令或./manage.py clearsessions(Django 的 1.5 通讯员)时,该过程永远不会结束(或者我的耐心没有完成 3 小时)。

Django 使用的代码是:

Session.objects.filter(expire_date__lt=timezone.now()).delete()
Run Code Online (Sandbox Code Playgroud)

在第一印象中,我认为这是正常的,因为该表有 6M 行,但是,在检查 System 的监视器后,我发现所有内存和 cpu 都被 python 进程使用,而不是 mysqld,填满了我机器的资源。我认为这个命令代码有一些可怕的错误。似乎python在删除每一个之前遍历所有已建立的过期会话行,一一。在这种情况下,重构为原始DELETE FROM命令的代码可以解决我的问题并帮助 Django 社区,对吗?但是,如果是这种情况,Queryset 删除命令的行为很奇怪,我认为没有优化。我对吗?

python django session

5
推荐指数
0
解决办法
3236
查看次数

标签 统计

django ×1

python ×1

session ×1