宣城市文章资讯

查看tomcat并发连接数实现方式

2026-03-30 22:04:02 浏览次数:0
详细信息

一、通过Tomcat管理界面(Manager App)

前提:需要启用manager应用并配置用户权限

访问地址

http://<host>:<port>/manager/status

查看连接信息

二、通过JMX监控

1. 启用JMX远程监控

catalina.shstartup.sh 中添加JVM参数:

JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote
  -Dcom.sun.management.jmxremote.port=9000
  -Dcom.sun.management.jmxremote.ssl=false
  -Dcom.sun.management.jmxremote.authenticate=false"

2. 使用JConsole或VisualVM连接

3. 使用JMX命令行工具

# 使用jmxterm
echo "get -b java.lang:type=Threading ThreadCount" | java -jar jmxterm.jar -l localhost:9000

# 或使用cmdline-jmxclient
java -jar cmdline-jmxclient-0.10.3.jar localhost:9000 java.lang:type=Threading ThreadCount

三、通过命令行工具

1. 使用netstat(Linux)

# 查看Tomcat所有连接
netstat -anp | grep <tomcat_pid> | grep -E ':(8080|8009)' | wc -l

# 按状态统计
netstat -anp | grep <tomcat_pid> | grep :8080 | awk '/^tcp/ {print $6}' | sort | uniq -c

# 实时监控脚本
watch -n 1 "netstat -an | grep :8080 | wc -l"

2. 使用ss命令(Linux)

ss -s | grep -A 1 'Total:'  # 查看总连接数
ss -ant | grep :8080 | wc -l  # 查看特定端口连接数

四、通过Tomcat自带脚本

1. 使用probe或psi-probe

部署第三方管理工具,提供更详细的监控信息。

2. 自定义监控Servlet

@WebServlet("/monitor/connections")
public class ConnectionMonitorServlet extends HttpServlet {

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
            throws ServletException, IOException {

        // 获取连接器信息
        Connector[] connectors = ((StandardService) 
            StandardServer.getServer().findServices()[0]).findConnectors();

        JSONObject result = new JSONObject();
        for (Connector connector : connectors) {
            ProtocolHandler handler = connector.getProtocolHandler();
            if (handler instanceof AbstractProtocol) {
                AbstractProtocol<?> protocol = (AbstractProtocol<?>) handler;
                result.put(connector.getProtocol(), new JSONObject()
                    .put("maxConnections", protocol.getMaxConnections())
                    .put("currentConnections", 
                         protocol.getHandler().getGlobalRequestProcessor().getConnectionCount())
                    .put("maxThreads", protocol.getMaxThreads())
                    .put("currentThreadsBusy", protocol.getCurrentThreadsBusy())
                    .put("currentThreadCount", protocol.getCurrentThreadCount()));
            }
        }

        resp.setContentType("application/json");
        resp.getWriter().write(result.toString());
    }
}

五、使用监控工具

1. Prometheus + JMX Exporter

配置 jmx_exporter

lowercaseOutputName: true
rules:
  - pattern: 'Catalina<type=ThreadPool, name="(\w+-\w+)"><>(currentThreadCount|currentThreadsBusy|maxThreads):'
    name: tomcat_threads_$2
    labels:
      pool: "$1"
  - pattern: 'Catalina<type=GlobalRequestProcessor, name="(\w+-\w+)"><>(requestCount|errorCount|bytesSent|bytesReceived):'
    name: tomcat_$2_total
    labels:
      processor: "$1"

2. 使用Micrometer

@Configuration
public class MetricsConfig {

    @Bean
    public MeterBinder tomcatMetrics() {
        return new TomcatMetrics();
    }
}

六、通过日志分析

server.xml 中配置访问日志:

<Valve className="org.apache.catalina.valves.AccessLogValve"
       directory="logs"
       prefix="localhost_access_log"
       suffix=".txt"
       pattern="%h %l %u %t &quot;%r&quot; %s %b %D %T" />

七、实用脚本示例

实时监控脚本

#!/bin/bash
# monitor_tomcat_connections.sh

TOMCAT_PORT=8080
PID=$(pgrep -f "catalina")

while true; do
    TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
    TOTAL_CONNS=$(netstat -an | grep :$TOMCAT_PORT | wc -l)
    ESTABLISHED=$(netstat -an | grep :$TOMCAT_PORT | grep ESTABLISHED | wc -l)
    TIME_WAIT=$(netstat -an | grep :$TOMCAT_PORT | grep TIME_WAIT | wc -l)

    echo "$TIMESTAMP | Total: $TOTAL_CONNS | Established: $ESTABLISHED | Time-Wait: $TIME_WAIT"

    # 如果使用NIO/APR,可以获取更多信息
    if [ -n "$PID" ]; then
        THREADS=$(ps -o nlwp= $PID | tr -d ' ')
        echo "  PID: $PID | Threads: $THREADS"
    fi

    sleep 5
done

八、关键指标说明

指标 说明 健康标准
maxThreads 最大工作线程数 根据服务器配置调整
currentThreadCount 当前线程数 < 90% maxThreads
currentThreadsBusy 繁忙线程数 < 70% maxThreads
connectionCount 当前连接数 < maxConnections
keepAliveCount 保持活动连接数 根据业务调整

建议方案

开发环境:使用Tomcat Manager或简单脚本 测试环境:配置JMX + JConsole 生产环境

选择哪种方式取决于你的具体需求、环境配置和安全要求。

相关推荐