TongWeb中通道的线程任务队列大小(queueSize)和TCP等待队列大小(acceptCount)参数的含义和关系
TongWeb中通道maxQueueSize和acceptCount参数的含义和区别
在 TongWeb中,maxQueueSize 和 acceptCount 是两个与请求处理队列相关的核心参数,它们共同作用于并发请求的接收和处理流程,但所处的层面和作用机制有显著区别。理解两者的差异和协作关系,对优化 TongWeb 高并发性能至关重要。
- 参数定义与作用
1. acceptCount(操作系统层面的连接队列)
- 作用:控制操作系统内核维护的 TCP 连接队列(backlog 队列) 的最大长度。当 TongWeb 的工作线程全部忙碌时,新到来的 TCP 连接会先进入该队列等待,直到有线程空闲后再被处理。
- 本质:这是操作系统层面的队列,用于暂存 “已建立但未被 TongWeb 应用层处理” 的 TCP 连接。
- 默认值:TongWeb8企业版默认值为500;TongWeb7嵌入式版本默认值为100。
- 队列满时的行为:若队列已满,新的 TCP 连接会被操作系统直接拒绝,客户端会收到 “Connection Refused” 错误(无法建立连接)。
2. maxQueueSize(TongWeb 应用层面的请求队列)
- 作用:控制 TongWeb 应用内部维护的 请求处理队列 的最大长度。当所有工作线程(由 maxThreads 控制)都在处理请求时,已建立 TCP 连接的请求会进入该队列等待线程空闲。
- 本质:这是 TongWeb 应用层的队列,用于暂存 “已建立连接但未被线程处理” 的 HTTP 请求。
- 默认值:TongWeb8企业版默认值为100000;TongWeb7嵌入式版本默认值未知(无限制?),且只能通过代码配置。
- 队列满时的行为:若队列已满,TongWeb 会直接拒绝请求,并返回 HTTP 503 Service Unavailable 错误(连接已建立,但请求被拒绝处理)。
- 工作流程与协作关系
当客户端向 TongWeb 发送请求时,流程如下:
- 建立 TCP 连接:客户端先与 TongWeb 服务器建立 TCP 连接,若此时 TongWeb 工作线程空闲,连接会直接被处理;
- 进入 acceptCount 队列:若工作线程全部忙碌,新的 TCP 连接会进入操作系统的 acceptCount 队列等待;
- 进入 maxQueueSize 队列:当工作线程从 acceptCount 队列中取出连接后,若线程仍忙碌,请求会被放入 TongWeb 应用层的 maxQueueSize 队列等待;
- 处理请求:工作线程空闲时,从 maxQueueSize 队列中取出请求并执行。
示意图:
客户端请求 → TCP 握手 → [acceptCount 队列(操作系统)] → [maxQueueSize 队列(TongWeb 应用)] → 工作线程处理
- 核心区别
维度 | acceptCount | maxQueueSize |
作用层面 | 操作系统内核(TCP 连接层) | TongWeb 应用层(HTTP 请求处理层) |
队列内容 | 暂存 “已建立但未被 TongWeb 处理” 的 TCP 连接 | 暂存 “已被 TongWeb 接收但未被线程处理” 的 HTTP 请求 |
满队列行为 | 拒绝 TCP 连接(返回 Connection Refused) | 拒绝 HTTP 请求(返回 503 错误) |
依赖条件 | 与操作系统内核参数(如 net.core.somaxconn)相关 | 仅依赖 TongWeb 应用配置,与操作系统无关 |
版本支持 | 所有 TongWeb 版本均支持配置 | TongWeb7嵌入式版本只能通过代码配置 |
默认值 | TongWeb8企业版本500、TongWeb7嵌入式版100 | TongWeb8企业版100000;TongWeb7嵌入式版本未知(无限制?) |
- 配置建议
- 高并发场景:
- 若客户端频繁出现 Connection Refused,说明 acceptCount 过小,需增大(如调整为 200-500);
- 若频繁出现 503 错误,说明 maxQueueSize 或工作线程(maxThreads)不足,需根据请求处理耗时调整队列长度或增加线程数。
- 参数配合:
- 通常 maxQueueSize 应大于 acceptCount,避免应用层队列先满导致请求被拒绝;
- TongWeb8企业版本配置示例
在TongWeb8的通道配置中,有


