在很多企业中,一些Web应用,在前期运行的时候由于用户量较小,系统压力不大,系统运营状态良好。随着时间的推移,可能由于企业内某项制度的变化,使得原本并不热门的系统,变成了大家日常都需要去使用的,由于用户量激增,原本系统设计和实现中存在的缺陷大量的暴露,而最不能让人容忍的是,系统的响应时间变长,甚至在某时段用户集中访问时,这一现象会变得让人难以忍受。这往往会导致相关业务部门和负责系统运维的技术人员承受很大的压力。本文将介绍如何针对这些的系统进行相应的优化和改进,即使没有相关的系统需要优化,也可以在系统设计和开发阶段避免相应的问题。
对Web系统的优化可以从三方面入手:页面、数据库和应用程序。
页面优化
我们可以通过FireBug、httpwatch等页面分析统计,对主要页面进行分析,查看这些页面需要加载到的图片、css样式、JavaScript脚本耗时多少时间,有没有加载失败的,或者无效的脚本、样式和图片。
针对分析结果,进行相应的优化,如:去除掉无效的图片、css样式、JavaScript脚本,根据工具显示的访问时间,找出加载耗时较长的图片,判断该图片是否过大。可以针对图片进行优化,比如采用图片压缩技术。这样能有效减少页面加载时间。还有一种优化方式,是将多个样式图片拼接在一张大图上,页面中的样式通过遮罩使用同一张图片不通的位置达到显示效果。
还可以采取的方式是对主要页面进行静态化处理。很多网站类的系统,首页承担着信息发布、用户登录和相关链接展示等多种功能,在访问量大的时候,有的系统首页加载都需要很长的时间,直接给用户造成较差的体验。解决这种问题单纯使用ajax延迟加载不能解决问题。建议采用网页爬虫,为首页和其他主要页面定时生成静态页面。http服务器会为系统中的静态页面体统代理,用户不需要请求应用服务器就可以直接访问首页,并进行登录等相关操作,对首页的静态化操作会大大减轻后台系统的压力。
数据库优化
针对数据库的优化主要是针对Sql查询语句的优化。这项工作相比起页面的优化工作难度要大一些,需要良好的sql功底和对系统业务的了解,但是有些系统的瓶颈就是存在于数据库。在系统设计阶段就需要对数据库表进行合理的规划,进来避免一个业务需要查询多张数据库表的设计方式。从系统优化的角度,我们需要检查系统内部是否存在多层嵌套的子查询,或者是大量使用in、like等作为条件匹配的命令。低效的查询语句会大量消耗服务器的CPU资源,造成系统响应缓慢。往往会出现某一个查询操作进行中,会导致业务请求无法得到响应,当该查询操作完成后,系统响应恢复正常,如果系统再运行中出现在用户量一定的情况下,响应时快时慢,那么很肯能是由于数据库原因造成的。可以通过命令查询最耗时的sql语句,然后根据抓取结果对系统中的sql进行优化。
现在互联网公司在系统实现时都会减小对数据库的依赖,早期设计的很多系统都会基于数据库脚本进行批量处理,现在设计的系统大都基于应用程序进行处理,采用一些NoSql的数据库部分替代关系型数据库,只有对事务性较强的数据才会存放在关系数据库中。目前应用程序的扩展性要远高于关系型数据库。
应用程序优化
程序员大都听过这样一句话:“用空间换时间”,这句话体现在编程中就是对缓存的应用,“空间”指的就是内存,同样是获取数据,从本地内存中读取所耗费的时间要远远小于从数据库、网络和硬盘中获取所需的时间。目前程序中的缓存大都是基于内存作为存储载体。可以将程序中一些很少发生变化的值存放在缓存中。主流的缓存经常使用键值对的方式存放数据,包括:memcache、redis等。
一些大型的电商网站,在遇到大型促销活动的时候,为了提高系统处理能力,在redis中实现对商品库存的同步减操作,使用大量的内存操作代替数据库操作,可以避免系统再大访问量的环境下出现数据库瓶颈。当前,互联网公司的系统大都部署在PC Server上,相比小型机,PC Server在配置和处理能力上并不逊色,只是机器发生故障的概率要高于小型机。解决这个问题的方式就是“以量取胜”,将数据和应用程序部署在多台PC Server上,这些PC Server互为主备,即使其中一台出现的问题,照样有其他机器负责提供服务,出现问题的机器上的数据和应用程序很快会被迁移到其他机器上,接着提供服务。近些年虚拟机技术的成熟,进一步降低了PC Server集群的部署成本。相对而言,扩展java虚拟机要比扩展数据库成本低(特别是Oracle)