MySQL, Oracle, Linux, 软件架构及大数据技术知识分享平台

网站首页 > 精选文章 / 正文

记Tomcat优化方案(tomcat优化有哪些)

2025-06-30 16:34 huorong 精选文章 1 ℃ 0 评论

Tomcat服务吞吐量评估方案

问题:评估方案

在一台8核16G的linux服务器上,使用tomcat容器部署服务。在正常情况下如何评估这个tomcat服务可处理的连接数,即服务的吞吐量,请在正常情况下考虑各方面因素,给出一个评估方案

评估一个8核16G Linux服务器上Tomcat容器的吞吐量需要考虑多方面因素。以下是系统的评估方案:

1. 硬件资源评估

CPU资源

  • 8核CPU理论上可支持8个线程并行处理
  • Tomcat默认配置下,每个请求会占用一个线程
  • 建议最大线程数配置为CPU核心数的2-4倍(16-32个线程)

内存资源

  • 16G内存中需考虑:OS占用:约1-2GTomcat JVM堆内存:建议8-12G(-Xmx参数)剩余内存用于系统缓存和其他进程

2. Tomcat配置评估

关键配置参数:

  • maxThreads:建议16-32(根据CPU核心数)
  • acceptCount:等待队列长度,建议100-200
  • maxConnections:建议与maxThreads相同或略高
  • JVM参数:-Xmx12G -Xms12G(堆内存)

3. 应用特性评估

请求类型

  • 静态资源:吞吐量高(可达1000-5000 QPS)
  • 动态请求:取决于业务逻辑复杂度(通常100-1000 QPS)

响应大小

  • 小响应(<1KB):更高吞吐量
  • 大响应(>100KB):吞吐量降低

会话状态

  • 无状态应用:更高吞吐量
  • 有状态应用:吞吐量受会话管理影响

4. 网络因素

  • 网络带宽:千兆网卡理论最大约125MB/s
  • 延迟:影响响应时间

5. 评估方法

基准测试步骤:

  1. 准备测试环境
  2. 使用相同配置的测试服务器
  3. 部署与生产相同的应用
  4. 配置监控工具
  5. JVM监控(VisualVM, JConsole)
  6. 系统监控(top, vmstat, iostat)
  7. Tomcat访问日志
  8. 性能测试工具
  9. JMeter
  10. Gatling
  11. Locust
  12. ab (Apache Benchmark)
  13. 测试场景
  14. 逐步增加并发用户数(从10开始,每次增加10)
  15. 记录各并发级别下的:响应时间(平均、P90、P99)吞吐量(QPS)错误率系统资源使用率(CPU、内存、I/O)
  16. 确定瓶颈
  17. 当响应时间显著增加或错误率上升时,即为系统瓶颈点
  18. 观察是CPU、内存、I/O还是网络成为瓶颈

6. 经验估算

在典型Web应用场景下(中等复杂度动态请求):

  • 保守估计:500-1000并发连接
  • 乐观估计:1000-2000并发连接(优化良好时)

7. 优化建议

  1. Tomcat优化
  2. 启用NIO或APR连接器
  3. 合理配置线程池
  4. 启用压缩(对文本响应)
  5. JVM优化
  6. 选择合适的GC算法(如G1)
  7. 合理设置堆内存和元空间大小
  8. 应用优化
  9. 使用缓存(Redis等)
  10. 异步处理耗时操作
  11. 优化数据库访问

8. 长期监控

  • 实施APM监控(如SkyWalking, Pinpoint)
  • 设置性能基线并持续监控
  • 定期进行压力测试

通过以上系统化的评估和测试,可以较为准确地确定在您的8核16G服务器上Tomcat服务的吞吐量能力。

问题:JVM为-Xms2G -Xmx2G

服务的启动参数为-Xms2G -Xmx2G,请评估理论状态下的吞吐量,不考虑网络因素

根据您提供的JVM参数(-Xms2G -Xmx2G)和8核16G的服务器配置,在不考虑网络因素的情况下,Tomcat的理论吞吐量评估如下:


1. 关键资源配置分析

JVM内存(2G堆内存)

  • 可用内存:2GB堆内存限制了JVM能处理的对象数量年轻代(Young Generation):约占用堆的1/3(约700MB)老年代(Old Generation):约占用堆的2/3(约1.3GB)
  • 影响:如果应用内存占用较高(如大对象、缓存),可能频繁触发GC(垃圾回收),导致吞吐量下降。如果应用内存占用较低(如轻量级REST服务),2GB可能足够。

