glassfish下的性能调优:令人极度困惑的Max Connections参数

近日做性能调优,主要是针对web service,运行于glassfish之上。前期通过修改优化代码,基本搞定一些阻碍性能的问题,主要是代码层次的不合理。
之后还是发现性能上不去,而且表现明显不合理:tps只能达到2k,而服务器cpu只停留在10%附近,压力测试的客户端cpu也不高,20%-30%吧。反复thread dump后检查无果,不论是服务器端还是客户端的工作线程都算正常,没有发现线程/锁之类的问题。分析发现主要的症状是服务器端和客户端都压不上去,服务器端工作线程很空闲,客户端则忙于socket通讯及等待服务器返回。

于是开始怀疑问题可能出现在网络通讯上,一边跑压力测试,一边用netstat命令查看socket状态,很快发现问题,有大量多大数k的socket连接出现。感觉不正常,因为应该用的是长连接,按说正常情况socket连接数应该近似等于并发的线程数。测试工具为客户端soapUI,直接连接到运行在glassfish上的web service. soapUI是支持长连接的,glassfish也是支持长连接的。

做了一下验证,只开一个工作线程,跑了几个请求,通过抓包工具发现的确是只建立了一个连接,后面的请求都是跑在同一个socket连接上。试着增加http header Connection: Keep-Alive,发现和默认没有这个参数时表现一致。故意设置为Connection: close,则每次请求都是重新建立连接。因此排除http 是短连接的问题。

继续回头看socket状态,发现出现的多达数k的socket有很多都是处于TIME_WAIT状态,只有少数处于正常的ESTABLISHED状态。TIME_WAIT意味着是服务器端主动要求close socket的,在长连接并且不断有请求的情况下,服务器为什么会如此频繁的关闭连接呢?

试着只开一个压力测试的工作线程,tps大概100+的情况下看服务器端的socket情况,很快发现问题:先是建立一个socket,ESTABLISHED状态,然后大概2s左右重新建立一个新的socket,原有的这个状态转为TIME_WAIT,之后每隔2-3秒左右,都会有上诉的情况出现—-原有连接被放弃,重建新的连接。这样socket就成了1 + n的状态:1个ESTABLISHED + n个TIME_WAIT,一定时间后TIME_WAIT的socket开始逐个消失。

将压力测试的工作线程加到100之后,上述情况开始变的极度激烈,大量TIME_WAIT的socket被建立,数目直接上到1w,2w乃至36000,之后开始偶尔报错说无法连接。

问题基本就定位在这里了,为什么明明建立好了长连接,服务器端确总是会不断的关闭这些长连接导致无数的TIME_WAIT?

试着查找资料,调整参数并反复测试,最终发现和两个参数有关:

1. http.maxConnections

glassfish官网说明
https://metro.dev.java.net/guide/HTTP_Persistent_Connections__keep_alive_.html

HTTP keep-alive behavior can be controlled by the http.keepAlive (default: true) and http.maxConnections (default: 5) system properties. For more information, see Networking Properties

进入http://java.sun.com/j2se/1.5.0/docs/guide/net/properties.html 页面查看相关的系统属性,最后聚焦在http.maxConnections :

http.maxConnections (default: 5)
If HTTP keep-alive is enabled, this value is the number of idle connections that will be simultaneously kept alive, per-destination.

从说明上看,应该是max idle connection,和命名maxConnections不大符合,maxConnections感觉像是最多容许开这么多长连接。考虑默认值为5明显应该是max idle connection。

后面的测试验证,就是这个参数非常的致命,在修改为200之后,tps直接 *2。

返回来分析这个参数,默认最多容许有5个空闲长连接。考虑到100个工作线程,正常应该长连接数目也在100附近,考虑每次请求都要先申请一个连接,用完之后再放回,100个工作线程同时操作,很有可能同时将超过5个的连接返还给连接池。如果服务器简单的判断说多于5个连接然后就立即close并释放长连接,那么就会出现一方面连续释放长连接,一方面因为连接数不够不停的创建新的长连接。

换言之,当100个线程并发在连接池中进行申请连接/返还连接的过程中,连接池内的可用连接数是时刻变化的,实际的数目会有大的波动。而默认的最大空闲参数过小(默认才5)使得这个波动有极大的几率突破限制,从而造成连接池进行不必要的释放所谓过多的“空闲”连接。

glassfish中,对于这个参数的修改,非常简单,在jvm参数中增加新的一项”-Dhttp.maxConnections=250″,重启即可。

2. maxKeepAliveRequests

前面的调整,虽然达到了tps * 2的良好效果,但是使用netstat查看socket时,还是发现有非常多的TIME_TIME状态的socket,只是数目没有原来那么直上3w那么夸张,大概稳定在2000附近。

