首先介绍下情况,并发量最多可达到万级,应用程序架构是基于SSH的,系统级是通过Apache分发,集群配置。但是目前情况不理想,我对系统级架构都是在钻研期间,下面是自己查的总结,但还是不怎么理想,各位熟悉的敬请赐教
1. 对于应用程序级,在SSH框架中,性能优化的措施有:
1)节省事务占用内存,通过AOP分配不同业务层,节省事务内存开支
2)对常用的数据进行缓存,提高性能,对内存占有量提升,矛盾中。。
3)代码级优化,这个问题不能改的太全面,毕竟项目庞大,时间上是个问题
4)高并发量,使用Hibernate是个问题,但是这个时候更换技术架构是个问题
对于高并发技术框架应该不是根本问题,数据库集群和应用服务器集群应该是重点问题,但是这方面还是欠缺,很是着急。。。熟悉的人敬请赐教
2. 系统级性能优化目前想到的措施是:
1)负载均衡,集群方案
2)数据库集群
这两个问题可能是关键,熟悉的人敬请赐教了
3. 对于JVM的考虑:
1)由于Hibernate缓存使用,JVM内存分配是个问题
加重GC负担,并且当持续使用的情况下,很可能内存不够用,然后就崩溃了,经常的问题就是内存溢出
有熟悉的人希望给些建议
问题补充
关于系统级解决方案能给点建议吗? 目前是通过Apache进行复杂均衡,四个Tomcat,具体性能问题还不清楚在哪里?高并发后就出现内存溢出问题,服务器瘫痪,Session丢失,敬请赐教
问题补充
Hibernate中常用数据使用了缓存,很多操作都采取了读缓存,但问题还是出现,内存溢出,服务器瘫痪,Session丢失
问题补充
代码检查过了,我怀疑是系统级的问题,应用程序代码等也都检查过。 目前服务器上的内存是16G JVM内存是4G 在JVM中也对新生态和长久态都做了根据情况的设定
问题补充
Cookie和Session都有用到,IO操作是很多,文件服务器和Web项目是不同的服务器,IO包括图片文件以及日志等。
测试下关键的方法时间和观察JVM线程两个问题是个思路
问题补充
数据库是Oracle 服务器是Linux 4个,网络带宽够用,移动的项目。 软件方面Apache(之前是两个),后来换一个。
二级缓存使用过多,我担心JVM的长久态过多,增加GC的压力,所以在配置JVM中,将长久态的内存放大些,因为总是溢出。 研究下hibernate的memcached
问题补充
项目经历两年了,最早的版本应该没问题,所以检查就是新的代码,例如异常连接关闭,还有就是对异常处理,这些是对代码检测。程序框架没有修改,对于代码没有更新非常大,就类似打补丁了
问题补充
恩 我也是觉得Session是个瓶颈,也做了些小的处理。 数据库方面Hibernate,JDBC混合式的
问题补充
哦 可能我没说明白,这个并发量是最大的情况,大约在中午左右,访问量最大时候的并发量
问题补充
我先把程序后台发现的问题先贴出来。 部分BUG我也都解决了,应用程序集问题把重要的贴出来,我在网上也查些资料。把棘手的贴出来,感谢大家了
1.java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at org.apache.jk.common.ChannelSocket.send(ChannelSocket.java:531)
at org.apache.jk.common.JkInputStream.endMessage(JkInputStream.java:121)
at org.apache.jk.core.MsgContext.action(MsgContext.java:304)
at org.apache.coyote.Response.action(Response.java:183)
at org.apache.coyote.Response.finish(Response.java:305)
at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:195)
at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:283)
at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:767)
at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:697)
at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:889)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
at java.lang.Thread.run(Thread.java:619)
Mar 31, 2010 5:38:52 AM org.apache.jk.common.ChannelSocket processConnection
WARNING: processCallbacks status 2
2. com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
WARNING: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@f0da27b -- APPARENT DEADLOCK!!! Complete Status:
Managed Threads: 3
Active Threads: 0
Active Tasks:
Pending Tasks:
com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@66b6837
Pool thread stack traces:
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1,5,main]
java.lang.Object.wait(Native Method)
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:534)
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,main]
java.lang.Object.wait(Native Method)
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:534)
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0,5,main]
java.lang.Object.wait(Native Method)
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:534)
3.Exception in thread "process reaper" java.lang.OutOfMemoryError: Java heap space
at java.io.BufferedOutputStream.<init>(BufferedOutputStream.java:59)
at java.io.BufferedOutputStream.<init>(BufferedOutputStream.java:42)
at java.lang.UNIXProcess$1$1$1.run(UNIXProcess.java:123)
问题补充
数据库也需要做负载
高并发请求,其实还是在架构上多下功夫,代码级别因为为次要的(当然也很重要)。
高并发量请求,应用服务器需要做负载,数据库也需要做负载
应用服务器负载形式很多种(lvs,haporxy,nginx,dns轮询,f5上面这些可以结合使用)
数据库的负载相对来说单一(集群,读写分离),当然要考虑好对数据库性能和操作数据库方法的调整,减少事务的使用范围。
jvm优化主要是参数的配置,hibernate缓存的使用需要设计好,如果系统做分布式集群单机cache如何保证有效性,考虑无键值数据库或者memcache着一类的东西吧。
说了这些,你可能觉的比较笼统
我觉的问题是这样的,你的并发大,关键是你是什么类型的应用。
对数据库操作什么类型的比较多,是都要保证事物的,还是对事物要求一般,是查询多呢,还更新插入多。
如果都是事物保证型的数据库操作,那么在数据库压力分解上还需要使用平行分库
实现数据库横向(集训)和纵向(水平分库,单数用户放到a数据库,双数用户放到b数据库【不一定如此分,举例】)的压力分解
恩我觉得代码上应该不是主要的瓶颈,昨天我在代码上已完成些优化,查询相对多些,将查询事务干脆去掉了。服务器分发上F5和Apache两者选择。数据库上没有进行负载,JVM的参数设置上,综合考虑的,因为缓存多,永久太多些,所以就根据情况多分了些, 我也担心是Hibernate缓存没有合理运用,目前也是使用ecache,系统分布式集群也可能有问题
问题补充
http://tech.it168.com/o/2007-11-02/200711021343406.shtml
一个Yahoo和MOP都参加过架构的一个人的文章,和大家分享下,应该有所思考
群:157094416 找到的文章。
------------------------------------------------------------------------------------------------------------------
问题补充:
恩 CDN 和镜像的好处在于?
------------------------------------------------------------------------------------------------------------------
问题补充:
恩 周末我在看看官方的一个权威Tomcat手册,希望能找到方案
事务也是要的,对于增删改需要的,对于查询考虑应该不用
------------------------------------------------------------------------------------------------------------------
问题补充:
恩 SocketException 通道堵塞可能是你所说的,前台界面用了Freemarker代替JSP的,渲染Fremarker可能是有问题
------------------------------------------------------------------------------------------------------------------
问题补充:
我有个疑问JavaEye为什么把这给帖子由论坛放到问答栏目了? 我觉得这是做高访问量都可能遇到的一个问题,找到通用的解决方案和成熟的思路,这是所有JavaEye爱好者集思广益,讨论出更好的解决方案。。而不单单是个问答栏目的一个题目。。 不理解后台管理员在搞什么。。 算了我还是有时间研究下官方的Tomcat吧。。。 很感谢那么多人提出的建议,我会总结下
------------------------------------------------------------------------------------------------------------------
问题补充:
附件里是我刚简单的画了下部署图,和之前做了些改动,目前没有服务器瘫痪,但只是暂时解决,问题瓶颈还在研究中。。。 先巩固客户了
感谢各位了
------------------------------------------------------------------------------------------------------------------
问题补充:
1. 对于应用程序级,在SSH框架中,性能优化的措施有:
1)节省事务占用内存,通过AOP分配不同业务层,节省事务内存开支
2)对常用的数据进行缓存,提高性能,对内存占有量提升,矛盾中。。
3)代码级优化,这个问题不能改的太全面,毕竟项目庞大,时间上是个问题
4)高并发量,使用Hibernate是个问题,但是这个时候更换技术架构是个问题
对于高并发技术框架应该不是根本问题,数据库集群和应用服务器集群应该是重点问题,但是这方面还是欠缺,很是着急。。。熟悉的人敬请赐教
2. 系统级性能优化目前想到的措施是:
1)负载均衡,集群方案
2)数据库集群
这两个问题可能是关键,熟悉的人敬请赐教了
3. 对于JVM的考虑:
1)由于Hibernate缓存使用,JVM内存分配是个问题
加重GC负担,并且当持续使用的情况下,很可能内存不够用,然后就崩溃了,经常的问题就是内存溢出
有熟悉的人希望给些建议
问题补充
kimmking 写道
你说对了
2. 系统级性能优化目前想到的措施是:
1)负载均衡,集群方案
2)数据库集群
2. 系统级性能优化目前想到的措施是:
1)负载均衡,集群方案
2)数据库集群
关于系统级解决方案能给点建议吗? 目前是通过Apache进行复杂均衡,四个Tomcat,具体性能问题还不清楚在哪里?高并发后就出现内存溢出问题,服务器瘫痪,Session丢失,敬请赐教
问题补充
soci 写道
读缓存 写异步
Hibernate中常用数据使用了缓存,很多操作都采取了读缓存,但问题还是出现,内存溢出,服务器瘫痪,Session丢失
问题补充
pejaming 写道
1.检查代码
2.给tomcat加内存
3.给机器加内存
2.给tomcat加内存
3.给机器加内存
代码检查过了,我怀疑是系统级的问题,应用程序代码等也都检查过。 目前服务器上的内存是16G JVM内存是4G 在JVM中也对新生态和长久态都做了根据情况的设定
问题补充
FeiXing2008 写道
找找你系统瓶颈到底在哪里,不是一味光着想。
1.可以使用AOP方法来计算一些方法用所需要的时间。看看程序中哪个地方用时比较多。
其中观看一些DAO方法,是不是真是数据库的问题。
2.用JVM观察软件查看线程使用情况,看看是不是线程池问题。
3.如果内存真的很大,那样需要dump一下。
4.你服务网络上的带宽是不是不够大?
5.负载那里的权值行不行。
6.尽量使用Cookie而不是使用Session,最好将Session关掉。
7.对IO操作多否,是不是IO花了好多时间。
1.可以使用AOP方法来计算一些方法用所需要的时间。看看程序中哪个地方用时比较多。
其中观看一些DAO方法,是不是真是数据库的问题。
2.用JVM观察软件查看线程使用情况,看看是不是线程池问题。
3.如果内存真的很大,那样需要dump一下。
4.你服务网络上的带宽是不是不够大?
5.负载那里的权值行不行。
6.尽量使用Cookie而不是使用Session,最好将Session关掉。
7.对IO操作多否,是不是IO花了好多时间。
Cookie和Session都有用到,IO操作是很多,文件服务器和Web项目是不同的服务器,IO包括图片文件以及日志等。
测试下关键的方法时间和观察JVM线程两个问题是个思路
问题补充
mccxj 写道
基本情况:并发量最多可达到万级,SSH架构,Apache+4*tomcat,内存是16G JVM内存是4G
数据库? 操作系统? 几个服务器?硬件:cpu,memory,network 看看是不是都够用?apache也会占用不少内存~
现象:加重GC负担,并且当持续使用的情况下,很可能内存不够用,然后就崩溃了,经常的问题就是内存溢出
考虑分布式二级缓存,例如memcached
tomcat的session方案http://www.iteye.com/news/15499-tomcat-memcached-session
hibernate的memcached方法 hibernate-memcached,国产Xmemcached这个客户端也提供了hibernate支持
找到哪些url比较常使用又比较耗时~~优先解决
对有些特别耗时耗io的操作~~优先解决
关键还是识别瓶颈~~
数据库? 操作系统? 几个服务器?硬件:cpu,memory,network 看看是不是都够用?apache也会占用不少内存~
现象:加重GC负担,并且当持续使用的情况下,很可能内存不够用,然后就崩溃了,经常的问题就是内存溢出
考虑分布式二级缓存,例如memcached
tomcat的session方案http://www.iteye.com/news/15499-tomcat-memcached-session
hibernate的memcached方法 hibernate-memcached,国产Xmemcached这个客户端也提供了hibernate支持
找到哪些url比较常使用又比较耗时~~优先解决
对有些特别耗时耗io的操作~~优先解决
关键还是识别瓶颈~~
数据库是Oracle 服务器是Linux 4个,网络带宽够用,移动的项目。 软件方面Apache(之前是两个),后来换一个。
二级缓存使用过多,我担心JVM的长久态过多,增加GC的压力,所以在配置JVM中,将长久态的内存放大些,因为总是溢出。 研究下hibernate的memcached
问题补充
fins 写道
楼主 怎么检查的代码? 我觉得还是代码出的问题.
项目经历两年了,最早的版本应该没问题,所以检查就是新的代码,例如异常连接关闭,还有就是对异常处理,这些是对代码检测。程序框架没有修改,对于代码没有更新非常大,就类似打补丁了
问题补充
srdrm 写道
关注。
希望楼主做更深入的检测,
数据库,及会话处理部分应该是最重要的性能瓶颈问题。
大家一起来想办法
希望楼主做更深入的检测,
数据库,及会话处理部分应该是最重要的性能瓶颈问题。
大家一起来想办法
恩 我也是觉得Session是个瓶颈,也做了些小的处理。 数据库方面Hibernate,JDBC混合式的
问题补充
srdrm 写道
看楼主的描述有个概念没说清, “并发量最大可达到万级”,是指当前的并发量吗?那你的目标并发量是多少,你的场景需要多大的并发量,现在达到了百分之多少
哦 可能我没说明白,这个并发量是最大的情况,大约在中午左右,访问量最大时候的并发量
问题补充
我先把程序后台发现的问题先贴出来。 部分BUG我也都解决了,应用程序集问题把重要的贴出来,我在网上也查些资料。把棘手的贴出来,感谢大家了
1.java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at org.apache.jk.common.ChannelSocket.send(ChannelSocket.java:531)
at org.apache.jk.common.JkInputStream.endMessage(JkInputStream.java:121)
at org.apache.jk.core.MsgContext.action(MsgContext.java:304)
at org.apache.coyote.Response.action(Response.java:183)
at org.apache.coyote.Response.finish(Response.java:305)
at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:195)
at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:283)
at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:767)
at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:697)
at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:889)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
at java.lang.Thread.run(Thread.java:619)
Mar 31, 2010 5:38:52 AM org.apache.jk.common.ChannelSocket processConnection
WARNING: processCallbacks status 2
2. com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
WARNING: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@f0da27b -- APPARENT DEADLOCK!!! Complete Status:
Managed Threads: 3
Active Threads: 0
Active Tasks:
Pending Tasks:
com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@66b6837
Pool thread stack traces:
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1,5,main]
java.lang.Object.wait(Native Method)
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:534)
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,main]
java.lang.Object.wait(Native Method)
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:534)
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0,5,main]
java.lang.Object.wait(Native Method)
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:534)
3.Exception in thread "process reaper" java.lang.OutOfMemoryError: Java heap space
at java.io.BufferedOutputStream.<init>(BufferedOutputStream.java:59)
at java.io.BufferedOutputStream.<init>(BufferedOutputStream.java:42)
at java.lang.UNIXProcess$1$1$1.run(UNIXProcess.java:123)
问题补充
数据库也需要做负载
viei 写道
高并发请求,其实还是在架构上多下功夫,代码级别因为为次要的(当然也很重要)。
高并发量请求,应用服务器需要做负载,数据库也需要做负载
应用服务器负载形式很多种(lvs,haporxy,nginx,dns轮询,f5上面这些可以结合使用)
数据库的负载相对来说单一(集群,读写分离),当然要考虑好对数据库性能和操作数据库方法的调整,减少事务的使用范围。
jvm优化主要是参数的配置,hibernate缓存的使用需要设计好,如果系统做分布式集群单机cache如何保证有效性,考虑无键值数据库或者memcache着一类的东西吧。
说了这些,你可能觉的比较笼统
我觉的问题是这样的,你的并发大,关键是你是什么类型的应用。
对数据库操作什么类型的比较多,是都要保证事物的,还是对事物要求一般,是查询多呢,还更新插入多。
如果都是事物保证型的数据库操作,那么在数据库压力分解上还需要使用平行分库
实现数据库横向(集训)和纵向(水平分库,单数用户放到a数据库,双数用户放到b数据库【不一定如此分,举例】)的压力分解
恩我觉得代码上应该不是主要的瓶颈,昨天我在代码上已完成些优化,查询相对多些,将查询事务干脆去掉了。服务器分发上F5和Apache两者选择。数据库上没有进行负载,JVM的参数设置上,综合考虑的,因为缓存多,永久太多些,所以就根据情况多分了些, 我也担心是Hibernate缓存没有合理运用,目前也是使用ecache,系统分布式集群也可能有问题
问题补充
http://tech.it168.com/o/2007-11-02/200711021343406.shtml
一个Yahoo和MOP都参加过架构的一个人的文章,和大家分享下,应该有所思考
群:157094416 找到的文章。
------------------------------------------------------------------------------------------------------------------
问题补充:
forchenyun 写道
HTML静态化
图片服务器分离
数据库集群和库表散列
Mysql Master-Slave(MySQL主从复制)
内存表
分布式数据库技术
垂直切分,按照表的内容将不同的表划分到不同的数据库中
水平切分,根据用户的ID将不同用户的内容再划分的不同的数据库中
缓存
CDN
镜像
负载均衡
图片服务器分离
数据库集群和库表散列
Mysql Master-Slave(MySQL主从复制)
内存表
分布式数据库技术
垂直切分,按照表的内容将不同的表划分到不同的数据库中
水平切分,根据用户的ID将不同用户的内容再划分的不同的数据库中
缓存
CDN
镜像
负载均衡
恩 CDN 和镜像的好处在于?
------------------------------------------------------------------------------------------------------------------
问题补充:
sw1982 写道
1、看看tomcat配置手册,经常的outofmemory还是可以用参数优化掉的
2、分析sql,要有监控日志,查看用得最多的20条、最慢的10条。搞定基本就ok了!
3.不要事务。。真的不要事务。考虑下业务是不是真的重要到这个程度了
2、分析sql,要有监控日志,查看用得最多的20条、最慢的10条。搞定基本就ok了!
3.不要事务。。真的不要事务。考虑下业务是不是真的重要到这个程度了
恩 周末我在看看官方的一个权威Tomcat手册,希望能找到方案
事务也是要的,对于增删改需要的,对于查询考虑应该不用
------------------------------------------------------------------------------------------------------------------
问题补充:
csslisi 写道
java.net.SocketException: Broken pipe 个人认为是后台服务器会写页面时,客户端已经关闭,用户等不耐烦了,呵呵,这应该是服务器性能导致。
另外,1w个并发以现有的硬件设备可能不够,重新规划一下部署吧,集中式处理解决不了,可以考虑按业务去划分应用系统
另外,1w个并发以现有的硬件设备可能不够,重新规划一下部署吧,集中式处理解决不了,可以考虑按业务去划分应用系统
恩 SocketException 通道堵塞可能是你所说的,前台界面用了Freemarker代替JSP的,渲染Fremarker可能是有问题
------------------------------------------------------------------------------------------------------------------
问题补充:
我有个疑问JavaEye为什么把这给帖子由论坛放到问答栏目了? 我觉得这是做高访问量都可能遇到的一个问题,找到通用的解决方案和成熟的思路,这是所有JavaEye爱好者集思广益,讨论出更好的解决方案。。而不单单是个问答栏目的一个题目。。 不理解后台管理员在搞什么。。 算了我还是有时间研究下官方的Tomcat吧。。。 很感谢那么多人提出的建议,我会总结下
------------------------------------------------------------------------------------------------------------------
问题补充:
附件里是我刚简单的画了下部署图,和之前做了些改动,目前没有服务器瘫痪,但只是暂时解决,问题瓶颈还在研究中。。。 先巩固客户了
感谢各位了
------------------------------------------------------------------------------------------------------------------
问题补充:
forchenyun 写道
F5都用上了,lz居然1w的并发都。。。
目前按照我的上面部署图暂时解决了,但问题还是会出现,例如服务器瘫痪
转帖:http://www.iteye.com/problems/40372