我们选用Drupal的一个重要原因是其对多语言的支持,在实际使用中也发现多语言支持的一些问题,特别是对数据库负载的影响很大,我们已经想过不少办法了。例如:Drupal设置Memcache缓存、修改缓存翻译词的长度、减少翻译相关数据表的尺寸等。
这两天对一台阿里云RDS负载问题进行排查的时候,再次开启Devel来查看IP Location系列典型页面的SQL查询语句,从几个方面进行了优化:
- 关闭不是很必要的模块,例如theme color, dashboard, comment等,可以减少几次数据库查询次数;
- 发现amp版本显示模板中的问题:已经不用的内容,没有输出,但却没有去掉或者注释掉,ip的留言功能的一些代码,在web版本注释掉了,但在amp/mip版本中没有注释掉,现在注释掉后,一个amp的sql查询数量从60多下降到30多;
- locale翻译功能调用数据库查询的次数特别多,对这个文档详细看了源代码,了解了原理,对翻译词进行精简、合并,降低了几次数据库查询;
- 有个地方默认是75个字符进行缓存到memcache,我改为30个字符后,这个设置缓存的语句就不卡了,但会导致30个字符以上就不缓存,我还原到75就可以缓存更多的内容,但设置缓存的这句又引起查询过慢,反复测试,现在从30改为55了,降低了不少SQL查询次数到20次左右。
这样就将部分页面的数据库查询次数降低了一大半,应该对RDS负载降低起到很好的作用。后面还可以再详细看memcache服务及Drupal与memcache接口的文档,看能否调整缓存的大小等,让速度进一步加快。
2021年3月24日补充:可以通过修改Drupal的locale_cache_length变量,让memcache缓存更多的翻译内容,如果安装了drush就很简单:执行drush vset locale_cache_length 200,就可以把默认的75改为200。
评论