提升现在的软件性能,可以提升整体的web速度,可以节省些服务器费用
每次周一例会,运维经理和领导都为服务器花钱的事情伤透了脑筋!我询问了我们51ditu运维人员,分析了我们的目前网站结构,总结了几点觉得不用购买服务器也可以提升很大一块性能。(我从05年在51ditu,经历过最艰苦没有钱买服务期的状态,明白软件的改造可以明显起到效果。)
1、采用最优化的apache/tomcat web服务器软件和压缩方式
我周四出差前亲口咨询了口碑的技术总监,他告诉我口碑网的 apache 2.2.4 + tomcat 5.5.20性能比我们的apache2.0和tomcat5.0.28性能要明显好一些(我看了apache官方文档,apache2.2.4性能应该更好些)。
我们目前处理静态页面服务器是 apache2.0单线程+mod_deflate,我之前一直用apache2.0+gzip,我查了资料应该用apache2.2 +mod_deflate效果会最好。
部署方法:LoadModule deflate_module modules/mod_deflate.so (下面这段配置必须加上,我们线上的apache好像没有下面这段内容)
<ifmodule mod_deflate.c>
DeflateCompressionLevel 9
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-httpd-php
AddOutputFilter DEFLATE css js
</ifmodule>
DeflateCompressionLevel 9
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-httpd-php
AddOutputFilter DEFLATE css js
</ifmodule>
我应该可以比较肯定的认为:apache2.2.10(mod_deflate/mod_jk)+tomcat5.5.20 的软件升级可以立刻改进服务性能质量
2、apache 修改配置(MaxRequestPerChild、MaxClients、AllowOverrider None禁止查找.htaccess、等)
这一块光华以前说过,但是我看我们很多地方还是没有注意。特性造成的损失,对于安全控制,可以在设置文件中针对根目录指定AllowOverrider None禁止查找.htaccess文件,只对于特定需要访问控制的目录才打开访问控制功能。此外,还要设置XbitBack为Off来关闭缺省文档的SSI 功能,只使用AddHandler指令执行SSI文档。
为了避免一个进程服务提供过多的次数的服务造成内存垃圾,Apache定义了一个MaxRequestPerChild来规定一个进程提供服务的次数,缺省设置为30。如果服务器提供的为静态网页,产生内存垃圾的机会就很少,可以将其设置为2000或者更高。即使服务器载入了各种不同的功能模块,产生内存垃圾的机会就多一些,可以相应将这个值的设置降低一些。
为了避免服务器进程在系统空闲时被无意义的杀死,可以简单的将MinSpareServers、MaxSpa reServers和StartServers的值设置为与MaxClients的值相同。这种设置方式对于总是处于重负载的专业Web站点的设置方式,对于业余站点,就没有必要如此设置,这些值都可以设置得较小,以便来没有客户访问时,系统负载可以降低,留出处理能力完成其他任务。
为了确定服务器的最优设置,可以通过使用Apache提供的一个性能测试软件ab来进行模拟访问,这个程序缺省被安装到/usr/local/sbin中。例如使用ab向本地服务器的一个网页同时发起50个连接,共进行1000次连接,就执行:
bash-2.02$ /usr/local/sbin/ab -n 1000 -c 50 localhost/
This is ApacheBench, Version 1.2
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright (c) 1998-1999 The Apache Group, http://www.apache.org/
Server Software: Apache/1.3.4
Server Hostname: localhost
Server Port: 80 Document Path: /
Document Length: 360 bytes
Concurrency Level: 50
Time taken for tests: 3.881 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 607212 bytes
HTML transferred: 360720 bytes
Requests per second: 257.67
Transfer rate: 156.46 kb/s received
Connnection Times (ms)
min avg max
Connect: 0 0 1
Processing: 26 190 1034
Total: 26 190 1035
|
先调整相应的设置,然后使用ab模拟真实情况下的连接,来测试服务器的性能,并进一步调整参数以获得最佳的设置。
这一块优化需要我们不断测试,根据不同的应用配置不同的参数。因为不同的应用连接数是不同的,多了浪费资源,少了访问量大的时候性能不好。
3、采用数据库JNDI连接代替数据库连接池
尽管jndi也是数据库连接池,但是他通过tomcat自身管理,性能更加优化,路书项目就是采用jndi数据库连接速度很显著提升。不过这需要对目前的软件进行改善,工作量虽然不是很大。但是现在新项目很多积不出时间来
4、java web程序改进
禁止servlet和JSP 自动重载(auto-reloading)Servlet/JSP提供了一个实用的技术,即自动重载技术,它为开发人员提供了一个好的开发环境,当你改变servlet和JSP页面后而不必重启应用服务器。然而,这种技术在产品运行阶段对系统的资源是一个极大的损耗,因为它会给JSP引擎的类装载器(classloader)带来极大的负担。因此关闭自动重载功能对系统性能的提升是一个极大的帮助。这个应该在51ditu生产机上使用,不要图省事,以为tomcat不用重启服务器了。
不要滥用HttpSession通过如下的JSP页面指示符来禁止它:<%@ page session="false"%>,尽量将session的超时时间设得短一点。不要在HttpSession中存放大的数据对像:HttpSession中存放的数据对像越大,那系统的性能就下降得越快。这个如果要修改可能程序改动东比较大,但是用www4大频道可以先禁止session提升效率
将servlet页面输出进行压缩将servlet或JSP页面生成的HTML页面进行压缩的话,那用户就会觉得页面浏览速度会非常快
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
OutputStream out = null
String encoding = request.getHeader("Accept-Encoding");
if (encoding != null && encoding.indexOf("gzip") != -1)
{
request.setHeader("Content-Encoding" , "gzip");
out = new GZIPOutputStream(request.getOutputStream());
}
else if (encoding != null && encoding.indexOf("compress") != -1)
{
request.setHeader("Content-Encoding" , "compress");
out = new ZIPOutputStream(request.getOutputStream());
}
else
{
out = request.getOutputStream();
}
...
...
} 没有见别人用过,但我觉得可以尝试先内部测试一下。
throws IOException, ServletException
{
OutputStream out = null
String encoding = request.getHeader("Accept-Encoding");
if (encoding != null && encoding.indexOf("gzip") != -1)
{
request.setHeader("Content-Encoding" , "gzip");
out = new GZIPOutputStream(request.getOutputStream());
}
else if (encoding != null && encoding.indexOf("compress") != -1)
{
request.setHeader("Content-Encoding" , "compress");
out = new ZIPOutputStream(request.getOutputStream());
}
else
{
out = request.getOutputStream();
}
...
...
} 没有见别人用过,但我觉得可以尝试先内部测试一下。
5、定期删除日志和重启服务器
这个好像我们目前的运维组就是这样做的,有定时的脚本会自动重启,但不知道日志是否定时删除!
我觉得 1、2、5点是最有效也是目前最可行的立竿见影的软件提速方法。3、4虽然有点工作量,但在短期内应该可以完成。本来这封信应该在周4发出去,但是我出差了2天,一直没有时间。我想大家最好能在周一例会上定一下就仓促准备了一下。大家看看有没有道理。我觉得我们应该尽快测试,实施上去。
本文提出了五种不增加服务器成本即可显著提升Web性能的方法,包括优化web服务器软件及配置、采用JNDI数据库连接、改进Java Web程序、定期清理日志及重启服务器等。

被折叠的 条评论
为什么被折叠?



