前提:需要启用manager应用并配置用户权限
访问地址:
http://<host>:<port>/manager/status
查看连接信息:
在 catalina.sh 或 startup.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"
service:jmx:rmi:///jndi/rmi://<host>:9000/jmxrmiCatalina -> ThreadPool -> http-* 或 ajp-*# 使用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
# 查看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"
ss -s | grep -A 1 'Total:' # 查看总连接数
ss -ant | grep :8080 | wc -l # 查看特定端口连接数
部署第三方管理工具,提供更详细的监控信息。
@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());
}
}
配置 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"
@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 "%r" %s %b %D %T" />
%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 |
保持活动连接数 | 根据业务调整 |
选择哪种方式取决于你的具体需求、环境配置和安全要求。