tomcat 的工作线程为什么如此多?

问题描述

我的网站使用的是apache+tomcat的传统配置方式,每当晚上10点左右的时候,apache的并发连接数有300左右,而每个网页包含的最少文件数为4个,这样算下来的话,tomcat的工作线程最多有80-100,但是观察其当前busy的线程竟然维持在800左右,不知道是什么原因。其中kill -3 pid 后,有好多如下的线程:"TP-Processor2349" daemon prio=10 tid=0x09ea2c00 nid=0x103c runnable [0x6003f000..0x6003ff30] java.lang.Thread.State: RUNNABLE at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:129) at java.io.BufferedInputStream.fill(BufferedInputStream.java:218) at java.io.BufferedInputStream.read1(BufferedInputStream.java:258) at java.io.BufferedInputStream.read(BufferedInputStream.java:317) - locked <0x929eb9d0> (a java.io.BufferedInputStream) at org.apache.jk.common.ChannelSocket.read(ChannelSocket.java:620) at org.apache.jk.common.ChannelSocket.receive(ChannelSocket.java:558) at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:685) 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)请大家帮我看看是什么原因?问题补充:有没有知道为什么产生这种情况?我在访问量比高峰期少的情况下,查看线程的工作状态,busy thread最多采5-10个,在访问量仅仅增长了30%左右(从20000pv/小时-->26000pv/小时),busy thread 为什么会达到700多呢,而且一直维持这个水平达一个多小时,很是费解,站长能不能给点建议呀?大家帮帮忙,谢谢啦。问题补充:系统中才用的是commons-logging,没有使用system.out,我在google中搜索,有的说可能是log4j引起的,个人感觉好像不像。

解决方案

关与tomcat 方面,你可以采用优化措施:当线程过多机器资源消耗过大,不仅影响性能,严重还会宕机。例如线程达到150左右时服务端会抛出socket资源用尽的错误,你很难再往上加,响应的速度也变的异常的缓慢,你可以在Tomcat的服务器配置文件中优化一下配置,比如在server.xml中修改,增加节点数目,可以有效的提高性能: <Connector port="8080" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="30" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" />适当修改粗、斜字体部分的值,几个参数意义分别为:maxThreads:Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。connnectionTimeout:网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。minSpareThreads:Tomcat初始化时创建的线程数。maxSpareThreads:一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程  对于Connector 8443也有相应的设置,如果同时会用到http与https,应合理分配这两个数据.如果只用到其中的一个,可以将另外一个尽量设置小一点.  此外,还可以给Java虚拟机设置使用的内存来提高性能,Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,需要调大。  Windows下,在文件{tomcat_home}/bin/catalina.bat,Unix下,在文件{tomcat_home}/bin/catalina.sh中的set CURRENT_DIR=%cd%前面,增加如下设置:  JAVA_OPTS=-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】  需要把这个两个参数值调大。例如:  JAVA_OPTS=-Xms256m -Xmx512m   这样,当tomcat线程数增大,但没有超过最大线程数时,平均响应时间会增大,但这不意味着tomcat在线程增多时响应速度变慢.在测试中发现,由于线程数增多,在请求时需要排队,导致一部分请求会一直排队,随着线程数的增多,排队等待的最大时间也会越来越大,而这些大数据才是导致平均响应时间变大的罪魁祸首.响应时间大于3s的请求占总请求的比例一直维持在3%-5%. 系统代码中的System.out语句会严重影响代码执行的效率,有必要在测试完成之后清除这些垃圾log,或者建议换用log4j等可配置的日志组件。
解决方案二:
<Connector port="8080" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="30" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" />不好意思,粗、斜体标漏了几个,这里补充一下。

时间: 2024-11-05 23:30:46

tomcat 的工作线程为什么如此多?的相关文章

你真的了解:IIS连接数、IIS并发连接数、IIS最大并发工作线程数、应用程序池的队列长度、应用程序池的最大工作进程数 吗?

原文:你真的了解:IIS连接数.IIS并发连接数.IIS最大并发工作线程数.应用程序池的队列长度.应用程序池的最大工作进程数 吗? IIS连接数   一般购买过虚拟主机的朋友都熟悉购买时,会限制IIS连接数,这边先从普通不懂代码用户角度理解IIS连接数 顾名思义即为IIS服务器可以同时容纳客户请求的最高连接数,准确的说应该叫"IIS限制连接数" 这边客户请求的连接内容包括: 1.网站html请求,html中的图片资源,html中的脚本资源,其他需要连接下载的资源等等,任何一个资源的请求