<connector SSLDisableCompression="true" SSLDisableSessionTickets="false" SSLEnabled="false" SSLHonorCipherOrder="false" SSLVerifyClient="NONE" SSLVerifyDepth="10" URIEncoding="UTF-8" acceptCount="500" address="0.0.0.0" algorithm="SunX509" allowHostHeaderMismatch="false" allowMethods="GET,POST" asyncTimeout="30000" clientAuth="false" compressibleMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json,application/xml" compression="off" compressionMinSize="2048" connectionLinger="-1" connectionTimeout="60000" connectionUploadTimeout="300000" defaultSSLHostConfigName="_default_" disableUploadTimeout="true" discardFacades="false" enableKAE="false" enableLookups="false" encodedSolidusHandling="reject" gmEnabled="false" http2Enabled="false" httpRedirect="true" ignoreHeader="false" keepAliveTimeout="60000" keystoreFile="conf/server.keystore" keystoreType="JKS" maxConnections="10000" maxCookieCount="200" maxExtensionSize="8192" maxHeaderCount="100" maxHttpHeaderSize="8192" maxKeepAliveRequests="1000" maxParameterCount="10000" maxPostSize="-1" maxSavePostSize="4096" maxSwallowSize="2097152" maxThreads="3" maxTrailerSize="8192" minSpareThreads="3" name="server" noCompressionStrongETag="true" parseBodyMethods="POST,PUT" pollerThreadCount="1" pollerThreadPriority="5" port="8088" portOffset="0" processorCache="1000" protocol="com.tongweb.coyote.http11.Http11NioProtocol" proxyPort="1" queueSize="100000" redirectPort="443" relaxedPathChars=""<>[\]^`{|}" relaxedQueryChars=""<>[\]^`{|}" scheme="http" secure="false" selectorTimeout="1000" sendfileSize="48" serverRemoveAppProvidedValues="false" sessionCacheSize="-1" sessionTimeout="86400" skipCharsValidate="false" sniParseLimit="65536" systemManaged="true" tcpNoDelay="true" threadKeepAliveTime="60" threadPriority="5" throwOnFailure="false" trustMaxCertLength="10" truststoreAlgorithm="PKIX" truststoreType="JKS" useBodyEncodingForURI="false" useIPVHosts="false" useKeepAliveResponseHeader="false" useNetworkMonitor="false" useSendfile="false" useServerCipherSuitesOrder="false" useVirtualThreads="false" xpoweredBy="false"/>
- TongWeb7企业版配置示例
在TongWeb7嵌入式版本中的配置
server.port=8089
#设置tongweb的最大工作线程数
server.tongweb.max-threads=3
#最小工作线程,连接池中应用保护的最小空余线路数
server.tongweb.min-spare-threads=1
#最大的线程等待队列数,当线程满后,线程的请求会进入次队列数,如果等待队列满了会拒绝请求
server.tongweb.max-queue-size=3
#最大连接数
server.tongweb.max-connections=3
#最大的连接等待队列大小,当连接数满后,连接会进入次等待队列,等待队列满后,连接会被拒绝
server.tongweb.accept-count=3
TongWeb7.0..e.7之前版本的max-queue-size不能直接配置,需要在代码中添加配置参数,如下:
@Configuration
public class TongWebConfig {
@Value("${server.tongweb.max-queue-size:100}")
private int maxQueueSize;
@Bean
public WebServerFactoryCustomizer<TongWebServletWebServerFactory> webServerFactoryCustomizer() {
return factory -> factory.addConnectorCustomizers(
(TongWebConnectorCustomizer) connector -> {
// 从配置文件读取 maxQueueSize 的值,默认为 100
//int maxQueueSize = 3; // 可以替换为从配置文件读取的值
connector.setAttribute("maxQueueSize", maxQueueSize);
}
);
}
}
- 监控与调优:
- 通过 JMX 监控队列长度(如 acceptCount 使用率、maxQueueSize 排队数),避免队列过长导致请求超时;
- 结合请求处理时间调整:若请求处理快(如 100ms 内),队列可设小些;若处理慢(如 1s+),队列可适当增大。
- 总结
- acceptCount 是 “连接入口” 的第一道防线,控制操作系统能暂存的最大连接数;
- maxQueueSize 是 “请求处理” 的第二道防线,控制 TongWeb 应用能暂存的最大请求数;
- 两者需配合 maxThreads(工作线程数)共同优化,避免因队列过小导致请求被拒,或队列过大导致内存溢出(OOM)。