资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,提纲,集群相关内容,故障定位分析与系统优化,压力测试相关内容,问题解答,网络拓扑图,集群,集群(,Cluster,)是一组对外提供相同服务的服务器组,集群可以通过软件或硬件实现负载均衡(,Load Balance,,,LB,)和高可用,(High Availability,,,HA),,提高系统可靠性,集群对客户端是透明的,从客户端的角度来看,集群和单独服务器表现一致,集群具有可伸缩性,可以根据系统负荷变化情况方便的调整服务器数量,四层交换,四层交换机的基本功能,根据,IP,和端口转发,内外,IP,转换,工作在四层的,LB,和,HA,Load Balance,分发算法:源地址、最小连接数、轮循等,HA,机制:基于端口的健康检测,工作在七层的,LB,和,HA,根据,Cookie,或,URL,中的,SessionID,作分发,保证,Session,黏性,基于脚本的健康检测,可发出,HTTP,请求并根据,HTTP,返回码来判断,服务器状态(,“,/,Alteon.jsp,”,即专为,Alteon,作健康检测用),常见的四层交换机:,Alteon,、,RedWare,、,F5,四层交换的会话保持,Weblogic,集群,可以通过,BEA,提供的软件实现负载均衡(,Load Balance,,,LB,)和高可用,(High Availability,,,HA),Weblogic,集群能通过打开,Session,FailOver,来保证用户的会话不被丢失,使用集群可在部署时减少出错的机会,由于集群内的服务器需要相互通讯,所以集群会带来额外的开销,并且会减慢系统的启动速度,管理与被管,管理服务器负责配置和管理被管服务器,不承载业务。,被管服务器启动时通过管理服务器获取配置信息并接受管理服务器控制,被管服务器负责承载业务。,集群间通讯,T3,集群内服务器使用,T3,协议(,BEA,私有协议,使用)进行点对点的通讯,IP,MultiCast,(,IP,组播),单播(,UniCast,),广播(,BroadCast,),组播(,MultiCast,),集群内的服务器通过,IP,MultiCast,来进行一对多的通讯,如:心跳包,IP,MultiCast,地址范围:从,224.0.0.0,到,239.255.255.255,必须保证集群组播地址的唯一性,否则会导致集群通讯混乱。,目前的组播地址规则:,237.xxx.xxx.xxx,后面几段根据产品和版本变化,集群过大会导致集群内通讯堵塞,降低整个集群的性能,Session,什么是,Session,在服务器端保存的一个对象,用于在,web,应用程序的多个,HTTP,请求之间跟踪和一个用户的交互。在,JAVA,中是用哈希表实现,用名值对的方式保存。,Session,在服务器端的保存机制,使用哈希表保存,以,SessionID,为主键,服务器端如何确认客户端的身份,1,、,HTTP,头信息中,Cookie,Cookie:JSESSIONID=BqZsqqGjl!12345678!-87654321,2,、使用,URLRewriting,GET/,a.jsp;jsessionid,=Dvb20pXS!12345678!-87654321?a=123 HTTP/1.0,3,、服务器端只根据,SessionID,确认用户身份,所以需要防止用户,SessionID,泄漏,同时需要加强,SessionID,复杂度,防止伪造,Session,容错,Session,容错的目的是在某主机或应用当机时,或者在负载均衡设备分发错误时,保证用户会话信息不被丢失,Session,FailOver,种类:,NO,FailOver,:无,FailOver,IMR,:,In memory Replication,在,Session,复制备机内存复制,Cookie,:使用客户端,Cookie,保存,Session,信息,JDBC,:使用数据库保存,Session,信息,File,:使用文件系统保存,Session,信息,容错方式性能比较,Session,复制,Session,复制是把用户会话信息在集群内的,Session,复制备机上保存一份备份,这样在服务器当机或用户请求被送到错误主机时,,Weblogic,会从,Session,复制备机取回备份,从而保证用户会话信息不被丢失,Weblogic,使用,T3,私有协议实现,Session,复制,Session,复制中的复制组的考虑,集群内的每个服务器都可以指定自己所在的复制组和自己的优先复制组,若无复制组,则系统随机选择复制组,Session,复制的主机和备机同时更新,Session,信息时会导致系统线程死锁,Session,复制会消耗大量系统性能,并且可能造成系统堵塞,除非业务流程需要,否则不应该打开,Session,复制,Session,复制是一种容错措施,系统的正常运行不能依靠,Session,复制,Session,复制状况观察,Name,State,Known Servers,Primaries,Secondary Distributions,sso01,RUNNING,sso01 sso02 sso03 sso04 sso05,1,sso03:333,sso05:555,sso02,RUNNING,sso01 sso02 sso03 sso04 sso05,1,sso04:444,sso03,RUNNING,sso01 sso02 sso03 sso04 sso05,333,sso01:1,sso04,RUNNING,sso01 sso02 sso03 sso04 sso05,444,sso02:1,sso05,RUNNING,sso01 sso02 sso03 sso04 sso05,555,sso06,SHUTDOWN,n/a,n/a,n/a,sso03,、,sso05,优先复制组为,sso01,Session,复制的注意事项,在,Session,中保存的数据必须可序列化,保存在,Session,中的数据发生变化时,必须显式调用,setAttribute,方法,Session,复制会带来额外的性能消耗,页面分帧的情况,如果页面分为多帧,则多个子页面的请求可能会同时发到服务器,各子页面都会生成,Session,,为避免在系统生成多个,Session,,应该在父页面先把,Session,生成,或者保证子页面中只有一个页面会生成和修改,Session,SessionID,格式,SessionID,格式:,name=,sessionid,!,pjvmid,!,sjvmid,使用,Session,复制的正常情况:,http:/, Dynamic Buffer Cache Size as Percent of System RAM,队列与线程池,队列与线程池,线程池处理线程数的确定,系统每秒需要处理的请求数,系统处理请求时的平均响应时间,线程池队列长度的确定,每个保存在队列中的连接都会占用一个系统文件句柄,所以队列不应太大,Backlog,的确定,系统在作垃圾回收时会停止响应,此时操作系统会将接收到的连接保存在系统的连接队列中,若连接队列满,则系统会直接将连接拒绝掉,所以,backlog,的最小长度应该等于每秒用户请求数,最大垃圾回收时间,数据库,使用连接池是为了减少建立连接的消耗,提高性能,Pool,、,MultiPool,、,DataSouce,MultiPool,分发算法:,HA,与,LB,连接可用性检查,多余连接的回收(目前不使用),连接泄漏检测,连接池连接数目确定,若应用需要频繁访问数据库,则数据库连接池的连接数应该和执行线程数保持一致,若只有部分请求需要访问数据库,则数据库连接池连接数可以少于执行线程数(我们的大部分应用属于这种情况),具体连接数的确定应该根据实际使用时连接池中的等待情况和数据库的使用情况来确定,故障定位思路,1,、检查系统日志,包括,StartErrorInfo.txt,、,nohup,、,server.log,2,、检查应用系统错误日志,3,、检查和,kernel,的交互日志,包括,sgclient,和,sgbiz,,观察日志中的超时请求量及,sgbiz,日志中的,kernel,响应时间,4,、利用,bakerror,脚本作故障现场备份,然后检查备份下来的各类信息,堆栈分析空闲线程,分析线程堆栈的步骤:,1,、间隔,3,到,5,秒,连续作,3,次,ThreadDump,;,2,、使用,vi,或文本编辑工具查看线程堆栈情况;,3,、计算各状态线程的数量。,正常情况下,大部分线程应该都处于空闲状况。,ExecuteThread,:0 for queue:run daemon,prio,=1,tid,=0 x08895958,nid,=0 x27a6 in,Object.wait,()48afb000.48afb87c,at,java.lang.Object.wait(Native,Method),-waiting on (a,weblogic.kernel.ExecuteThread,),at java.lang.Object.wait(Object.java:429),at weblogic.kernel.ExecuteThread.waitForRequest(ExecuteThread.java:153),-locked (a,weblogic.kernel.ExecuteThread,),at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:172),堆栈分析繁忙线程,正常情况下,会有少量线程处于繁忙状况,从这些繁忙线程的堆栈可以看到一般都是在处理比较耗时的操作,,Portal,里面一般是在等待,kernel,返回消息。,若发现大量的线程都在等待,kernel,返回消息,则说明,kernel,发生堵塞。,若发现比较多的线程处于繁忙状态,但又不是在等待,kernel,返回消息,则说明此处可能有性能瓶颈,需要优化。,ExecuteThread,:142 for queue:run daemon,prio,=1,tid,=0 x0854a2f0,nid,=0 x27a6 in,Object.wait,()444f5000.444f587c,at,java.lang.Object.wait(Native,Method),-waiting on (a,mon.sgclient.QueObj,),at mon.sgclient.SGManager.doIt(SGManager.java:930),-locked (a,mon.sgclient.QueObj,),at mon.sgclient.SGManager.doIt(SGManager.java:880),堆栈分析堵塞线程,大量线程在等待某个同步锁,而该同步锁被一个线程占用,则此处属于性能瓶颈,需要优化,ExecuteThread,:1 for queue:run daemon,prio,=1,tid,=0 x08895958,nid,=0 x27a6 in,Object.wait,()48afb000.48afb87c,at java.sql.DriverManager.getConnection(DriverManager.java:158),-waiting to lock (a,java.lang.Class,),at com.aspire.getHSqlConnection(DataSourceFactory.java:79),ExecuteThread,:2 for queue:run daemon,prio,=1,tid,=0 x08895958,nid,=0 x27a6 in,Object.wait,()48afb000.48af
展开阅读全文