netty 多线程-关于netty工作线程并发的问题。

问题描述 关于netty工作线程并发的问题. 最近在做一个项目的压测是有关netty并发的.1.工作线程coresize设置最小20,最大100,但是worker线程数一直都是20从来没超过,也增加过并发量,不知道是什么原因.2.尝试把coresize调整为50,工作线程只创建到48. 想请教下,1中为何线程数达不到最大线程设置:work线程的工作机制究竟是咋么样:现打算进行调优,该从哪方面下手. 解决方案 http://www.infoq.com/cn/articles/netty-concu

SQL server的worker thread工作线程讲解

我们都知道SQL server的worker thread是SQL server 用来执行task的工作线程.Worker threads 的数目缺省是SQL server 动态创建的,需要多少就会创建多少,直到到达"max worker threads"的上限.如果你想改变缺省的worker threads,那么可以使用下面的脚步修改: exec sp_configure'show advance',1 go reconfigure with override go exec sp_

启动多个工作线程-下载图片一般都是单任务伦循。但是如果每次下载图片都开启一个工作线程会导致什么?

问题描述 下载图片一般都是单任务伦循.但是如果每次下载图片都开启一个工作线程会导致什么? 如题.工作线程起多了会导致什么?会不会导致内存益出.然后崩了? 解决方案 Android 一个下载任务分为多个线程下载unity 线程下载图片 解决方案二: 首先无限制创建线程是不可能的~不同的系统给的限制可能不同:有的是1M,有的更多~但绝不会出现分配线程过多导致死机的情形~ 解决方案三: 如果需要下载多个图片,用一个线程的多首先代码编写会方便一些,当然你把线程包装成方法,倒着没多大差别.接下来就讨论多线

HBase源码分析之HRegionServer上的MovedRegionsCleaner工作线程

        MovedRegionsCleaner是什么呢?我们先来看下它在HRegionServer上的定义: /** * Chore to clean periodically the moved region list * 被移动Region列表的定期清理工作线程 */ private MovedRegionsCleaner movedRegionsCleaner;         原来它是HRegionServer上一个被移动Region列表的定期清理工作线程.而它的类的定义如下:

略谈如何从工作线程中弹出对话框

工作线程,在一些技术文章被称为辅助线程,是相对于主线程而言的.在工作线程中使用界面需要一些技巧.我就曾在工程线程中弹出对话框中遇到过莫名奇妙的错误.下面就我的经验谈谈如何从工作线程中弹出对话框(暂时只讲方法,原理还没彻底弄清楚).   实际上在工作线程中直接弹出模式对话框中在debug模式下有时出错(这里的有时的意思是必然会出错,但是不是每次都出错),弹出模式对话框的代码如下:   DWORD WINAPI RecvThread(LPVOID lpParam)    // 工作线程函数 {   

tomcat的工作原理-TOMCAT如何工作?tomcat的运行原理

问题描述 TOMCAT如何工作?tomcat的运行原理 近来被一件事情困扰,那就是不知道tomcat到底是怎么工作的,我只了解tomcat是一个中间件,可以部署项目,启动服务,我想了解tomcat到底是怎么工作的,里边的代码是怎么实现一行一行的往下执行的? 解决方案 http://mmz66.blog.163.com/blog/static/4223403720078245729905/ 如果回答对你有帮助,请采纳 解决方案二: 看看我写的这两篇文档:tomcat相关tomcat启动过程

HDFS源码分析心跳汇报之BPServiceActor工作线程运行流程

        在<HDFS源码分析心跳汇报之数据结构初始化>一文中,我们了解到HDFS心跳相关的BlockPoolManager.BPOfferService.BPServiceActor三者之间的关系,并且知道最终HDFS的心跳是通过BPServiceActor线程实现的.那么,这个BPServiceActor线程到底是如何工作的呢?本文,我们将继续HDFS心跳分析之BPServiceActor工作线程运行流程.         首先,我们先看下         那么,BPServiceA

关于IIS工作线程数的设置

问题描述 测试客户端:开了4个进程,每个进程创建10线程去访问本地IIS网页.测试服务器A:本地IIS网页,逻辑:Sleep(200)返回直接返回.测试服务器B:本地VS程序自带IIS,逻辑同上实际测试情况1:首先打开一个测试客户端进程,使用10个线程同时访问测试服务器A和测试服务器B,测试结果相似.实际测试情况2:打开4个测试客户端进程,使用40个进程同时访问测试服务器A和B,测试结果相差4倍.查看性能监视器,发现RequestsCurrent发现当前线程的值在测试服务A时为10,测试服务器B