概述
首先介绍下情况,并发量最多可达到万级,应用程序架构是基于SSH的,系统级是通过Apache分发,集群配置。但是目前情况不理想,我对系统级架构都是在钻研期间,下面是自己查的总结,但还是不怎么理想,各位熟悉的敬请赐教
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的并发都。。。
目前按照我的上面部署图暂时解决了,但问题还是会出现,例如服务器瘫痪
------解决方案--------------------------------------------------------
你说对了
2. 系统级性能优化目前想到的措施是:
1)负载均衡,集群方案
2)数据库集群
------解决方案--------------------------------------------------------
读缓存 写异步
------解决方案--------------------------------------------------------
1.检查代码
2.给tomcat加内存
3.给机器加内存
------解决方案--------------------------------------------------------
找找你系统瓶颈到底在哪里,不是一味光着想。
1.可以使用AOP方法来计算一些方法用所需要的时间。看看程序中哪个地方用时比较多。
其中观看一些DAO方法,是不是真是数据库的问题。
2.用JVM观察软件查看线程使用情况,看看是不是线程池问题。
3.如果内存真的很大,那样需要dump一下。
4.你服务网络上的带宽是不是不够大?
5.负载那里的权值行不行。
6.尽量使用Cookie而不是使用Session,最好将Session关掉。
7.对IO操作多否,是不是IO花了好多时间。
------解决方案--------------------------------------------------------
SNA,memcached,在论坛里面找找
------解决方案--------------------------------------------------------
优化工作要充分利用20 - 80 定律,先找出占用80%资源的那20%点,找出来了再优化。
比如说优化读写,开始的时候费了很多effort在cache上面,到最后发现实际上是一个频繁的写应用。
------解决方案--------------------------------------------------------
处理高并发的方案就是分布式部署,缓存服务器,负载均衡,非共享架构设计,数据水平分割。
ssh没问题.
------解决方案--------------------------------------------------------
基本情况:并发量最多可达到万级,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的操作~~优先解决
关键还是识别瓶颈~~
------解决方案--------------------------------------------------------
内存不够的话映射文件
------解决方案--------------------------------------------------------
不键议使用太多memcached-session,因为这样往往无形地将系统搞得好复杂。
最好还先看看方法执行时间。看看字符串有没有很多的subString, split之类的操作。还有对文件处理时有没有半一些bufStream之类的流对象。
------解决方案--------------------------------------------------------
FeiXing2008 写道
不键议使用太多memcached-session,因为这样往往无形地将系统搞得好复杂。
最好还先看看方法执行时间。看看字符串有没有很多的subString, split之类的操作。还有对文件处理时有没有半一些bufStream之类的流对象。
最好还先看看方法执行时间。看看字符串有没有很多的subString, split之类的操作。还有对文件处理时有没有半一些bufStream之类的流对象。
代码的话先用findbugs过过眼~~
------解决方案--------------------------------------------------------
楼主 怎么检查的代码? 我觉得还是代码出的问题.
------解决方案--------------------------------------------------------
关注。
希望楼主做更深入的检测,
数据库,及会话处理部分应该是最重要的性能瓶颈问题。
大家一起来想办法
------解决方案--------------------------------------------------------
看楼主的描述有个概念没说清, “并发量最大可达到万级”,是指当前的并发量吗?那你的目标并发量是多少,你的场景需要多大的并发量,现在达到了百分之多少
------解决方案--------------------------------------------------------
如果总是内存溢出的话,建议检查是否存在内存泄漏。建议在泄漏时把JVM内存快照抓出来进行分析。
Hibernate缓存方面我不清楚你们使用的是哪种缓存。不过因为是集群部署,所以一定要支持集群同步。如果你们的缓存不支持集群,那么就会造成脏数据。
如果你非常怀疑是缓存引发的问题,那么可以尝试把Hibernate缓存关掉,看看负载情况。是否还有泄漏。以确定是否是缓存管理不好引起的。
目前JVM的内存不宜设定太大,4G已经差不多是极限了,GC会比较长。其实有时候调小反而会提高速度。建议先试试2G。Hibernate缓存建议从小往大慢慢调整,边调边测。过期时间也要设定好,过长和过短都不合适。这个只能慢慢根据实际情况进行调整。
------解决方案--------------------------------------------------------
首先确定你的系统瓶颈出在哪
------解决方案--------------------------------------------------------
希望楼主把如下信息描述得再清楚些,不然我们也没有办法帮你分析。
1.系统的具体部署架构:最好画个图,整个系统一共有多少台服务器,每台服务器的作用 他们上面部署的东西,各服务器之间的调用关系。 并指出经常出现崩溃的具体服务器节点。
2.将该服务器崩溃时,后台输出的异常信息贴出来,这样就更清楚些。
3.将崩溃的服务器的具体优化参数贴出来,我不要你以前笼统的描述多少。你直接将你优化的参数从配置文件中拷贝贴上来。
另外推荐一个非常轻量级的JVM内存查看工具jvmstat监视服务器的内存使用情况。楼主提供了这些信息,我们才好分析哈
------解决方案--------------------------------------------------------
一个交易一个交易的测试,并检查代码,优化代码中最不合理的地方。
程序如果有问题,方案在好,内存再大也白扯! java.sql.SQLException: [Microsoft][SQLServer JDBC Driver]System Exception: Socket closed
------解决方案--------------------------------------------------------
handonghandong 写道
fins 写道
楼主 怎么检查的代码? 我觉得还是代码出的问题.
项目经历两年了,最早的版本应该没问题,所以检查就是新的代码,例如异常连接关闭,还有就是对异常处理,这些是对代码检测。程序框架没有修改,对于代码没有更新非常大,就类似打补丁了
不是说旧代码没有问题,而只检查新代码的
都需要跟踪回旧的代码。
内存溢出具体是什么错误,最好贴个错误信息来看看。是内存不够还是溢出,这里都是两个概念。
------解决方案--------------------------------------------------------
内存溢出的情况有2个大的方向:1.一个是永久存储区内存溢出。2.java heap(堆空间)溢出。如果是永久存储区不够用的话,你怎么改程序都解决不了;如果是堆空间溢出的话,也不能肯定就是程序的问题,因为服务器的容量一定是有有限的,因为你的内存,IO能力总是有限制的;如果你的服务器资源在1000个处理线程已经满负荷了,而你的设置允许他的最大线程为2000个。但负载超过1000后,你不内存溢出才怪!当然内存溢出出在程序上的可能性最大。要最具体的分析才能对症下药。
最后
以上就是喜悦柜子为你收集整理的大并发量,大数据量基于SSH应用程序架构有关问题的全部内容,希望文章能够帮你解决大并发量,大数据量基于SSH应用程序架构有关问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复