看来还是有其他的原因的,重新回头看当时只开一个线程测试的场景:一个线程连续提交,会出现1个ESTABLISHED + n个TIME_WAIT。

感觉上像是一个长连接上只要跑一段时间或者一定的请求,socket就会被服务器端关闭。修改测试方法,让每次请求之间等待一段时间,降低tps,发现关闭连接的时间间隔大为增加。

后来google到maxKeepAliveRequests这个参数,对于tomcat,apache等服务器都有支持,解释如下:

maxKeepAliveRequests:
The maximum number of HTTP requests which can be pipelined until the connection is closed by the server. Setting this attribute to 1 will disable HTTP/1.0 keep-alive, as well as HTTP/1.1 keep-alive and pipelining. Setting this to -1 will allow an unlimited amount of pipelined or keep-alive HTTP requests. If not specified, this attribute is set to 100.

随即google到grizzly也有类似的系统参数可以设置这个maxKeepAliveRequests

-Dcom.sun.enterprise.web.connector.grizzly.maxKeepAliveRequests=-1
使用关键字”glassfish maxKeepAliveRequests”,发现glassfish还是有支持这个参数的,但是找不到具体设置的方法。后来在glassfish的控制台-> Configuration -> http service -> Keep Alive 下
发现了一个Max Connections参数,默认值250,解释为”Maximum number of connections in the Keep-Alive mode”,和maxKeepAliveRequests似乎完全不是一回事。

但是试着将这个参数修改为2500之后,非常惊讶的发现,见效了!单线程测试长连接释放的速度明显放慢,大体算了一下时间间隔和tpc,无论是之前的默认250还是现在新修改的2500都和测试结果
很合拍。开到100个线程测试,发现原有的2000附近的TIME_WAIT连接被降低到了大概300附近,明显改观。后面发现,可以用下面的参数直接设置:
asadmin set –user admin –passwordfile passwords.txt –port 47348 “server.http-service.keep-alive.max-connections=2500″

这里就有点奇怪了,从测试结果来看,这个参数的表现和maxKeepAliveRequests参数的功能是一致的,但是这个参数明明叫做Max Connections,而且旁边的注释”Maximum number of connections in the Keep-Alive mode”也证明了这点。很令人费解,并且这里的Max Connections前面的http.maxConnections有重名嫌疑而作用明显不同。

下面是一个简单的列表,其他情况相同下,分别修改者两个参数前后的对比:

keep-alive.max-connections http.maxConnections test result
250 5 TPS=650-700 TIME-WAIT=32600
250 200 TPS=1200 TIME-WAIT=300
2500 5 TPS=650-700 TIME-WAIT=32600
2500 200 TPS=1200 TIME-WAIT=300

最终的结果,还是比较理想的,修改了上述两个参数之后,cpu终于压上去了,tps也有了巨大的提升,而且TIME_WAIT的连接也大为减少。但是这两个参数的名称,注释和实际测试中的效果,都有名不副实的感觉,令人困惑。

后续更新:
1. 经同事提醒,有新的发现,maxKeepAliveRequests得以确认

http://docs.sun.com/app/docs/doc/820-4343/abefk?a=view
这里是sun的官方资料,其中对Max Connections 参数解释如下:
Max Connections

Max Connections controls the number of requests that a particular client can make over a keep-alive connection. The range is any positive integer, and the default is 256.

Adjust this value based on the number of requests a typical client makes in your application. For best performance specify quite a large number, allowing clients to make many requests.

因此可见这个”max connections”参数的确就是通常意义上的”maxKeepAliveRequests”。这里sun的命名不大合适,容易造成误解。
refer to:www.blogjava.net/aoxj/archive

本Blog文章除特别声明之外皆为原创文章,欢迎转载,转载请注明: 转载自JSSAY'S BLOG

本文链接地址: http://www.jssay.com/blog/index.php/2010/05/06/performance-tuning-glassfish-under-max-connections-is-extremely-confusing-parameters/

17、非线性动力学特征在情感语音与食管语音分析中的应用 本文探讨了非线性动力学特征在情感语音与食管语音分析中的应用。在情感语音识别中,选取Hurst指数、相关维数和Lempel-Ziv复杂度等混沌特征结合统计量,通过神经网络实现了中性、恐惧和愤怒情感的高效分类,全局成功率高达93.78%。在食管语音分析中,针对其缺乏明显周期性的问题,提出基于改进自相关方法的基频测量流程,包括包络计算、平滑与峰值细化,并对基频的物理意义提出思考。研究展示了两类语音在特征表现与技术方法上的差异,展望了其在客服、安全、医疗康复等领域的应用前景,并指出了未来在特征拓展、算法化和发声机 阅读详情

