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

     最佳线程数:
     在做压力测试时,刚开始,随着并发量的增加,QPS也会随之增大,但当并发量超过一个阀值之后,QPS就不会再增大,甚至很多时候还会降低,类似于下图。而这个阀值就是我们所说的最佳线程数,他也是设置jboss时的maxThreads参数时的重要指标。
       
     
     jboss连接的原理
     jboss连接的基本原理如下图,一般情况下,当用户访问jboss服务器时,会先进入等待队列,然后再到运行区被执行。运行区中连接的线程数量是固定的,也就是说cpu在同一时间内处理的用户访问数量也是固定的。
     而那些已经建立连接,但暂时还不能被cpu处理的,就在等待列队中等待,直到运行区中有空闲时,才进入运行区被cpu执行的。而如果等待队列也满了,再有用户申请连接,jboss就会直接直接拒绝掉。
     这样做的目的是为了更好地利用系统资源(cpu,内存等)。试想,每个连接都是要占用系统资源的,假如jboss不做这样的设置,一有连接请求,jboss马上建立连接,内存消耗非常大,更加致命的是,随着连接数量的增多,cpu用于调度的时间增大,用于计算的时间相对减少,这样系统的性能就被活活拖垮了。
           
    
     在jboss中,acceptCount和maxThreads,这两个参数就是用于设置分别对待队列长度和运行区线程数。具体操作,进入JbOSS_HOME/server/default/deploy/jbossweb.sar/ 文件夹下,找到server.xml文件,修改这连个参数如下:
  1. <Connector protocol="HTTP/1.1" port="9999" address="${jboss.bind.address}"
  2. connectionTimeout="20000" redirectPort="${jboss.web.https.port}"
  3. maxThreads="150" acceptCount="8000"
  4. />

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

 
      如何找到最佳连接数
      1. 根据公式计算: 最佳线程数量=((线程等待时间+线程cpu时间)/线程cpu时间) * cpu数量
      2. 通过用户慢慢递增来进行性能压测,观察QPS,响应时间。
      这里重点讲讲第二种方法。
      首先在jboss的设置上,maxThreads值要设置得尽量大,以便压力都能压到cpu上。这同时也要注意,线程连接是占用内存资源的,假如maxThreads太大了,可能会消耗完所有内存,最终造成程序崩溃。
      具体步骤。我以自己最近做的压力测试,并从中找到最佳线程数为例进行进行说明
      我先设置的maxThreads=2000,acceptCount=4000。测试结果如下,横轴表示并发量,纵轴表示QPS
      
         跟据上图,我们就可以大致知道这个系统的最佳线程数是在红色区间范围内。
 
      真实的maxThreads的设置
      但在真实环境中,maxThreads的值要略大于压力测试时得到的最佳线程数。这是因为系统依靠的资源是可能发生变化的,比如原先系统在压力测试得到的最佳线程数是30,我们设置maxThreads也是30的话,但在真实运行时,可能突然有段时间,IO的响应变慢,这样造成的就是是最佳线程数可能变成35,这样cpu资源就白白被浪费了,QPS降低.所以在设置maxThreads时,留下一切缓冲余地还是很有必要的。

