2006年10月12日星期四

Z-Blog大访问量异常的解决方法

  Z-Blog是一个很好的单用户Blog系统,我不止一次这么说了,特别是当访问量很大的情况下,Z-Blog的表现也是可圈可点的,唯一的问题可能还是和数据库有关。

  Z-Blog之所以可以应付大访问量的负载,主要是因为其缓存(Cache)技术,在重建页面的时候,将大量数据以缓存文件的方式放在Include目录下,这样对于访客的访问就基本可以不连接数据库,而真正可能出问题的瓶颈,显然就是数据库。

  Z-Blog是基于ASP+ACCESS的,ACCESS数据库存在的问题是非常严重的,当外部连接数增大的时候,ACCESS数据库的处理能力飞快的下降,数百个同时在线连接就可以让ACCESS数据库处于死锁的状态,从而导致网站崩溃。因此,如果你的BLog日访问量有几万IP,那么你使用Z-Blog必须要面对这个数据库性能问题。

  目前Z-Blog 1.5存在的性能问题,就是对于数据库访问的问题(1.6版本已经进行了部分修改)。单个页面中,页面计数器存在对于数据库的直接访问,并且是Update方法的访问,这个访问是会带来麻烦的,由于这个计数器的存在,当在线连接数猛增的时候,Z-Blog的文章页面将出现类似死锁的界面,因为数据库会死掉。同时还会发生的事情是,所有评论留言都会死锁,因为那也是访问数据库。进而所有访问数据库的功能都会死锁。

  当然,这个问题可以使用换SQL Server来解决,不过需要修改Z-Blog的相关代码,而且如果是企业用户,需要购买价格不菲的SQL Server。ACCESS无法解决这个问题,因为其本身有不可调和的内部问题。

  如果不使用换数据库的方法,就只有在代码上下功夫了。根据我的观察,对于数据库的直接访问应该就只有计数器这个部分,我目前想到一个思路,就是将计数器的内容也当作文件写入Cache,系统读计数器,全部从Cache中读取,当进行索引重建的时候,再将Cache中的数据写入ACCESS数据库中,这样就可以做到大部分访问都脱离数据库,当在线连接数很大的时候,性能问题也有可能得到一定的解决。

  当然,这样的功能需要写不少程序代码,如果不想写代码,而又遇到异常的大访问量,那么修改Z-Blog模板删除页面计数器功能,也可以临时解决一些问题,代价是文章无法统计点击数了。