django后台加载从15秒优化到1秒的过程小记
之前django的后台管理的管理的项目很慢,打开个页面得花十几秒甚至二十秒,经过不断努力优化,终于优化到1秒左右了,很舒服。
先定位慢的主要原因,首先有个表大概有200万条数据,而且机器每天不停地写入,增长很快。再利用diango-debug-toolbar很方便查看出哪些东西耗时,主要查看各种耗时的sql语句。
主要耗时的部分包括:django分页,list_filter,date_hierarchy,有个字段调用第三方接口
list_filter,date_hierarchy优化参见:
https://blog.csdn.net/u011519550/article/details/97521761
django分页优化参见:
https://blog.csdn.net/u011519550/article/details/98469725
进行完上面的优化后,页面加载时间大概需要6秒。
之后又将机器和编辑用的表分开,编辑的表很小,这样其实前面的sql耗时几乎可以忽略了。但是页面加载时间仍然需要6秒左右。
最后又定位了调用外部接口的一个字段需要四五秒。
因为字段是同步调用的,每个列表页二十个,每个调用大概0.2秒。加起来时间就久了。最终我的解决方法就是利用多线程同时请求接口获取数据。
核心就是重写ChangeList的get_results方法,拿到20个model对象后,开启20个线程调用接口获取数据,存入缓存,渲染字段时直接从缓存中拿数据。ps:这是难得不百度(貌似是没百度到。。。),自己搞定的东西。。。所以看源码还是有用的
from django.contrib.admin.views.main import ChangeList
class ChangeListAdmin(ChangeList):
def get_results(self, request):
thread_list = []
#get all of model object from current page list
super(ChangeListAdmin, self).get_results(request)
for model in self.result_list:
t = Thread(target=self.get_ctr, args=(model,))
t.start()
thread_list.append(t)
for t in thread_list:
t.join()
因为重写了ChangeList,所以admin.py中注意重写get_changelist方法,用我们自己重写的ChangeListAdmin类
def get_changelist(self, request, **kwargs):
return ChangeListAdmin
做完这个优化后,调用接口的时间缩小到1秒多了。
但是有时候调用接口会timeout,索性直接不调接口直接查询数据库了,应该是56核 256G内存的服务器性能比较强劲,直接查数据库后获取这20个字段的时间基本缩小到0.5秒内了。
现在整个页面打开只需要1秒左右了。
上一篇: antv G2 新手示例
下一篇: Mybatis源码解析(二)