提升现在的软件性能,可以提升整体的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
天,一直没有时间。我想大家最好能在
周一例会上定一下就仓促准备了一下。大家看看有没有道理。我觉得我们应该尽快测试,实施上去。