应用服务器的综合性能调优

来源:互联网 发布:拜占庭将军算法 编辑:程序博客网 时间:2024/05/24 02:11

今天有时间,把以前的测试过程中性能的调优作一个整理工作。

性能的调优指的是“优化程序或调整相关配置并找出执行它的最佳方式”。

现今的系统,基本都会有这三大块,DB、中间件(Server)、前端(B/C)等。

软件快要发布了,最终系统快要上线了,就在开始验证性能问题了(如果前期设计阶段、编码阶段都已经考虑性能问题,那么一般你的程序基本性能就没什么问题了,但谁又能真正的保证呢?只有经过测试验证后才知道),找到第三方性能测试工程师,或是公司内部的性能测试工程师进行测试,结果发现性能却上不去,除去架构上的错误,一般来说,对DB、中间件(Server)、前端(B/C)和操作系统的调整,基本上能使的应用程序的性能上一个更高的层次。

现象:服务器端出现N多应用程序端口号上的“CLOSE_WAIT,等很长的时间都不释放,

解决方法:

1.看看是不是应用程序问题,因为服务器端一般都会监听套接字创建,而使用完后又没有做相关的处理,从程序上解决问题,方法例c++方法中:

struct linger ling;
ling.l_onoff=1;
ling.l_linger=5;/* (
容许逗留的时间为5) */ 

 

int on=1;
if(setsockopt(ListenSock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) != 0)
....
错误返回

连接套接字创建之后,

if(setsockopt(nLocalSock,SOL_SOCKET,SO_LINGER,(const char*)&ling,sizeof(ling)) !=0)
...
错误返回

这样系统就不会出现close_wait状态的tcp套接字了。 

2.在其它应用之上,如http服务器端也会出现这样的情况,那么可能是中间间的问题,如IIS,tomcat,webphere等的问题,那么得调整中间的处理情况,把 中间修件的keepalive 时间设置小一点,以达到快速回收socket的连接,具体参见每个中间件的调整方法,如果再有时间,再整理成为一个体系。

3.对操作系统下手,这一招有点狠(嘿嘿,我自己也经常使用这招来快速解决产品上线问题,等产品上线后,其它问题再慢慢改J),说明:在一次正常的HTTP连接结束时,按正常的次序应该是服务器先发出FIN信号,客户端确认,然后客户端再发出FIN信号,服务端确认。如果客户端因为某种原因先于服务端发出了FIN信号,就会导致服务端被动关闭。那么就得进行调整TCP/IP参数来快速解决,这里举一下linux上的调整方法:

sysctl -w net.ipv4.tcp_keepalive_time=30
sysctl -w net.ipv4.tcp_keepalive_probes=2
sysctl -w net.ipv4.tcp_keepalive_intvl=2

 

现象2,在对WEB服务器进行性能测试时,“503错误”是大家最常见,这种情况下有可能是connection pool原因产生,排查方法:

1.看看是不是中间件的原因,tomcat,apache,都进行调整一下,基本上这这几个参数:minSpareThreadsmaxSpareThreadsmaxThreadsMaxKeepAliveRequestsMaxClientsMaxRequestsPerChild等这些参数,请在原来基础上的值进行增加。

2.如果上面的方法还不行,请查看一下与DB服务器的连接池是不是满了,一种方法可以上DB服务器上查,另一种更简单的方法,使用命令行方法查,netstat –an|grep “1521”|wc –l 查出有多少个连接中的,如果占有你设置的connection pool80%以上,那么增加你的数据库connection pool的数量。使之保证connection pool够用。

 

综述,性能的调优工作不难(这是指B/S或是C/S结构应用服务),得一步步的调,可能会花上一到两周的时间才能完成,甚至更长,因为一般的步骤是:

1.给出测试模型。

2.进行性能测试,看性能是否达到理想状态。

3.如果性能不理想,调整与之相关的性能参数指标,并作记录调整了什么参数,调整前的值是。

        4.调整与应用服务的中间件配置,如connection poolThreads相关等参数

        5.调整操作系统参数,一般都调整线程数、TCP/IP参数,

        6.调整DBS相关参数,如连接池、内存分配

 

7.重复2456步骤,直到提升至最佳运行状态。

 

这些都是在最后产品上线阶段能调整的,而有些东西是无法在现阶段做到调整了,所以,要想性能达到一个理想的指标,必须从架构设计,详细设计,编码阶段都要考虑好,如业务逻辑设计,数据设计  (表结构设计,数据建模)、页面是否使用Ajax技术,页面是否要使用存储过程(使用存储过程不利于以后程序的扩展和衍生)、SQL 语句的写法、程序资源分配,代码是否最优化等。

所以应用服务高效的性能不光是调整可以做出来滴,得综合所有情况,以致力于应用服务达到最佳运行状态。

 

原创粉丝点击