Drupal网站的Views模块非常有用,我们一直用它来生成一些列表,包括node的列表、term的列表等。最近在搬迁一个系列网站到阿里云美国数据中心的服务器过程中,发现RDS的磁盘IOPS一直非常高影响了使用,经过仔细排查,发现造成堵塞的主要原因都是带sort的SQL语句使得不断生成大的临时文件,再把Devel打开,找到这句SQL所在的页面,从而发现是网站的node全列表views有问题,打开views编辑发现Sort一栏中有内容,而去掉Sort条件再报错、运行就发现极少出现原来的问题了。
查了一些资料,在运行带有sort的select语句是需要产生临时文件,如果内存不够放置的话就需要写入到磁盘从而引起效率急剧下降,而我们的一些网站数据量很大,数据在几十万、几百万都有,这时临时文件也很大了,只有读写硬盘,因而让RDS的IOPS达到限制。
分析了一下,这个sort其实不是很必要,只是把所有node列出来,不是必须进行按时间排序,于是在Views中去掉了sort项,然后持续几天的IOPS过高就解决了,我准备如果还是不解决的话,甚至把这个Views整个都删除掉,即使删除也不影响网站的核心功能,用户一般还是通过搜索引擎以及各种分类页或者搜索页进到内页的,成千上万的Views页面人工不可能翻页来查看。
联想到其它网站系列在其它服务器上也造成MySQL负载高,也可能存在同样或者类似的问题,我又检查了以前做的其它一些网站系列,也确实找出这样的问题,用module或者菜单的方式修改Views后再持续观察一段。
评论