CPU(8核)

  • Tomcat默认使用 1个线程处理1个请求,因此:理论最大线程数(maxThreads:建议 2 * CPU核心数 = 16线程(保守)到 4 * CPU核心数 = 32线程(激进)。如果线程数设置过高(如200),会导致线程争抢CPU,反而降低吞吐量。

2. 理论吞吐量估算

场景1:轻量级请求(如简单API,无DB/IO)

  • 线程数maxThreads=32
  • 单请求处理时间:假设 10ms(纯CPU计算)
  • 理论QPS(Queries Per Second): [ QPS = \frac{线程数}{单请求处理时间} = \frac{32}{0.01} = 3200 \text{ QPS} ]
  • 实际考虑线程切换、GC等因素:约 2000-3000 QPS

场景2:中等请求(含DB查询/外部调用)

  • 线程数maxThreads=32
  • 单请求处理时间:假设 100ms(含DB查询)
  • 理论QPS: [ QPS = \frac{32}{0.1} = 320 \text{ QPS} ]
  • 实际考虑DB连接池、GC等:约 200-300 QPS

场景3:高内存占用请求(如大JSON解析、复杂计算)

  • 线程数maxThreads=16(避免OOM)
  • 单请求处理时间:假设 50ms
  • 理论QPS: [ QPS = \frac{16}{0.05} = 320 \text{ QPS} ]
  • 实际受GC影响更大:约 100-200 QPS

3. 关键瓶颈分析

  1. CPU限制
  2. 如果请求是CPU密集型(如计算),8核CPU最多支持 8个并行请求,但Tomcat通过多线程复用CPU,实际能支持更高QPS(如上述计算)。
  3. 如果线程数过高(如100+),会导致 线程竞争CPU,反而降低吞吐量。
  4. 内存限制
  5. 2GB堆内存可能成为瓶颈:如果每个请求占用 1MB内存,32线程 ≈ 32MB 内存占用(看似足够)。但如果应用有缓存(如Guava Cache),可能快速耗尽内存,触发 Full GC,导致吞吐量骤降。
  6. 线程池限制
  7. Tomcat默认 maxThreads=200,但在此配置下:如果设置 maxThreads=200,但实际CPU只能有效调度 16-32线程,多余的线程会等待,增加延迟,但不提高吞吐量。建议 maxThreads=32acceptCount=100(等待队列)。

4. 优化建议

  1. 调整Tomcat线程池
  2. <Connector port="8080" protocol="HTTP/1.1" maxThreads="32" acceptCount="100" />
  3. 监控GC情况:如果频繁Full GC,需优化内存或增大 -Xmx。使用G1 GC(适合多核):
  4. -XX:+UseG1GC -XX:MaxGCPauseMillis=200
  5. 压测验证:使用JMeter/wrk模拟请求,观察:QPS变化JVM内存使用(jstat -gc <pid>)CPU使用率(top

5. 最终评估结论

场景

理论QPS

实际预估QPS(含GC/线程切换)

轻量级请求(10ms)

3200

2000-3000

中等请求(100ms)

320

200-300

高内存请求(50ms)

320

100-200

推荐配置

  • maxThreads=32(匹配CPU核心数)
  • -Xmx2G(如果OOM,可增至3-4G,但需留内存给OS)
  • 使用NIO连接器(减少线程阻塞)

实际吞吐量仍需通过 压力测试 验证,但以上计算可作为理论参考

问题:查询jvm使用什么垃圾回收器

如何查看当前服务的jvm使用的是什么垃圾回收器

在Linux服务器上,可以通过以下几种方式查看当前JVM使用的垃圾回收器(GC):

方法1:使用jcmd命令

jcmd <pid> VM.flags | grep GC
  • <pid> 替换为Java进程的PID(可通过 jpsps -ef | grep java 获取)。
  • 输出示例:
  • -XX:+UseG1GC # 使用G1垃圾回收器 -XX:+UseParallelGC # 使用Parallel GC(JDK8默认) -XX:+UseZGC # 使用ZGC(JDK11+)

方法2:使用jinfo命令

jinfo -flags <pid> | grep GC
  • 示例输出:
  • -XX:+UseConcMarkSweepGC # 使用CMS(已废弃) -XX:+UseSerialGC # 使用Serial GC(单线程)

方法3:通过JVM启动日志

如果服务通过 java -jar 启动,检查日志中JVM参数:

ps -ef | grep java
  • 查看启动命令中是否包含 -XX:+UseXXXGC(如 -XX:+UseG1GC)。

方法4:使用jstat查看GC行为

jstat -gc <pid> 1000 5
  • 输出中的 GC算法 列会间接反映使用的回收器:PSYoungGen/ParOldGen → Parallel GC(JDK8默认)G1 Young Generation → G1 GCZHeap → ZGC

方法5:通过JMX/VisualVM

  1. 运行 jvisualvm(需GUI或X11转发):
  2. jvisualvm
  3. 连接到目标Java进程,查看 Monitor → GC 标签页,会显示当前GC算法。

常见GC标识符对照表

JVM参数

垃圾回收器

备注

-XX:+UseSerialGC

Serial GC

单线程,适合极小内存

-XX:+UseParallelGC

Parallel GC

JDK8默认,多线程吞吐优先

-XX:+UseConcMarkSweepGC

CMS GC

JDK9已废弃

-XX:+UseG1GC

G1 GC

JDK9+默认,平衡吞吐/延迟

-XX:+UseZGC

ZGC

JDK11+,低延迟(大内存)

-XX:+UseShenandoahGC

Shenandoah GC

低延迟(OpenJDK特有)


注意事项

  1. JDK版本影响:JDK8默认:Parallel GCJDK9+默认:G1 GC
  2. 容器环境:如果Tomcat运行在Docker中,需进入容器执行命令:
  3. docker exec -it <container_id> bash jcmd 1 VM.flags | grep GC

通过以上方法,可以准确识别当前JVM的垃圾回收器,进而针对性地优化GC参数(如 -XX:MaxGCPauseMillis)。

问题:解析PS返回信息

使用ps命令返回的内容:

app       81674      1  4 May14 pts/0    01:56:58 /usr/bin/java -Djava.util.logging.config.file=/app/sf/tomcat-cim-9006/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dfile.encoding=UTF-8 -server -Xms2G -Xmx2G -XX:PermSize=256M -XX:MaxPermSize=256m -XX:+DisableExplicitGC -Djava.awt.headless=true -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dorg.apache.catalina.connector.RECYCLE_FACADES=true -Dignore.endorsed.dirs= -classpath /app/sf/tomcat-cim-9006/bin/bootstrap.jar:/app/sf/tomcat-cim-9006/bin/tomcat-juli.jar -Dcatalina.base=/app/sf/tomcat-cim-9006 -Dcatalina.home=/app/sf/tomcat-cim-9006 -Djava.io.tmpdir=/app/sf/tomcat-cim-9006/temp org.apache.catalina.startup.Bootstrap start

从您提供的 ps 命令输出中,JVM 的启动参数没有显式指定垃圾回收器(如 -XX:+UseG1GC-XX:+UseParallelGC),因此会根据 JDK 版本 使用默认的垃圾回收器。以下是分析步骤和结论:


1. 判断当前使用的垃圾回收器

(1) 根据JDK版本推断默认GC

JDK版本

默认垃圾回收器

JDK 8

Parallel GC (-XX:+UseParallelGC)

JDK 9+

G1 GC (-XX:+UseG1GC)

(2) 验证方法

如果无法直接查看JDK版本,可以通过以下命令确认:

# 查看Java版本(需与Tomcat使用的JVM一致)
/app/sf/tomcat-cim-9006/bin/catalina.sh version
或
java -version

(3) 从参数中排除其他GC

您的启动参数中 没有显式指定GC类型(如 -XX:+UseG1GC),但有以下相关参数:

  • -XX:+DisableExplicitGC:禁止手动调用 System.gc(),但不影响GC算法选择。
  • -XX:PermSize=256M -XX:MaxPermSize=256m:JDK8及之前版本的永久代配置(JDK8+已移除,改用元空间)。

结论
当前JVM使用的垃圾回收器是
JDK默认的GC,具体取决于JDK版本:

  • 如果是 JDK8 → Parallel GC
  • 如果是 JDK9+ → G1 GC

2. 如何精确确认当前GC

(1) 通过jcmd查询(推荐)

# 查找Tomcat的PID(您的ps输出中PID是81674)
jcmd 81674 VM.flags | grep GC

输出可能如下:

  • JDK8默认:
  • -XX:+UseParallelGC
  • JDK11默认:
  • -XX:+UseG1GC

(2) 通过GC日志验证

如果Tomcat配置了GC日志(如 -Xloggc:/path/to/gc.log),可以直接查看日志文件头部,通常会标明GC类型。例如:

Java HotSpot(TM) 64-Bit Server VM (25.321-b09) for linux-amd64 JRE (1.8.0_321-b09), built on Dec 17 2021 11:55:03 by "java_re" with gcc 7.3.0
Memory: 4k page, physical 16777216k(12345678k free), swap 0k(0k free)
CommandLine flags: -XX:+UseParallelGC -XX:+DisableExplicitGC ...

3. 各GC的典型特征

GC类型

关键特征

适用场景

Parallel GC

日志中出现 PSYoungGen(年轻代)、ParOldGen(老年代)

高吞吐量,JDK8默认

G1 GC

日志中出现 G1 Young GenerationG1 Old Generation

平衡吞吐/延迟,JDK9+默认

ZGC

需显式启用(-XX:+UseZGC

低延迟(JDK11+,大内存)


4. 优化建议

  1. 如果是Parallel GC(JDK8)
  2. 适合吞吐量优先的场景,但停顿时间较长。
  3. 可考虑升级到G1 GC(添加 -XX:+UseG1GC)。
  4. 如果是G1 GC(JDK9+)
  5. 默认表现良好,如需优化可调整:
  6. -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:G1HeapRegionSize=4m
  7. 通用建议
  8. 添加GC日志以便监控:
  9. -Xloggc:/app/logs/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps

总结

您的Tomcat 未显式指定GC,因此实际使用的垃圾回收器取决于JDK版本:

  • JDK8 → Parallel GC
  • JDK9+ → G1 GC

通过 jcmd 或 GC 日志可以精确确认。如果需要调整,建议根据应用特性(吞吐量/延迟需求)显式配置GC算法。

问题:OpenJDK1.8的GC类型

java版本信息:

openjdk version "1.8.0_332"
OpenJDK Runtime Environment (build 1.8.0_332-b09)
OpenJDK 64-Bit Server VM (build 25.332-b09, mixed mode)

根据您提供的Java版本信息:
OpenJDK 1.8.0_332,可以明确当前JVM使用的垃圾回收器(GC)为 Parallel GC(并行垃圾回收器),这是JDK8的默认GC。以下是详细分析和验证方法:


1. 确认GC类型

(1) JDK8的默认GC

  • OpenJDK 8 的默认垃圾回收器是 Parallel GC(也称为吞吐量优先回收器),其标志为:
  • -XX:+UseParallelGC
  • 即使您未在启动参数中显式指定,JVM也会自动启用它。

(2) 验证方法

通过以下命令直接检查JVM的GC参数(需替换81674为您的Tomcat PID):

jcmd 81674 VM.flags | grep GC

预期输出:

-XX:+UseParallelGC      # 明确使用Parallel GC
-XX:+DisableExplicitGC  # 您已配置的参数

2. Parallel GC的关键特性

特性

说明

年轻代回收器

PSYoungGen(Parallel Scavenge)

老年代回收器

ParOldGen(Parallel Old)

设计目标

最大化吞吐量(适合计算密集型应用)

停顿时间

较长(不适合低延迟场景)

适用场景

后台处理、批任务等对吞吐量要求高的应用


3. 如何通过GC日志确认

如果Tomcat配置了GC日志(建议添加以下参数):

-Xloggc:/app/logs/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps

日志中会出现类似内容:

PSYoungGen: 表示年轻代使用Parallel Scavenge
ParOldGen:  表示老年代使用Parallel Old

4. 优化建议(针对Parallel GC)

(1) 基础优化参数

-XX:+UseParallelGC
-XX:+UseParallelOldGC          # 启用老年代并行回收(默认已开启)
-XX:ParallelGCThreads=8       # 并行GC线程数(建议=CPU核心数,您的是8核)
-XX:MaxGCPauseMillis=200      # 目标最大停顿时间(毫秒,根据需求调整)
-XX:GCTimeRatio=99            # 吞吐量目标(GC时间占比1%)

(2) 内存分配优化

您的配置已设置堆内存:

-Xms2G -Xmx2G                 # 固定堆大小(避免动态扩容)

但永久代(PermGen)参数已过时(JDK8中建议移除):

-XX:PermSize=256M -XX:MaxPermSize=256m  # 无实际作用(JDK8已移除PermGen)

建议替换为元空间(Metaspace)参数(如果未指定,JDK8会默认自动管理):

-XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M

(3) 监控与调优

  • 监控GC行为
  • jstat -gc 81674 1000 5 # 每1秒输出1次GC统计,共5次
  • 关键指标YGC/YGCT:年轻代GC次数/耗时FGC/FGCT:Full GC次数/耗时(应尽量减少)

5. 是否需要切换到其他GC?

考虑G1 GC(需JDK8u40+)

如果应用需要更低的停顿时间(如Web服务),可尝试G1 GC:

-XX:+UseG1GC -XX:MaxGCPauseMillis=200

但需注意:

  • G1在JDK8中功能不如JDK11+完善。
  • 切换前需充分压测验证。

保持Parallel GC的场景

  • 如果应用是计算密集型(如数据处理),Parallel GC的吞吐量优势更明显。
  • 如果当前GC日志中Full GC较少(jstat -gcFGC值低),无需调整。

总结

  1. 当前GC:Parallel GC(JDK8默认)。
  2. 确认方法
  3. jcmd 81674 VM.flags | grep GC
  4. 优化方向:调整Parallel GC线程数和停顿时间目标。移除过时的PermGen参数,改用Metaspace。监控Full GC频率,决定是否切换G1。

问题:解析Tomcat的Connector配置

tomcat的Connector配置如下:

<Connector port="9006" 
               protocol="org.apache.coyote.http11.Http11Nio2Protocol"
               maxThreads="1000"
               minSpareThreads="100"
               acceptCount="1500"
               disableUploadTimeout="true"
               connectionTimeout="20000"
               maxPostSize="10240"
               maxHttpHeaderSize="8192"
               redirectPort="8443" />

根据您提供的Tomcat Connector配置(NIO2协议、maxThreads=1000)和服务器硬件(8核16G,JVM堆内存2G),以下是详细的性能评估和优化建议:


1. 当前配置的关键问题分析

(1) 线程数配置过高

  • maxThreads=1000 但服务器只有 8核:CPU核心数远低于线程数,会导致 频繁线程上下文切换,增加系统开销。实际并行处理能力受限于CPU核心数(理论最大并行请求数≈8)。
  • 建议
    maxThreads 应设置为 CPU核心数 * (1~2) + 异步任务等待比,推荐 16~32(8核场景)。

(2) 内存与线程的冲突

  • JVM堆内存仅 2GB:每个线程默认占用 1MB 栈空间(通过 -Xss 设置),1000线程 ≈ 1GB 内存(仅线程栈)。剩余堆内存可能不足处理请求数据(如JSON解析、数据库查询结果缓存),易触发 OOM

(3) Accept队列过长

  • acceptCount=1500:当线程池满时,请求会堆积在TCP队列,但队列过长会导致 请求超时(您设置的 connectionTimeout=20000 即20秒)。建议值:acceptCount = maxThreads * 2(如 maxThreads=32acceptCount=64)。

2. 理论吞吐量评估

(1) 理想场景(优化后配置)

配置项

推荐值

说明

maxThreads

32

匹配CPU核心数(8核×4)

acceptCount

64

避免队列堆积

JVM堆内存

4G~8G

建议增大(如 -Xms4G -Xmx4G

预估吞吐量



- CPU密集型

800~1500 QPS

每个请求耗时10ms时:32线程 / 0.01s = 3200 QPS(实际受GC等影响减半)

- IO密集型

200~500 QPS

每个请求耗时100ms(含DB查询):32线程 / 0.1s = 320 QPS

(2) 当前配置的风险

  • maxThreads=1000 时:CPU争抢严重:线程切换开销导致实际吞吐量可能 低于优化后的32线程配置内存不足:频繁Full GC会进一步降低吞吐量。

3. 优化建议

(1) Connector配置调整

<Connector 
    port="9006" 
    protocol="org.apache.coyote.http11.Http11Nio2Protocol"
    maxThreads="32"                 <!-- 关键优化:降低线程数 -->
    minSpareThreads="8"             <!-- 默认值即可 -->
    acceptCount="64"                <!-- 匹配maxThreads -->
    disableUploadTimeout="true"
    connectionTimeout="20000"
    maxPostSize="10240"
    maxHttpHeaderSize="8192"
    redirectPort="8443" 
    executor="tomcatThreadPool"     <!-- 可选:使用独立线程池 -->
/>

(2) JVM参数优化

-server -Xms4G -Xmx4G              <!-- 增大堆内存 -->
-XX:+UseG1GC                       <!-- 替换Parallel GC -->
-XX:MaxGCPauseMillis=200           <!-- G1最大停顿目标 -->
-XX:MetaspaceSize=256M             <!-- 替代PermGen -->
-XX:MaxMetaspaceSize=256M
-XX:+DisableExplicitGC

(3) 其他优化措施

  1. 使用连接池
  2. 数据库连接池(如HikariCP):
  3. hikari.maximumPoolSize=20 <!-- 建议值:CPU核心数×2 + 磁盘数×2 -->
  4. Redis连接池(如Lettuce)。
  5. 监控与调优验证
  6. 使用 jvisualvmArthas 监控线程状态:
  7. # 查看线程阻塞情况 jstack 81674 | grep -A 10 "BLOCKED"
  8. 压测工具(如JMeter)验证吞吐量。

4. 为什么降低线程数反而能提高吞吐量?

  • CPU密集型场景
    线程数超过CPU核心数时,上下文切换开销会抵消并行收益(参考 Amdahl定律)。
  • IO密集型场景
    应使用
    异步非阻塞(如NIO2)而非多线程阻塞等待,Tomcat的NIO2协议已支持此特性。

5. 最终推荐配置

组件

参数

Tomcat

maxThreads

32


acceptCount

64

JVM

-Xms4G -Xmx4G

4GB堆内存


-XX:+UseG1GC

启用G1 GC

OS

ulimit -n

≥65535(文件句柄)

通过以上优化,理论吞吐量可提升 30%~50%,同时避免OOM和线程竞争问题。实际效果需通过压测验证。

问题:查询Linux核心线程数

如何查询当前linux服务器的核心线程数

要查询当前 Linux 服务器的 核心线程数(即 CPU 逻辑线程数,通常为 CPU 核心数 × 超线程数),可以使用以下方法:


方法 1:通过nproc命令(最快)

nproc

输出示例

8

说明

  • 直接返回 可用的逻辑 CPU 线程数(包括超线程核心)。
  • 在您的 8 核服务器上,如果未启用超线程,输出为 8;若启用超线程(如 Intel Hyper-Threading),可能为 16

方法 2:通过lscpu命令(详细信息)

lscpu | grep -E "CPU\(s\)|Thread\(s\) per core"

输出示例

CPU(s):                8          # 逻辑CPU线程总数
Thread(s) per core:    2          # 每个物理核心的线程数(超线程)
Core(s) per socket:    4          # 每个CPU插槽的物理核心数
Socket(s):            1           # CPU插槽数

计算公式

  • 物理核心数 = Socket(s) × Core(s) per socket = 1 × 4 = 4
  • 逻辑线程数 = 物理核心数 × Thread(s) per core = 4 × 2 = 8

方法 3:通过/proc/cpuinfo

grep -c "processor" /proc/cpuinfo

输出示例

8

说明

  • 统计 processor 条目数,即 逻辑CPU线程总数
  • 也可查看详细拓扑:
  • cat /proc/cpuinfo | grep -E "processor|core id|physical id"

方法 4:通过top或htop动态查看

  1. 运行 top,然后按 1
  2. top -H
  3. 显示 每个逻辑CPU核心的负载,顶部会标注 CPU 数量(如 Cpu0, Cpu1, ..., Cpu7)。
  4. 或使用 htop(需安装):
  5. htop
  6. 界面顶部直接显示 CPU 逻辑线程数

区分物理核心与逻辑线程

指标

获取命令

说明

逻辑线程总数

nprocgrep -c processor /proc/cpuinfo

包括超线程虚拟的线程

物理核心数

`lscpu

grep "Core(s) per socket"`

是否启用超线程

`lscpu

grep "Thread(s) per core"`


您的服务器分析

根据您的配置(8核16G),典型情况:

  • 未启用超线程:8 逻辑线程 = 8 物理核心。
  • 启用超线程:16 逻辑线程 = 8 物理核心 × 2 线程/核心。

为什么需要知道核心线程数?

  1. 优化 TomcatmaxThreads 应设置为 逻辑线程数的 1~4 倍(如 8 核 → 16~32 线程)。
  2. 调整 JVM:Parallel GC 线程数默认等于逻辑线程数,可通过 -XX:ParallelGCThreads=N 覆盖。
  3. 避免资源竞争:线程数过多(如您的 maxThreads=1000)会导致上下文切换开销。

总结

  • 快速查询nproc
  • 详细拓扑lscpu
  • 动态监控top -H
  • 您的服务器:极可能是 8 逻辑线程(8 物理核心 × 1 线程/核心)。

Tags:hikari连接池

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言