相关推荐

go-http-max-connections-demo:通过Golang控制HTTP最大连接数

go-http-max-connections-demo 描述 Golang的Httpd最大连接演示。 用法 无限(默认)httpd连接模式 $ go-http-max-connections-demo default (another shell) $ curl http://127.0.0.1:8080/ Default 受限的httpd连接模式。 $ go-http-max-connections-demo limited [-m MAX_CONNECTIONS] (another shell) $ curl http://127.0.0.1:8080/ Limited 如果要停止此演示,请键入CTRL + C。 安装 要安装,请使用go get : $ go get -d github.com/koemu/go-http-max-connections-demo 贡献 叉(

请求链路各节点上,如何支持http1.1长连接(java技术栈)

请求端、反向代理、防火墙、web容器,都需要正确配置,才能保障http1.1长连接

wzp1986的专栏 2939

金昌格式转换工具V3.0

一、产品概述金昌格式转换工具V3.0是一款专为设计师、开发者及普通用户打造的强大文件格式转换软件。新版本在保留原有秀特性的基础上,新增了多项实用功能,旨在为用户提供更加便捷、高效的文件格式转换服务。核心功能亮点:支持多种金昌格式统一转换:V3.0版本支持将JCH、JAR、JCG、JCS、JC1、JC8等金昌格式统一转换为JPG、BMP、TIFF等主流图片格式,满足您在不同场景下的需求。高度自定义转换参数:用户可以根据需要自定义转换精度、宽度和高度,确保输出的图片符合特定要求,实现精准控制。子目录文件批量转换:工具支持子级目录的文件批量转换,无需逐个手动选择文件,极大地提高了处理效率。保持原路径目录结构:在转换过程中,工具将保持原文件的路径目录结构,确保转换后的文件整齐有序,方便您查找和管理。无损压缩技术:新版本引入无损压缩技术,确保图片质量不受损的同时,大幅度节省存储空间。缩略图与数据表格输出:除了主图片输出外,工具还支持缩略图的生成和转换格式信息的数据表格输出,方便您快速预览和统计管理。金昌格式转换工具V3.0版本的发布,是我们对用户体验和性能追求的体现。我们坚

秒懂:tomcat的maxConnectionsmaxThreads、acceptCount 图解

怎么配置tomcat,才能使得自己的服务效率更高呢? 首先,这和tomcat的使用的IO模式有关 关于Java IO模式、以及IO处理的线程模型等基础的通信框架的知识,是Java程序员的重要、必备的内功,具体请参见尼恩编著的《Netty、Zookeeper、Redis高并发实战》一书,这里不做过多的赘述。 其次,也和tomcat的配置参数有关 尤其是以下三个配置项:maxConnectionsmaxThreads、acceptCount。 1.4.1 Tomcat的高效配置 Tomcat的maxConne

weixin_43831204的博客 919

使用HttpClient访问固定几个网络资源的化配置参数

使用HttpClient访问固定几个网络资源时,可以设置maxConnPerRoute,maxConnTotal,evictIdleConnections参数,通过重复使用已建立的连接来提高访问效率。

lieying411 1476

HttpClient的DefaultMaxConnectionsPerHost 坑

事件背景我在凤巢团队独立搭建和运维的一个高流量的推广实况系统,是通过 HttpClient 用大搜的实况服务。最近经常出现 Address already in use (Bind failed) 的问题。很明显是一个端口绑定冲突的问题,于是大概排查了一下当前系统的网络连接情况和端口使用情况,发现是有大量 time_wait 的连接一直占用着端口没释放,导致端口被占满(最高的时候 6w+ 个),因此 HttpClient 建立连接的时候会出现申请端口冲突的情况。具体情况如下:于是为了解决 time_wai

嘻哈熊的专栏 1465

Http——Keep-Alive机制

HTTP keep-alive 也称为 HTTP 长连接。它通过重用一个 TCP 连接来发送/接收多个 HTTP请求,来减少创建/关闭多个 TCP 连接的开销。1. HTTP中的keep-alive1.1 为什么HTTP是短连接众所周知,HTTP是短连接,client向server发送一个request,得到response后,连接就关闭。之所以这样设计使用,主要是考虑到实际情况。

lgq2016的博客 1374

Spring Boot 3.4.13 + JDK 17 迁移实战:从架构重置到生产就绪