Jboss调优——最佳线程数的更多相关文章

  1. 【面试虐菜】—— Jboss调优

    吐血整理了以前Jboss以及JVM在生产环境下的调优参数,各种不同的案例,都是来自网友杜撰.整合后,希望对广大使用jboss作为生产应用服务器的朋友有所帮助. JBOSS参数调优 配置deploy/j ...

  2. Tomcat设置最佳线程数总结

    最佳线程数: 性能压测的情况下,起初随着用户数的增加,QPS会上升,当到了一定的阀值之后,用户数量增加QPS并不会增加,或者增加不明显,同时请求的响应时间却大幅增加.这个阀值我们认为是最佳线程数. 为 ...

  3. Tomcat最佳线程数

    什么是最佳线程数? 为满足更多用户访问需求,可以调整Tomcat线程数,但是不能太大,否则导致线程切换开销,随着用户递增(线程数也随之调整),系统QPS逐渐增加,当用户量达到某个值,QPS并不会增加, ...

  4. MySQL参数调优最佳实践

    前言很多时候,RDS用户经常会问如何调优RDS MySQL的参数,为了回答这个问题,写一篇blog来进行解释: 哪一些参数不能修改,那一些参数可以修改:这些提供修改的参数是不是已经是最佳设置,如何才能 ...

  5. Java并发(八)计算线程池最佳线程数

    目录 一.理论分析 二.实际应用 为了加快程序处理速度,我们会将问题分解成若干个并发执行的任务.并且创建线程池,将任务委派给线程池中的线程,以便使它们可以并发地执行.在高并发的情况下采用线程池,可以有 ...

  6. [svc]centos6系统安装(分区)及其18处调优调优最佳实战

    系统下载 在阿里云下载 可以使用最小化的,也可以使用dvd版(CentOS-6.7-x86_64-bin-DVD1.iso),其中dvd版方便安装过程中选包. 一. 系统安装 1,时区选择 2,磁盘分 ...

  7. SAP专家培训之Netweaver ABAP内存管理和内存调优最佳实践

    培训者:SAP成都研究院开发人员Jerry Wang 1. Understanding Memory Objects in ABAP Note1: DATA itab WITH HEADER LINE ...

  8. JVM调优-Jstack线程分析

    jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使 ...

  9. 硬菜点播台 | MySQL阿里实践经典案例之参数调优最佳实践

    http://mp.weixin.qq.com/s?__biz=MzA4NjI4MzM4MQ%3D%3D&mid=512708319&idx=1&sn=6af5f424d7cd ...

随机推荐

  1. 启动级别:init 0,1,2,3,4,5,6

    这是个很久的知识点了,只是自己一直都迷迷糊糊的,今天在翻出来好好理解下.. 0:停机 1:单用户形式,只root进行维护 2:多用户,不能使用net file system 3:完全多用户 5:图形化 ...

  2. valueOf跟toString区别

    1.用法如下:toString()方法:返回对象的字符串表示. 对象 操作 Array 将 Array 的元素转换为字符串.结果字符串由逗号分隔,且连接起来. Boolean 如果 Boolean 值 ...

  3. android开发,socket发送文件,read阻塞,得不到文件尾-1

    这是我的接收文件代码:开始可以读取到-1,但是现在又读取不到了,所以才加上红色字解决的(注释的代码) File file = new File(mfilePath,"chetou." ...

  4. 我是IT小小鸟,老师我之前上传了!!!!老是请您看到我

    我是IT小小鸟读后感 世界上没有一蹴而就的成功者,只有头悬梁锥刺股的奋斗者.蜉蝣向往大鹏的辉煌,却不曾知大鹏以往的汗水.蜉蝣之所以为蜉蝣,是因为它犹如井底之蛙,目光短浅,之盲目地羡慕成功者,而大鹏之所 ...

  5. boost之bind

    bind1st bind2nd在stl里面有具体的实现,只是只能绑定两个参数. boost里面的bind使用bind(Fun f,A1 a1,A2,a2...)产生一个对象,这个对象可以有占位符,可以 ...

  6. 2014ACM/ICPC亚洲区西安站 复旦命题

    http://codeforces.com/gym/100548 A 签到 问一个序列是不是yes,yes的序列满足每个数都是3的倍数. #include<cstdio> int main ...

  7. delete错误

    今天找了半天delete错误,后来才知道是MTd和MDd模式的问题,MTd的内存申请和释放必须在同一个模块里面,接口上面不能使用stl等,MDd可以使用.改成MDd就可以了

  8. 操作集合的工具类Collections

    1       操作集合的工具类Collections Java提供了一个操作Set.List和Map等集合的工具类:Collections,该工具类里提供了大量方法对集合元素进行排序.查询和修改等操 ...

  9. Python中的元类和__metaclass__

    1.什么是元类 元类让你来定义某些类是如何被创建的,从根本上说,赋予你如何创建类的控制权.可以把元类想成是一个类中类,或是一个类,它的实例是其它的类.当某个类调用type()函数时,你就会看到它到底是 ...

  10. 彻底理解js中this的指向

    首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然 ...