-
我在tomcat里设置了一个调度任务,每隔一段时间建立一个和数据库的连接读值,然后...但是过一会连接数就满了?
2012-12-06 10:28:19这个调度方法就是在tomcat的web.xml文件里做设置,每隔几分钟就执行一个java类。这个java类里有个进程。我在这个进程里初始化数据库,然后做查询,再关闭连接。...请问为啥连接数不断增加呢? 期待高手啊!!! -
tomcat启动占了12g_TOMCAT websocket 多连接内存泄漏与jetty对比分析
2021-01-13 03:02:16服务器环境8核 32G内存问题:在5000个连接的时候Tomcat内存基本吃满Tomcat 压测:连接数内存消耗CPU10006.9G100%200012G100%300019G100%400025G100%446830G100%更多连接已经无法建立检查下JVM内存使用情况,其中老...服务器环境8核 32G内存
问题:
在5000个连接的时候Tomcat内存基本吃满
Tomcat 压测:
连接数
内存消耗
CPU
1000
6.9G
100%
2000
12G
100%
3000
19G
100%
4000
25G
100%
4468
30G
100%
更多连接已经无法建立
检查下JVM内存使用情况,其中老年代被占用了98.4%,有大量不能释放的对象在heap。
老年代内存大小31.5G,老年代使用31G
JETTY压测
连接数
内存消耗
CPU
1000
1G
25%
3000
1G
25%
5000
1.1G
25%
10000
1.2G
25%
20000
1.4G
50%
内存情况老年代被使用了79.4%,老年代总大小3.5G占用0.5G
通过现象我们可以看到jetty占用内存非常小,而TOMCAT暂用却非常多,但是国外论坛有人Tomcat却可以压到4万的连接,是什么东西占用了这么多heap空间呢?
分析TOMCAT内存占满原因:
一,由于测试方便在本地启动程序建立了501个连接,并且用jmap生成了快照
二,我们用mat来分析下内存的情况(也可以用jhat,但是太low了很多还需要人工肉眼看和计算)
我们可以看到WsFrameServer占用了2.9的heap空间对象个数恰好是我们建立的连接数
三,现在我们来分析WsFrameServer对象,到底什么东西可以占用这么大
我们可以看到WsFrameServer对象直接引用对象的heap空间HeapCharBuffer和HeapByteBuffer非常大
我们再来看看这个大对象什么引用在引用,通过分析我们知道了原来是WsFrameServer的messageBufferText成员变量
下面我们来看下源代码
我们在WsFrameServer的父类中发现了这两个大对象的引用
那么问题来了,是什么原因导致这个对象很大的呢?我们继续看源代码什么地方用来它,特别是初始化的时候
我们检查到,这个地方初始化的,初始化大小是wsSession.getMaxBinaryMessageBufferSize()
和wsSession.getMaxTextMessageBufferSize(),那么问题又来了,这两个值有是从哪里来的呢?
我们查看源码
有一个默认值是8K,如果是8K的话内存不至于溢出,看什么地方做了赋值
原来是这个地方做的赋值,那么webSocketContainer又是从哪里来的呢?
我们点进去
这里要么是默认值,要么是什么地方做了设置我们打断点调试,而且这个默认值是8K,肯定是什么地方修改了,那么我们在set方法打断点
断点来了,我们通过线程栈来分析下什么地方调到这里来的,跟着往上点
最后我们发现是这个类ServletServerContainerFactoryBean,这个类是spring提供的,我们是在这儿用到了,原来如此,内存之所以这么大就是这里的设置导致的,这个设置的目的是让websocket可以传输更大的消息
其实我们看到的Tomcat的webSocketContainer是实现了javax.websocket.webSocketContainer的,很明显这个是J2EE的规范我们可以查下这个规范
其实这个类就是在初始化的时候可以让你设置websocket相关的一些参数
但是它设置了之后对所有session都生效了所以导致我们的连接数上不去,有什么办法可以解决吗,我们查到有另外的J2EE规范可以在运行过程中动态的修改而且是针对特定session的
那么问题来了,为什么jetty没有出现这个问题,如果是J2EE的规范那么我们设置这个值JETTY也应该出现这个问题,可是没有!
我们再来对jetty进行调试,发现这个配置对jetty不起作用
为什么不起作用呢?这又是另外的问题了~
后来通过源码分析得知JETTY和TOMCAT的实现不一样,不知道算不算BUG,个人认为是JETTY的BUG~
什么代码实现导致他们不一样呢?
Tomcat每次请求过来时在创建session时都会把这个webSocketContainer作为参数传进去所以对所有的session都生效了
我们来看看jetty
启动初始化时jetty把webSocketContainer的参数值设置给了这个过滤器,我们看看这个过滤器它的dofilter方法
其实在这个过滤器我们没有注册任何的访问URL,因为我们是通过spring提供的方式实现的websocket,如果我们在这个过滤器注册了访问URL那么所有过来的请求都会生效~可以继续跟后面的代码,其实就是调用的其他处理器来处理,这些处理器是在这里初始化的
每个url都有一个单独的处理器,这个实现是springboot提供的
spring给每一个websocket URL单独new 了一个处理器,jetty里面这个类是WebSocketServerFactory
其实jetty的处理方式是事件驱动模式设计,把所有的请求当做一个事件,不同的事件有自己对应的eventdriver来处理
重点是jetty在实例化这个对象的时候并没有把webSocketContainer所带的参数设置进去
这就导致了Tomcat生效jetty没有生效,其实你还会发现虽然jetty的buffer默认大小是64K,Tomcat是8K,可是jetty压测的时候CPU和内存都比Tomcat少,这是为什么呢?
原因是jetty用了对象池,不像tomcat来一次请求就new一个buffer,下面是jetty使用对象池的地方
后面简单做了netty的压测10000个连接消耗内存190M,吊炸天的存在
-
tomcat数据库连接池的研究
2009-08-22 17:24:07数据库连接池可能很多人一直不明白真正的作,也...数据库服务器被连接占满,同时连接池因设定了最大连接数,而可能使得超过了连接时 数据库无法使用。有可能很多开发者因为以前用asp,php,vb等的原因,好像不关闭...数据库连接池可能很多人一直不明白真正的作,也无法真实的体会其明显的作用,
很多初级开发者可能大我都是用完就close了,要用时就打开,这是否对小的应用来说
用不用连接池效果不是很明显,还有一点就是初级开发者常常不记得关闭连接,使得
数据库服务器被连接占满,同时连接池因设定了最大连接数,而可能使得超过了连接时
数据库无法使用。有可能很多开发者因为以前用asp,php,vb等的原因,好像不关闭连接也没什么影响
但在J2EE中,数据库连接不关闭后果很严重。
我们来看看数据连接耗时操作。
1)分析URL连接参数,包括协议、IP地址、端口等的分析与验证。并分板URL成为参数,如把协议,DATABSE,userName,passWord等从中分出来放入Hashtable中
2)注删及加载驱动
3)在注册的驱动列表中查找能使用的驱动,一般驱动管理员会一个个驱动去试,驱动通过分析URL是否为自己URL。如果是返回true
4)驱动用传入的参数实例化继承自Connection的对象,产生Connection实例。
5)和URL指定的数据库服务器进行SOCKET连接,进行网络数据传输握手。
6)登录数据库服务器,创建statement及resultSet,并设置语言环境及数据格式.
7)完成初台化工作,返回Connection对象。
很显然一次连接要做上面主要的7个部分的操作,部分操作还比较耗时。当然测试中发现一段建立一个连接的耗时为几百毫秒,快时也有几十毫秒。
频率比较少的访问问题不大,但是访问量很大时,耗时就非常明显,大测试发现用连接池去执行sql语句几乎不耗时间的。
连接是不是必需的,只是在访问量比较大时确实能省很多的时间,提高效率,但在访问题很少的情况下,也能提高数据的操作效率,同时节省数据库
的连接开销。
那么连接池怎么实现的呢?连接池的最少应实现那些功能。
1)连接在使用后不应马上关闭,可能后面其它程式还要使用。
2)保留一个最小活动连接,使其程式不需要在建立连接时消耗时间,活动连接,可以在初始化时首先建立,也可以在连接中回收。
3)最大连接数,连接池中的连接最大不超过这个数,这样做也是避免把数据连接耗完,通常这样的问题是因为程式没有写好的原因。
4)处理超时连接,也就是连接超过多长时间被认为过期,然后从连接池中清除。
5)重写Connection的close方法,因为哪不重写,将会使用户使用close方法时真正关闭连接,而不是放入连接池。
其实连接池也比较简单,主要是实现上面几个需求。如tomcat的连接池实现类就是为:
org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
因此连接池的逻辑为:
1)取连接时,先到连接池中找,如果没有空闭的连接,而又没有超过最大连接数,建一个新的连接。
如果超过了抛出异常。
2)得到连接后,连接池减少1
3)使用完后如果连接池没有超过最大连接数放入连接池,超过直接关闭。
4)如果加入连接池的连接,连接池计数+1
5)时间监听连接是否超时,如果超时将关闭,从连接池中-1,直到最后只有最少的活动连接数。
这里我们有一个问题,连接池是怎么知道连接是否超过最大连接呢,有些连接在使用,他们在连接池中并没有计数,也就是说他们取出后计数器
就-1了。,事实上我们可以用另一个记录正在使用的连接,如果用完就从中-1,也可以不去管在使用的连接,我们只用去管空闭的连接就行。
应该我们设置连接池的最大连接数应是指空闭的最大连接数,而并非空闭连接数+正在使用的连接数。
还要注意的一点是,连接池的列表应常驻内存,不然用完了就退出内存了,那前池子又要重建立,因此存入连接的对象应是static类型的。 -
ORA-12516 "TNS监听程序找不到符合协议堆栈要求的可用处理程序" 解决方案 原因:连接数和会话数满
2019-10-14 14:49:18出现以上ORA错误是因为连接数和会话数满导致的。这样的情况下连sqlplus都登录不进去了。由于超过连接最大值导致无法登录,首先需要先断开占用的procress,即停掉所有tomcat释放连接,接下来就可以登录了。如果还是...出现以上ORA错误是因为连接数和会话数满导致的。这样的情况下连sqlplus都登录不进去了。由于超过连接最大值导致无法登录,首先需要先断开占用的procress,即停掉所有tomcat释放连接,接下来就可以登录了。如果还是不行,我这里是直接把数据库主机断网,再通过system用户登录sqlplus看一下procress和session的参数值和占用值:
sqlplus; SQL> show parameter processes; SQL> select count(*) from v$process; SQL>select count(*) from v$session; SQL> alter system set processes=500 scope=spfile; SQL> alter system set sessions=500 scope=spfile;
根据需要修改完记得重启ORACLE两个服务才生效。
-
tomcat无法访问服务端口打不开连接故障排除一例
2018-05-06 20:09:05线上的tomcat服务,昨天用户说无法访问,重启过一次,今天客户又...经过一番查找后,最后通过netstat -an | more 查看,某个IP有大量的绑定到tomcat服务端口的连接,原因就是这些连接把tomcat服务线程数给占满了,继...线上的tomcat服务,昨天用户说无法访问,重启过一次,今天客户又反馈说不能访问,登录到服务器上观察,tomcat内存占用不高,看日志输出tomcat里面跑的java程序并没有死掉,故障现象就是简单的客户端浏览器无法访问服务端口,经过一番查找后,最后通过netstat -an | more 查看,某个IP有大量的绑定到tomcat服务端口的连接,原因就是这些连接把tomcat服务线程数给占满了,继续分析故障原因,是客户端程序里面的apache httpclient 连接程序用完了以后没有关闭连接造成的。
-
-bash: fork: Cannot allocate memory问题,进程数满了的解决办法
2019-01-08 09:44:00今天一大早来到公司就发现一台远程服务器的进程满了,无法连接上远程服务器,如下图所示: 出现这种情况,主要是因为进程跑满了,memory被消耗光了,无法为其他的操作,包括vnc操作命令和SSH连接分配内存,... -
tomcat应用拒绝服务解决过程
2019-09-14 11:02:30问题现象: 应用跑在tomcat上,近期遇到个问题,运行一段时间后就拒绝服务, 其他程序连接不上应用, 出...第一次出现问题时, 根据经验判断是tomcat的线程数满了, 在服务器上查看链接数的确很多, 就修改了tomca... -
tomcat对应的java api_tomcat7配置属性API
2021-03-09 21:48:03acceptorThreadCount用于接受连接的线程数。增加了多CPU的机器上这个值,虽然你永远不会真正需要超过2。此外,有很多非保持活动连接,你可能想增加这个值。默认值是1。acceptorThreadPriority接受者线程的优先级... -
Apache+Tomcat负载实战调优记录
2019-09-22 08:29:14一般来说,按照网上提供的一些方法,将... 今天亲身经历了这样一个过程,apache的最大连接数调到了4500,但都还不够用,一会就跑满了。而Tomcat这边压力却不大,同时,发现mod_jk.log里面有很多这样的错误记录: ... -
Apache+Tomcat 负载实战调优记录
2014-12-15 11:02:13一般来说,按照网上提供的一些方法,将... 今天亲身经历了这样一个过程,apache的最大连接数调到了4500,但都还不够用,一会就跑满了。而Tomcat这边压力却不大,同时,发现mod_jk.log里面有很多这样的错误记录: -
使用springcloud 和 连接池 连接orcale数据库报错,折磨一天了,请大佬解救,启动都正常的
2018-12-28 17:32:29#每次检测时,需要检测多少个数据连接,一般设置为与最大连接数一样,这样就可以检测完所有的连接 numTestsPerEvictionRun: 8 #一个数据库连接连接多少时间之外,我们认为其应该不再适用了(可能下一次就会失效... -
通过端口 1433 连接到主机 10.122.49.166 的 TCP/IP 连接失败。错误:“connect timed out。
2021-01-13 00:01:51运维同事 找我说网站打不开了 ,打开tomcat 日志显示的问题 是这样的 我小组的组长说是,数据库的连接池满了,把最大连接数调大就可以。 在配置数据源的地方,将数据库的最大连接数增大 ps:以后再补充吧。 ... -
使用连接池技术后,是否需要手动关闭连接?
2011-08-30 18:27:11自从应用系统开始使用连接池以后,Connection pool就开始流行起来。 一直有这么一种说法,...使用oc4j、Tomcat和weblogic的同志可能会发现,只要访问量大,无论在连接池中设置多少上限连接数,总会占满,总会抛异... -
springcloud-单个服务无法处理新的请求
2019-01-31 22:12:03前言: 最近生产上出现一个问题,描述如下: springcloud分布式环境下,服务...1.首先查看tomcat连接是不是满了,通过netstat -nat|grep -i “服务B端口号”|grep ESTABLISHED|wc -l,连接数为300多,tomcat默认最... -
jconsole的巨大作用
2013-10-11 18:29:44要命的一个礼拜终于要过去了,这...==================================================处理过程:1、查看日志,输出信息为tomcat连接数已满,线程阻塞,之后将tomcat-ajp的maxthreads为600,并做量为750的等待队列... -
奇怪的数据库connect错误【原创】
2010-12-11 01:04:53同事说是我这台机的连接数满了,数据库不让我连接了。 可是我并没有什么连接操作,只是开一个tomcat,同事又提醒数据库的url改了,叫我更改proxool里面的url配置,改了,也不行。后来有人说改下机器上的mysql客户端... -
图片服务接口返回缓慢导致的前端整体崩溃
2020-09-24 10:55:33方案1 很多服务都需要调用图片微服务获得图片,导致图片微服务的连接数被沾满,导致雪崩. 排查思路: 微服务配置 # 最大线程数 server.tomat.max-threads=5000 # 最大连接数 server.tomcat.max-connections=20000 #... -
服务追查问题
2019-11-25 21:27:551、Cannot allocate memory问题,进程数满了的解决办法 今天一大早来到公司就发现一台远程服务器的进程满了,无法连接上远程服务器,如下图所示: 出现这种情况,主要是因为进程跑满了,memory被消耗光了,... -
solr4中HttpSolrServer使用的问题
2015-04-07 17:17:53前段时间,偶尔看到前端tomcat报异常,提示httpclient连接池满了,后来查阅了solrj源码,不自行定义httpclient的话,默认最大链接数是20,单主机最大是2,确实有点少。 -
生产环境下的负载均衡配置
2015-01-20 14:18:06开始上线的时候因为人数不多感觉没太多问题,随着正式环境的发布,开人有人反映服务器页面无法打开,连入tomcat查看时发现连接数已满且CPU也用到了极限,初始的架构如下图所示,其使用1台tomcat和一台数据库服务器。... -
20.2. Session
2017-12-18 13:28:00firewall (nat session) - switch (Forwarding bandwidth) - os (ulimit,sysctl) - application (httpd,vsftpd,tomcat ...) ...当你的带宽没有满,但tcp不能建立连接,这时你就要考虑会话数了。 20.2.1.fire... -
spring-cloud hystrix(三)
2019-05-04 22:27:00作用: 作为保护机制,在服务宕机,网络等原因引起的服务不可用时,触发服务降级或者熔断以保证其他服务的可用。...逐渐占满所谓连接数,从而导致整个微服务无连接可用也就导致整个系统不可用了... -
Java 性能调优并诊断性能问题(jconsole,jvisualvm)
2018-04-16 13:55:38在某次工作的环境中发生接口调用一段时间之后出现 gateway timeout 504 问题,并随着大量的请求数量增大导致所有的接口都无法进行访问,第一时间怀疑是 tomcat 的请求连接数或线程池被压满,后来利用本篇提到的方法... -
sentinel 简单使用
2021-04-06 22:09:54sentinel1. springboot 整合 Sentinel1.1 sentinel-... 答:对于服务端来说,当请求量达到了 tomcat 设置的最大连接数,请求任务会加入任务队列中等待被执行,但如果任务队列也满了,则会直接拒绝其它请求。 -
面试题2021-2-24
2021-02-24 16:38:30给某CentOs6虑拟机添加了新的数据盘,... 如何查看与RabbtMQ服务器之间的establish状态连接数? netstat-an|grep'ESTABLISHED'|grep'tcp'|wc-l 如何实现omcat在操作系统重启后自动重启?Tomcat部署在/opt/a... -
linux命令df 中df -hT和df -ih的区别及磁盘爆满的解决方法
2020-08-20 13:44:53df 命令: linux中df命令的功能是用来检查linux服务器的文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。...服务器tomcat启动起不来,而且连接到服务器上开启服务