Jboss最佳线程数调优

 前言:排查JBOSS问题的时候查到了这篇文章, 觉得写的很好,转载文章


在设置jboss的参数中,maxThreads(最大线程数)和acceptCount(最大等待线程数)是两个非常重要的指标,直接影响到程序的QPS。本文讲解jboss连接的运行原理,以及如何设置这两个参数。

1.最佳线程数

在做压力测试时,刚开始,随着并发量的增加,QPS也会随之增大,但当并发量超过一个阀值之后,QPS就不会再增大,甚至很多时候还会降低,类似于下图。而这个阀值就是我们所说的最佳线程数,他也是设置jboss时的maxThreads参数时的重要指标。

       

2.Jboss连接的原理

jboss连接的基本原理如下图,一般情况下,当用户访问jboss服务器时,会先进入等待队列,然后再到运行区被执行。运行区中连接的线程数量是固定的,也就是说cpu在同一时间内处理的用户访问数量也是固定的。

而那些已经建立连接,但暂时还不能被cpu处理的,就在等待列队中等待,直到运行区中有空闲时,才进入运行区被cpu执行的。而如果等待队列也满了,再有用户申请连接,jboss就会直接直接拒绝掉。

这样做的目的是为了更好地利用系统资源(cpu,内存等)。试想,每个连接都是要占用系统资源的,假如jboss不做这样的设置,一有连接请求,jboss马上建立连接,内存消耗非常大,更加致命的是,随着连接数量的增多,cpu用于调度的时间增大,用于计算的时间相对减少,这样系统的性能就被活活拖垮了。

           

    

在jboss中,acceptCount和maxThreads,这两个参数就是用于设置分别对待队列长度和运行区线程数。具体操作,进入JbOSS_HOME/server/default/deploy/jbossweb.sar/ 文件夹下,找到server.xml文件,修改这连个参数如下:

<Connector protocol="HTTP/1.1" port="9999" address="${jboss.bind.address}"  
         connectionTimeout="20000" redirectPort="${jboss.web.https.port}"  
maxThreads="150" acceptCount="8000"  
 />  


转载批注: 

需要主要的是server.xml根据版本不同文件夹名称有些许变化, 我使用的是4.2.3版本。路径为

jboss-4.2.3\server\default\deploy\jboss-web.deployer\server.xml

<!-- server.xml链接配置 -->
<Connector
         port="8080"
         address="0.0.0.0"
         maxThreads="1600"
        minSpareThreads="100"
        maxSpareThreads="250"
         emptySessionPath="false"
        enableLookups="false"
         redirectPort="8443"
         acceptCount="800"
        connectionTimeout="20000"
        disableUploadTimeout="true"
         URIEncoding="UTF-8"
         />
复制代码
  1. maxThreads:表示最多同时处理的连接数。应该将线程数(最大线程数)设置比最大预期负载(同时并发的点击)多25%(经验规则)。
  2. acceptCount:当同时连接的人数达到maxThreads时,还可以接收排队的连接。
  3. minSpareThread:指“启动以后,总是保持该数量的线程空闲等待”;设置比预期负载多25%。
  4. maxSpareThread:指“如果超过了minSpareThread,然后总是保持该数量的线程空闲等待”;设置比预期负载多25%。

3.如何找到最佳连接数

      1. 根据公式计算: 最佳线程数量=((线程等待时间+线程cpu时间)/线程cpu时间) * cpu数量

      2. 通过用户慢慢递增来进行性能压测,观察QPS,响应时间。

      这里重点讲讲第二种方法。

      首先在jboss的设置上,maxThreads值要设置得尽量大,以便压力都能压到cpu上。这同时也要注意,线程连接是占用内存资源的,假如maxThreads太大了,可能会消耗完所有内存,最终造成程序崩溃。

      具体步骤。我以自己最近做的压力测试,并从中找到最佳线程数为例进行进行说明

      我先设置的maxThreads=2000,acceptCount=4000。测试结果如下,横轴表示并发量,纵轴表示QPS

      

         跟据上图,我们就可以大致知道这个系统的最佳线程数是在红色区间范围内。

4.真实的maxThreads的设置

但在真实环境中,maxThreads的值要略大于压力测试时得到的最佳线程数。这是因为系统依靠的资源是可能发生变化的,比如原先系统在压力测试得到的最佳线程数是30,我们设置maxThreads也是30的话,但在真实运行时,可能突然有段时间,IO的响应变慢,这样造成的就是是最佳线程数可能变成35,这样cpu资源就白白被浪费了,QPS降低.所以在设置maxThreads时,留下一切缓冲余地还是很有必要的。

  


前一篇:JBoss如何设置将日志输出到不同日志文件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值