怎么查看服务器的线程池?

查看服务器线程池的方法取决于具体的应用和服务,以下是几种常见场景的查看方法:

1. Java应用线程池

使用jstack工具

查看Java进程ID
jps -l
生成线程转储
jstack <pid> > thread_dump.txt
或者直接查看
jstack <pid> | grep -A 10 -B 10 "ThreadPool"

使用jconsole/jvisualvm

图形化工具查看
jconsole <pid>
或
jvisualvm

使用Arthas

查看线程池状态
thread --state RUNNABLE
thread-pool

2. Tomcat线程池

查看server.xml配置

<Connector port="8080" 
           maxThreads="200"
           minSpareThreads="10"
           maxConnections="10000"
           acceptCount="100"/>

使用JMX监控

启动时开启JMX
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9090
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

3. 数据库连接池

MySQL线程池

-- 查看连接线程
SHOW PROCESSLIST;
SHOW STATUS LIKE 'Threads_%';
-- 查看线程池配置
SHOW VARIABLES LIKE 'thread_handling';
SHOW VARIABLES LIKE 'thread_cache_size';

4. 系统级线程查看

Linux系统线程

查看所有线程
ps -eLf
查看特定进程的线程
ps -T -p <pid>
实时查看线程
top -H -p <pid>
查看线程数量
cat /proc/<pid>/status | grep Threads
统计线程数
ps -eLf | wc -l
ps -o nlwp <pid>

5. Nginx线程池

查看配置

worker_processes auto;
worker_rlimit_nofile 100000;
events {
    worker_connections 4096;
    use epoll;
    multi_accept on;
}

查看状态

查看nginx进程
ps -ef | grep nginx
查看线程
pstree -p <nginx_master_pid>

6. 自定义监控脚本

线程池监控脚本

#!/bin/bash
monitor_threadpools.sh
echo "=== 系统线程统计 ==="
echo "总线程数: $(ps -eLf | wc -l)"
echo "按进程统计:"
ps -eo pid,nlwp,comm --sort -nlwp | head -10
echo -e "\n=== Java进程线程池 ==="
for pid in $(jps -q); do
    echo "进程 $pid 线程数: $(ps -o nlwp -p $pid | tail -1)"
    jstack $pid 2>/dev/null | grep -c "java.util.concurrent.ThreadPoolExecutor" | \
    xargs echo "  线程池数量:"
done

7. 使用专业监控工具

Prometheus + Grafana

- 配置应用暴露线程池指标

- 使用JMX Exporter监控Java应用

其他工具

使用htop查看线程
htop
使用atop监控
atop
使用pidstat监控线程
pidstat -t -p <pid> 1 10

注意事项

1、生产环境谨慎使用 jstack,可能引起短暂停顿

2、线程池配置通常与应用配置文件相关

3、监控时注意区分用户线程和系统线程

4、合理设置线程池参数避免资源耗尽

选择合适的方法取决于你的具体应用类型和环境配置。

文章摘自:https://idc.huochengrm.cn/fwq/19395.html

评论