Spring Boot 和 JDK 是 Java 企业级应用的核心运行时基础。Spring Boot 3.x 强制要求 JDK 17+,标志着从传统 Servlet 容器、Parallel GC 到 Jakarta EE 9 命名空间、ZGC 与模块化 JVM 的代际升级。其本质不仅是版本更新,更是字节码规范(Class File Format 61)、API 契约(javax → jakarta)和内存模型的全面对齐。技术价值体现在低延迟(ZGC P99 <10ms)、强安全(TLS 1.3 原生支持)与

weixin_30653023的博客 398

常用 doc bat 命令总结

常用doc命令总结

sun0322 1万+

HTTP长连接小议

尝试翻译片技术文章。 What is HTTP Persistent Connections? HTTP persistent connections, also called HTTP keep-alive, or HTTP connection reuse, is the idea of using the same TCP connection to send and receive

wdrich的专栏 774

高并发场景下的 HttpClient 化方案,QPS 大大提升!

来源:blog.csdn.net/u010285974/article/details/85696239伙伴做前后端分离项目,手摸手教学,后端 + 前端全栈开发,从 0 到 1 手敲,1v1 答疑,直到项目上线,后续上新更多项目,戳我加入HttpClient化思路:池化长连接httpclient和httpget复用合理的配置参数(最大并发请求数,各种超时时间,重试次数)异步多读源码1.背景我们有...

犬小哈 159

springboot(26)HTTP连接池

服务间基于HTTP通信相对于grpc、dubbo之类的通信效率要低得多,一方面是后者的传输数据结构紧凑,使用了序列化和压缩;另一方面,后者使用了TCP连接池,而前者默认情况下每一次服务间的通信会创建一个新的HTTP请求,会产生不小的性能消耗,对于需要额外非对称加密的HTTPS请求,性能消耗更加严重。 非连接池 默认情况下springboot的RestTemplate使用的org.springfra...

祈雨v的博客 6056

SpringBoot maxConnectionsmaxThreads、acceptCount解析

详解:maxConnectionsmaxThreads、acceptCount tomcat中maxConnectionsmaxThreads、acceptCount的具体含义是什么呢?参考官方文档,对三者的含义说明如下: 一、accept-count:最大等待数 官方文档的说明为:当所有的请求处理线程都在使用时,所能接收的连接请求的队列的最大长度。当队列已满时,任何的连接请求都将被拒绝。accept-count的默认值为100。 详细的来说:当用HTTP请求数达到tomcat的最大线程数时,还

Leon_Jinhai_Sun的博客 2041

glassfish连接数问题 domain.xml配置最大连接数

glassfish的web控制台进不去的情况下可以直接在 /glassfish/domains/domain03/config 路径下的domain.xml文件进行修改,前提是你得知道具体的配置地方,max-pool-size=“500” 这个地方是配置glassfish连接数据库的最大连接数。 然后还需要再看下oracle数据库的最大连接数 查询oracle的当前连接数 select count(*) from v$session; 查看数据库允许的最大连接数 select value from v$

weixin_42417886的博客 410

struts2 fileUpload 和 glassfish 上载文件限制修

struts2 上载文件基于 Apache FileUpload 组件,在导入 FileUpload 后,小文件上载正常,但上载大文件时却发现,有2M字节的限制,查询 struts2 官方信息得知需要修改 struts.xml 进行设置,故作一下整,将其设置为20M。 &lt;struts&gt; &lt;constant name="struts.multipart.maxSi...

NULL BLOG 1042

HttpURLConnection的警告

这段代码对您来说还不错吗? HttpURLConnection connection = null; try { connection = (HttpURLConnection) url.openConnection(); try (InputStream in = url.getInputStream()) { return streamToString(in); ...

最佳 Java 编程 344

springboot tomcat最大连接数、最大排队连接数、最大线程数设置

1. server.tomcat.accept-count=100 连接数达到最大时,允许排队的最大连接数(Maximum queue length for incoming connection requests when all possible request processing threads are in use.),默认为100; 2. server.tomcat.max-connections=8192 最大连接数(Maximum number of connections that .

fubicheng208的博客 3964

GlassFish

化 HTTPConnector Grizzly  GlassFish 的 HTTPConnector、Grizzly 默认将使用 NIO 处理客户机请求的连接。New Input/Output (NIO) 是 JDK 1.4 引入的 IO 机制,它提供了可伸缩的网络的文件 IOI,以及本地缓冲管理功能。NIO 引入了通道(channel)的概念,允许流(stream)成为通道。Socke

独自登高楼 望断天涯路 4629
上一篇: XCode4添加Framework的方法
下一篇: Automaticlly install mysql ree rails on Amazon EC2 Amazon Linux
xinlanzero
博客等级 码龄24年 10粉丝 132原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值