1

我有一个奇怪的问题,数据库由主表中的大约 27,000 个项目组成,并且以多对多链接这些项目的方式大约有 400,000 个项目。该数据库是一个 Postgresql,从 Psycopg2 运行,在 Apache2 上的 Mod_wsgi 上的 Django 服务器上。

此特定视图的渲染速度会减慢到 10-20 秒。

我很难找到这种放缓的来源。简单的日志记录告诉我,视图实际渲染的时间不到 75 毫秒,因此不是视图逻辑或模板。为视图执行的 SQL 查询总共需要大约 35 毫秒。所以有几秒钟的操作我看不到发生。

分析告诉我:

 ncalls  tottime  percall  cumtime  percall filename:lineno(function)
     5597    3.750    0.001    3.820    0.001 /usr/local/lib/python2.7/dist-packages/django/db/backends/postgresql_psycopg2/base.py:52(execute)
303114/66508    2.518    0.000    5.290    0.000 /usr/lib/python2.7/copy.py:145(deepcopy)
   297634    0.762    0.000    0.762    0.000 /usr/lib/python2.7/copy.py:267(_keep_alive)
    16627    0.622    0.000    6.145    0.000 /usr/local/lib/python2.7/dist-packages/django/db/models/sql/query.py:242(clone)
44159/22079    0.449    0.000    2.531    0.000 /usr/lib/python2.7/copy.py:234(_deepcopy_tuple)
     5597    0.423    0.000    4.653    0.001 /usr/local/lib/python2.7/dist-packages/django/db/backends/util.py:37(execute)
38706/33254    0.374    0.000    2.970    0.000 /usr/local/lib/python2.7/dist-packages/django/utils/tree.py:55(__deepcopy__)
    10961    0.367    0.000    0.599    0.000 /usr/local/lib/python2.7/dist-packages/django/db/models/base.py:326(__init__)
    16558    0.322    0.000    8.946    0.001 /usr/local/lib/python2.7/dist-packages/django/db/models/query.py:241(iterator)
     5597    0.293    0.000    2.071    0.000 /usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py:56(as_sql)
     5602    0.266    0.000    0.983    0.000 /usr/local/lib/python2.7/dist-packages/django/db/models/sql/query.py:1035(add_filter)
     5597    0.232    0.000    0.540    0.000 /usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py:242(get_default_columns)
94039/83135    0.221    0.000    1.783    0.000 /usr/lib/python2.7/copy.py:226(_deepcopy_list)
    44448    0.216    0.000    0.216    0.000 /usr/local/lib/python2.7/dist-packages/django/utils/datastructures.py:121(__init__)
    22209    0.207    0.000    0.207    0.000 /usr/lib/python2.7/encodings/utf_8.py:15(decode)
    22080    0.199    0.000    1.550    0.000 /usr/lib/python2.7/copy.py:306(_reconstruct)
     5723    0.198    0.000   15.201    0.003 /usr/local/lib/python2.7/dist-packages/django/db/models/fields/related.py:367(__get__)
     5597    0.194    0.000    0.323    0.000 /usr/local/lib/python2.7/dist-packages/django/db/models/sql/query.py:104(__init__)
    16627    0.179    0.000    6.396    0.000 /usr/local/lib/python2.7/dist-packages/django/db/models/query.py:904(_clone)
    66702    0.174    0.000    0.174    0.000 /usr/local/lib/python2.7/dist-packages/django/utils/tree.py:18(__init__)
     5597    0.162    0.000    0.787    0.000 /usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py:162(get_columns)
     5597    0.161    0.000    0.302    0.000 /usr/local/lib/python2.7/dist-packages/django/db/backends/postgresql_psycopg2/base.py:160(_cursor)
    44448    0.159    0.000    0.159    0.000 /usr/local/lib/python2.7/dist-packages/django/utils/datastructures.py:116(__new__)
    11182    0.149    0.000    0.304    0.000 /usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py:854()
    16627    0.145    0.000    0.315    0.000 /usr/local/lib/python2.7/dist-packages/django/utils/datastructures.py:136(__deepcopy__)
    40271    0.140    0.000    0.209    0.000 /usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py:40(quote_name_unless_alias)
    16558    0.131    0.000    7.713    0.000 /usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py:763(results_iter)
    34669    0.129    0.000    0.129    0.000 /usr/local/lib/python2.7/dist-packages/django/db/backends/postgresql_psycopg2/operations.py:71(quote_name)
16796/11194    0.128    0.000    0.689    0.000 /usr/local/lib/python2.7/dist-packages/django/db/models/sql/where.py:76(as_sql)
    22224    0.123    0.000    0.446    0.000 /usr/local/lib/python2.7/dist-packages/django/db/models/query.py:36(__init__)
        1    0.115    0.115    0.115    0.115 /usr/local/lib/python2.7/dist-packages/psycopg2/__init__.py:119(connect)
     5437    0.112    0.000   14.141    0.003 /usr/local/lib/python2.7/dist-packages/django/db/models/query.py:374(get)
     5598    0.111    0.000    1.232    0.000 /usr/local/lib/python2.7/dist-packages/django/db/models/sql/query.py:1235(add_q)
        1    0.109    0.109    0.109    0.109 /usr/local/lib/python2.7/dist-packages/django/template/loaders/filesystem.py:33(load_template_source)
     5602    0.108    0.000    0.561    0.000 /usr/local/lib/python2.7/dist-packages/django/db/models/sql/where.py:148(make_atom)

所以看起来对 Base.py 和 deepcopy 进行了数千次调用,但是当我查看视图的 connection.queries 值时,总共只有 7 个,总共大约 35 毫秒。

有没有人遇到过这个问题?我的视图代码中没有循环,都是正常的启发式、基于 pk 的查找和保存。

4

0 回答 0