大并发量,大数据量基于SSH应用程序架构有关问题

首先介绍下情况,并发量最多可达到万级,应用程序架构是基于SSH的,系统级是通过Apache分发,集群配置。但是目前情况不理想,我对系统级架构都是在钻研期间,下面是自己查的总结,但还是不怎么理想,各位熟悉的敬请赐教
1. 对于应用程序级,在SSH框架中,性能优化的措施有:
     1)节省事务占用内存,通过AOP分配不同业务层,节省事务内存开支
     2)对常用的数据进行缓存,提高性能,对内存占有量提升,矛盾中。。
     3)代码级优化,这个问题不能改的太全面,毕竟项目庞大,时间上是个问题
     4)高并发量,使用Hibernate是个问题,但是这个时候更换技术架构是个问题
对于高并发技术框架应该不是根本问题,数据库集群和应用服务器集群应该是重点问题,但是这方面还是欠缺,很是着急。。。熟悉的人敬请赐教
2. 系统级性能优化目前想到的措施是:
     1)负载均衡,集群方案
     2)数据库集群
这两个问题可能是关键,熟悉的人敬请赐教了
3. 对于JVM的考虑:
    1)由于Hibernate缓存使用,JVM内存分配是个问题
加重GC负担,并且当持续使用的情况下,很可能内存不够用,然后就崩溃了,经常的问题就是 内存溢出
有熟悉的人希望给些建议
问题补充
kimmking 写道
你说对了

2. 系统级性能优化目前想到的措施是:
     1)负载均衡,集群方案
     2)数据库集群

关于系统级解决方案能给点建议吗? 目前是通过Apache进行复杂均衡,四个Tomcat,具体性能问题还不清楚在哪里?高并发后就出现内存溢出问题,服务器瘫痪,Session丢失,敬请赐教
问题补充
soci 写道
读缓存 写异步

Hibernate中常用数据使用了缓存,很多操作都采取了读缓存,但问题还是出现,内存溢出,服务器瘫痪,Session丢失
问题补充
pejaming 写道
1.检查代码
2.给tomcat加内存
3.给机器加内存

代码检查过了,我怀疑是系统级的问题,应用程序代码等也都检查过。 目前服务器上的内存是16G JVM内存是4G 在JVM中也对新生态和长久态都做了根据情况的设定
问题补充
FeiXing2008 写道
找找你系统瓶颈到底在哪里,不是一味光着想。
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的操作~~优先解决

关键还是识别瓶颈~~

数据库是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
镜像
负载均衡

恩 CDN 和镜像的好处在于?

------------------------------------------------------------------------------------------------------------------
问题补充:
sw1982 写道
1、看看tomcat配置手册,经常的outofmemory还是可以用参数优化掉的
2、分析sql,要有监控日志,查看用得最多的20条、最慢的10条。搞定基本就ok了!

3.不要事务。。真的不要事务。考虑下业务是不是真的重要到这个程度了

恩 周末我在看看官方的一个权威Tomcat手册,希望能找到方案
事务也是要的,对于增删改需要的,对于查询考虑应该不用

------------------------------------------------------------------------------------------------------------------
问题补充:
csslisi 写道
java.net. SocketException: Broken pipe 个人认为是后台服务器会写页面时,客户端已经关闭,用户等不耐烦了,呵呵,这应该是服务器性能导致。

另外,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之类的流对象。

代码的话先用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后,你不内存溢出才怪!当然内存溢出出在程序上的可能性最大。要最具体的分析才能对症下药。
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页