设计和开发后期
在一个企业级应用的开发后期阶段我们必须关注与性能相关的部分对整个系统进行调整。余下的4点就是针对工程的这个阶段。
9.模拟实际运行环境进行调整
这里的策略是查看整个系统,包括Web服务器,应用服务器和数据库服务器。可以考虑执行以下任务:
运行整个应用程序
使用厂家推荐的版本和补丁
模拟实际运行的数据
使用实际运行的资源(比如设备)
利用负载测试工具模拟用户负载
10. 利用工具识别性能瓶颈
在这个方法中,我们使系统高负载并监视所有机器的CPU,内存 , I/O和网络的使用情况。识别性能瓶颈的地方后,反复测试,查看具体的问题所在。代码段1列出了各种用于测试程序的各方面性能的工具。表1列出了各种用于测试程序的各方面性能的工具。
应用范围 | 工具举例 |
CPU 使用 | Unix中的"top"命令 (www.groupsys.com/topinfo) |
内存使用 | Unix中的"top"命令 |
I/O 使用 | Unix中的"iostat"命令 |
网络使用 | "netstat" 命令 |
Java 代码分析 | 堆栈分析工具Heap Analysis Tool (java.sun.com/people/billf/heap) Optimizeit (www.optimizeit.com) jProf (http://starship.python.net/crew/garyp/jProf.html) JProbe(www.sitraka.com/software/jprobe) PerfAnal (http://developer.java.sun.com/developer/technicalArticles/Programming/perfanal) |
负载测试 | LoadRunner (www-svca.mercuryinteractive.com/products/loadrunner) e-LOAD (www.rswsoftware.com/products/eload_index.shtml) Bean-test (www.testmybeans.com) Web Bench (www.webbench.com) Microsoft Web Application Stress tool (http://webtool.rte.microsoft.com) |
SQL 跟踪 | Oracle 中的Facility 与 TKPROF |
图2: 群集的群集:在不同层次的群集增加了系统的马力 |
public interface Person extends EJBObject { public String getFirstName() throws RemoteException; public void setFirstName(String firstName) throws RemoteException; public String getLastName() throws RemoteException; public void setLastName(String lastName) throws RemoteException; public int getPersonId() throws RemoteException; public void setPersonId(int personId) throws RemoteException; } |
public interface Person extends EJBObject |
/* ServerFacade 为服务端的EJB 提供一个统一的接口。 所有客户端的类都通过ServerFacade访问服务器 */ public class ServerFacadeBean implements SessionBean { file://缓存所有需要的EJB的home handle. /* Person EJB 的home handle*/ PersonHome personHome = null; /* Bank EJB的home handle*/ BankHome bankHome = null; ... public ServerFacadeBean() { initialize(); } public void initialize() { try { /* 初始化所有的Home handle. We could also do lazy initialization i.e., initialize as And when a home handle is needed. /* get initial context */ Context ctx = ... if ( personHome == null ) personHome = (PersonHome) ctx.lookup(“PersonHome”); if ( bankHome == null ) bankHome = ( BankHome) ctx.lookup(“BankHome”); } catch(Exception e) { /* 异常:查找失败*/ } } public PersonData getPersonData(int personId) throws RemoteException { /*使用personHome缓存的副本*/ try { Person person = personHome.findByPrimaryKey(personId); return person.getPersonData(); } catch(Exception e) { /*异常处理*/ } } public BankData getBankData(int bankId) throws RemoteException { /* 使用bankHome handle 缓存的副本*/ try { Bank bank =bankHome.findByPrimaryKey(bankId); return bank.getBankData(); } catch(Exception e) { /*异常处理*/ } } ... } |
public class ServerFacadeBean implements SessionBean { ... >// 将行向量返回给客户端 public Vector findPersonsWithFirstName( String firstName) throws RemoteException { Vector vector = new Vector(); Enumeration enumeration = null; try { enumeration = personHome.findPersonsWithFirstName (firstName); PersonData personData = null; if ( enumeration != null ) { while ( enumeration.hasMoreElements() ) { Person person = (Person)enumeration.nextElement(); personData = person.getPersonData(); vector.addElement(personData); } } } catch(Exception e) { >/* 异常处理 */ } return vector; } ... } |