Jmeter 压力测试步骤详解

file

file

Jmeter 压力测试步骤详解
jmeter教程(二十):性能测试执行及结果分析

JVM 调优

下边为修改后的JVM启动参数配置,该应用的JVM 主要用于网关,通过springcloud gateway 来实现的,请基于该网关的高并发应用场景,是否还需要再优化:

ENV JAVA_OPTS="-Xmx4096m -Xms4096m -Xmn1360m -XX:MaxMetaspaceSize=512m -XX:MaxDirectMemorySize=1024M -XX:+UseContainerSupport  -XX:MaxRAMPercentage=75.0 -XX:InitialRAMPercentage=75.0  -XX:MinRAMPercentage=75.0 "

根据你提供的JVM启动参数配置,对于一个基于Spring Cloud Gateway的高并发应用场景,这个配置已经相当不错了。以下是对你提供的参数的一些解释和建议:

  • -Xmx4096m:设置Java堆的最大内存为4GB。这将给应用程序提供较大的可用堆空间,适用于处理高并发的请求。

  • -Xms4096m:设置Java堆的初始内存为4GB。这将在应用程序启动时为堆分配一定的内存空间,以减少堆的动态扩展过程对性能的影响。

  • -Xmn1360m:设置年轻代的大小为1.36GB。年轻代是对象被创建和销毁的主要区域,根据你的应用负载和内存需求,这个值可能需要进行调整。

  • -XX:MaxMetaspaceSize=512m:设置元空间(Metaspace)的最大大小为512MB。元空间用于存放类的元数据信息,根据你的应用程序的类加载情况,这个值可能需要进行调整。

  • -XX:MaxDirectMemorySize=1024M:设置直接内存的最大值为1GB。这个与之前提到的直接内存参数相同,用于控制Netty等底层框架使用的直接内存大小。

  • -XX:+UseContainerSupport:启用容器支持,让JVM更好地适应容器环境。

  • -XX:MaxRAMPercentage=75.0 -XX:InitialRAMPercentage=75.0 -XX:MinRAMPercentage=75.0:设置JVM使用的内存百分比。在这个配置中,JVM将使用可用内存的75%作为最大、初始和最小内存大小。这有助于更好地利用主机的资源。

总体而言,你提供的JVM参数配置已经相当合理。然而,具体的优化还要视情况而定。如果在实际运行中遇到性能问题,可以考虑进行线程池的调整、GC策略的优化、代码的性能优化等。另外,监控和分析工具也可以帮助你了解应用程序的性能瓶颈并进行针对性的优化。

JVM 调优

jmap -heap

请根据下边的JVM 堆栈信息,做出解释,并给出是否需要调优设置的建议:
[master@magic-gateway-74dbd88b88-99hsz ~]$ jmap -heap 1
Attaching to process ID 1, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.381-b09

using thread-local object allocation.
Parallel GC with 2 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 4294967296 (4096.0MB)
   NewSize                  = 1426063360 (1360.0MB)
   MaxNewSize               = 1426063360 (1360.0MB)
   OldSize                  = 2868903936 (2736.0MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 528482304 (504.0MB)
   MaxMetaspaceSize         = 536870912 (512.0MB)
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 1361575936 (1298.5MB)
   used     = 707449320 (674.6762466430664MB)
   free     = 654126616 (623.8237533569336MB)
   51.95812450081374% used
From Space:
   capacity = 31981568 (30.5MB)
   used     = 16027272 (15.284797668457031MB)
   free     = 15954296 (15.215202331542969MB)
   50.11409071625256% used
To Space:
   capacity = 31457280 (30.0MB)
   used     = 0 (0.0MB)
   free     = 31457280 (30.0MB)
   0.0% used
PS Old Generation
   capacity = 2868903936 (2736.0MB)
   used     = 37860144 (36.10624694824219MB)
   free     = 2831043792 (2699.893753051758MB)
   1.3196727685761034% used

30051 interned Strings occupying 3129504 bytes.

这段信息是通过 jmap 工具获取的 JVM 堆内存使用情况。根据信息显示,该 JVM 使用的是 Parallel GC,并且启用了两个线程进行垃圾回收。堆内存大小为 4GB,其中新生代大小为 1.36GB(Eden Space + From Space),老年代大小为 2.74GB(PS Old Generation)。

从堆使用情况来看,新生代的 Eden 区已经使用了 51.95% 的空间,From 区使用了 50.11% 的空间,而 To 区没有被使用。老年代使用了 1.32% 的空间。同时,还有 30051 个字符串常量,占用了 3MB 的空间。

建议可以根据具体应用场景进行调优。例如:

  • 如果发现新生代和老年代使用率过高,可以考虑增加堆内存大小;
  • 如果发现 GC 时间过长,可以考虑调整垃圾回收器的类型或者使用 G1GC 进行垃圾回收;
  • 如果出现频繁 Full GC,可以考虑对代码进行优化,减少对象的创建和使用;
  • 如果字符串常量占用过多内存,可以考虑使用字符串常量池等技术进行优化。

需要注意的是,调优时应该根据实际应用场景和性能需求进行选择和测试,以达到最佳的性能和稳定性。

根据提供的堆栈信息,当前堆内存的使用情况看起来是正常的。新生代和老年代的使用率都比较低,没有出现明显的内存不足或频繁的垃圾回收情况。同时,字符串常量占用的内存也不算过多。

基于提供的信息,暂时看不出需要进行紧急的调优。但是需要注意的是,调优是否需要取决于应用的具体情况,包括应用的负载、并发访问量、内存管理需求等。建议根据实际的负载情况和性能监控数据,结合应用的具体情况来评估是否需要进行进一步的调优。

jstat -gc

请通过下边的堆栈信息判断是否需要调优:
[master@magic-gateway-74dbd88b88-99hsz ~]$ jstat -gc 1
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
30720.0 31232.0  0.0   15651.6 1329664.0 743789.2 2801664.0   36972.8   82136.0 78095.5 10200.0 9573.6      9    0.512   3      0.417    0.929
[master@magic-gateway-74dbd88b88-99hsz ~]$

根据提供的堆栈信息,我们可以看到以下指标:

  • S0C: Survivor 0 区的容量为 30720KB
  • S1C: Survivor 1 区的容量为 31232KB
  • S0U: Survivor 0 区已使用的空间为 0KB
  • S1U: Survivor 1 区已使用的空间为 15651.6KB
  • EC: Eden 区的容量为 1329664KB
  • EU: Eden 区已使用的空间为 743789.2KB
  • OC: Old 区的容量为 2801664KB
  • OU: Old 区已使用的空间为 36972.8KB
  • MC: 元空间(Metaspace)的容量为 82136KB
  • MU: 元空间已使用的空间为 78095.5KB
  • CCSC: 压缩类空间(Compressed Class Space)的容量为 10200KB
  • CCSU: 压缩类空间已使用的空间为 9573.6KB
  • YGC: Young Generation GC 的次数为 9 次
  • YGCT: Young Generation GC 的总时间为 0.512 秒
  • FGC: Full GC 的次数为 3 次
  • FGCT: Full GC 的总时间为 0.417 秒
  • GCT: 所有 GC 的总时间为 0.929 秒

根据这些指标,我们可以初步评估是否需要调优。需要注意的是,调优是否需要取决于应用的具体情况,包括应用的负载、并发访问量、内存管理需求等。

从提供的信息来看,Survivor 1 区已使用了一部分空间,但整体来说堆内存使用情况是可接受的。Young Generation GC 的次数和时间也相对较低,而 Full GC 的次数和时间也在可接受范围内。

综合来看,暂时看不出需要进行紧急的调优。但是建议根据实际的负载情况和性能监控数据,结合应用的具体情况来评估是否需要进行进一步的调优。

JVM

VisualVM 监控堆内存

打开VisualVM可以自动发现本地的Java进程,建立远程连接,也可以监控到远端服务器的Java进程。但是Kubernetes中的Pod该如何监控呢?解决办法非常简单

首先需要在Pod中开启JMX服务,方法如下(添加JMX相关启动参数,并开放端口)

containers:
    - name: xxx
      image: xxx-image
      ports:
        - name: tcp-jmx
          containerPort: 1100
          protocol: TCP
      env:
        - name: JAVA_OPTIONS
          value: >-
            -Xmx3000m 
            -Xms3000m 
            -XX:+UnlockExperimentalVMOptions
            -XX:+UseCGroupMemoryLimitForHeap 
            -Dcom.sun.management.jmxremote
            -Dcom.sun.management.jmxremote.authenticate=false
            -Dcom.sun.management.jmxremote.ssl=false
            -Dcom.sun.management.jmxremote.port=1100
            -Dcom.sun.management.jmxremote.rmi.port=1100
            -Djava.rmi.server.hostname=localhost

随后,Pod启动后,为了连接到该JMX服务,需要在本地建立端口转发规则

kubectl -n default port-forward xxx-pod 1100

然后就可以在VisualVM建立JMX连接了

jvm参数详解2

[master@magic-gateway-5497d74689-pg92n ~]$ jstat -gc 1
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
 0.0   36864.0  0.0   36864.0 823296.0 552960.0 2211840.0     0.0     84016.0 80022.9 10544.0 9824.4      6    0.896   0      0.000    0.896
[master@magic-gateway-5497d74689-pg92n ~]$ jmap -heap 1
Attaching to process ID 1, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.381-b09

using thread-local object allocation.
Garbage-First (G1) GC with 2 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 3145728000 (3000.0MB)
   NewSize                  = 838860800 (800.0MB)
   MaxNewSize               = 1426063360 (1360.0MB)
   OldSize                  = 5452592 (5.1999969482421875MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 528482304 (504.0MB)
   MaxMetaspaceSize         = 536870912 (512.0MB)
   G1HeapRegionSize         = 1048576 (1.0MB)

Heap Usage:
G1 Heap:
   regions  = 3000
   capacity = 3145728000 (3000.0MB)
   used     = 605028336 (576.9999847412109MB)
   free     = 2540699664 (2423.000015258789MB)
   19.23333282470703% used
G1 Young Generation:
Eden Space:
   regions  = 541
   capacity = 843055104 (804.0MB)
   used     = 567279616 (541.0MB)
   free     = 275775488 (263.0MB)
   67.28855721393035% used
Survivor Space:
   regions  = 36
   capacity = 37748736 (36.0MB)
   used     = 37748736 (36.0MB)
   free     = 0 (0.0MB)
   100.0% used
G1 Old Generation:
   regions  = 0
   capacity = 2264924160 (2160.0MB)
   used     = 0 (0.0MB)
   free     = 2264924160 (2160.0MB)
   0.0% used

31760 interned Strings occupying 3277216 bytes.
[master@magic-gateway-5497d74689-pg92n ~]$

根据您提供的堆栈信息,以下是对各个参数的解读:

  • S0C: 幸存者区 0(Survivor 0)的容量,即幸存者区域 0 的大小。
  • S1C: 幸存者区 1(Survivor 1)的容量,即幸存者区域 1 的大小。
  • S0U: 幸存者区 0 的使用量,即幸存者区域 0 当前已使用的内存大小。
  • S1U: 幸存者区 1 的使用量,即幸存者区域 1 当前已使用的内存大小。
  • EC: Eden 区(Eden Space)的容量,即 Eden 区的大小。
  • EU: Eden 区的使用量,即 Eden 区当前已使用的内存大小。
  • OC: 老年代(Old Generation)的容量,即老年代的大小。
  • OU: 老年代的使用量,即老年代当前已使用的内存大小。
  • MC: 元空间(Metaspace)的容量,即元空间的大小。
  • MU: 元空间的使用量,即元空间当前已使用的内存大小。
  • CCSC: 压缩类空间(Compressed Class Space)的容量,即压缩类空间的大小。
  • CCSU: 压缩类空间的使用量,即压缩类空间当前已使用的内存大小。
  • YGC: Young GC 的次数,即年轻代 GC 的触发次数。
  • YGCT: Young GC 的总时间,即年轻代 GC 的累计时间。
  • FGC: Full GC 的次数,即 Full GC 的触发次数。
  • FGCT: Full GC 的总时间,即 Full GC 的累计时间。
  • GCT: GC 的总时间,即 GC 的累计时间。

根据您提供的信息,可以看出以下几点:

  1. 幸存者区的大小为 36,864 字节,使用量为 0 字节。这可能意味着在进行垃圾回收时,幸存者区没有被使用,这是正常的。

  2. Eden 区的大小为 823,296 字节,使用量为 526,336 字节。Eden 区已经被使用了一部分内存,但仍有很多空闲空间可用。

  3. 老年代的大小为 2,211,840 字节,使用量为 0 字节。老年代当前没有被使用,这可能意味着应用程序的对象寿命较短,不需要存储在老年代中。

  4. 元空间的大小为 84,016 字节,使用量为 80,022.9 字节。元空间已经使用了一部分内存,但仍然有可用空间。

  5. 压缩类空间的大小为 10,544 字节,使用量为 9,824.4 字节。压缩类空间已经使用了一部分内存,但仍然有可用空间。

根据当前的堆栈信息,似乎内存使用情况是合理的。Eden 区和幸存者区域没有满,老年代和元空间的使用量为 0,这表明当前并不需要进行垃圾回收操作。

建议您继续监测内存使用情况,特别是观察老年代和元空间的使用情况,以便在需要时调整堆大小或其他 GC 相关的配置参数。

压测:
通过 50 个线程,持续时间 5 分钟压测,可以看到 新生代(伊甸园区)的内存很快就会被回收处理;

file

打印堆栈实时信息:

[master@magic-gateway-5497d74689-pg92n ~]$ jstat -gc 1
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
 0.0   1024.0  0.0   1024.0 859136.0 354304.0 2211840.0   39819.8   84272.0 80155.6 10544.0 9828.5    124    2.414   0      0.000    2.414
[master@magic-gateway-5497d74689-pg92n ~]$

YGC 回收次数 124,FGC2.14

file

[master@magic-gateway-5497d74689-pg92n ~]$ jmap -heap 1
Attaching to process ID 1, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.381-b09

using thread-local object allocation.
Garbage-First (G1) GC with 2 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 3145728000 (3000.0MB)
   NewSize                  = 838860800 (800.0MB)
   MaxNewSize               = 1426063360 (1360.0MB)
   OldSize                  = 5452592 (5.1999969482421875MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 528482304 (504.0MB)
   MaxMetaspaceSize         = 536870912 (512.0MB)
   G1HeapRegionSize         = 1048576 (1.0MB)

Heap Usage:
G1 Heap:
   regions  = 3000
   capacity = 3145728000 (3000.0MB)
   used     = 436184160 (415.9776306152344MB)
   free     = 2709543840 (2584.0223693847656MB)
   13.865921020507812% used
G1 Young Generation:
Eden Space:
   regions  = 376
   capacity = 879755264 (839.0MB)
   used     = 394264576 (376.0MB)
   free     = 485490688 (463.0MB)
   44.81525625744934% used
Survivor Space:
   regions  = 1
   capacity = 1048576 (1.0MB)
   used     = 1048576 (1.0MB)
   free     = 0 (0.0MB)
   100.0% used
G1 Old Generation:
   regions  = 40
   capacity = 2264924160 (2160.0MB)
   used     = 40871008 (38.977630615234375MB)
   free     = 2224053152 (2121.0223693847656MB)
   1.8045199358904804% used

31956 interned Strings occupying 3299320 bytes.
[master@magic-gateway-5497d74689-pg92n ~]$ jmap -heap 1
Attaching to process ID 1, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.381-b09

using thread-local object allocation.
Garbage-First (G1) GC with 2 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 3145728000 (3000.0MB)
   NewSize                  = 838860800 (800.0MB)
   MaxNewSize               = 1426063360 (1360.0MB)
   OldSize                  = 5452592 (5.1999969482421875MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 528482304 (504.0MB)
   MaxMetaspaceSize         = 536870912 (512.0MB)
   G1HeapRegionSize         = 1048576 (1.0MB)

Heap Usage:
G1 Heap:
   regions  = 3000
   capacity = 3145728000 (3000.0MB)
   used     = 458016960 (436.79901123046875MB)
   free     = 2687711040 (2563.2009887695312MB)
   14.559967041015625% used
G1 Young Generation:
Eden Space:
   regions  = 397
   capacity = 879755264 (839.0MB)
   used     = 416284672 (397.0MB)
   free     = 463470592 (442.0MB)
   47.31823599523242% used
Survivor Space:
   regions  = 1
   capacity = 1048576 (1.0MB)
   used     = 1048576 (1.0MB)
   free     = 0 (0.0MB)
   100.0% used
G1 Old Generation:
   regions  = 40
   capacity = 2264924160 (2160.0MB)
   used     = 40683712 (38.79901123046875MB)
   free     = 2224240448 (2121.2009887695312MB)
   1.7962505199291088% used

31956 interned Strings occupying 3299320 bytes.
[master@magic-gateway-5497d74689-pg92n ~]$ jmap -heap 1
Attaching to process ID 1, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.381-b09

using thread-local object allocation.
Garbage-First (G1) GC with 2 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 3145728000 (3000.0MB)
   NewSize                  = 838860800 (800.0MB)
   MaxNewSize               = 1426063360 (1360.0MB)
   OldSize                  = 5452592 (5.1999969482421875MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 528482304 (504.0MB)
   MaxMetaspaceSize         = 536870912 (512.0MB)
   G1HeapRegionSize         = 1048576 (1.0MB)

Heap Usage:
G1 Heap:
   regions  = 3000
   capacity = 3145728000 (3000.0MB)
   used     = 567150208 (540.8765869140625MB)
   free     = 2578577792 (2459.1234130859375MB)
   18.029219563802084% used
G1 Young Generation:
Eden Space:
   regions  = 501
   capacity = 879755264 (839.0MB)
   used     = 525336576 (501.0MB)
   free     = 354418688 (338.0MB)
   59.71394517282479% used
Survivor Space:
   regions  = 1
   capacity = 1048576 (1.0MB)
   used     = 1048576 (1.0MB)
   free     = 0 (0.0MB)
   100.0% used
G1 Old Generation:
   regions  = 40
   capacity = 2264924160 (2160.0MB)
   used     = 40765056 (38.8765869140625MB)
   free     = 2224159104 (2121.1234130859375MB)
   1.7998419867621527% used

31956 interned Strings occupying 3299320 bytes.
[master@magic-gateway-5497d74689-pg92n ~]$ jmap -heap 1
Attaching to process ID 1, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.381-b09

using thread-local object allocation.
Garbage-First (G1) GC with 2 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 3145728000 (3000.0MB)
   NewSize                  = 838860800 (800.0MB)
   MaxNewSize               = 1426063360 (1360.0MB)
   OldSize                  = 5452592 (5.1999969482421875MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 528482304 (504.0MB)
   MaxMetaspaceSize         = 536870912 (512.0MB)
   G1HeapRegionSize         = 1048576 (1.0MB)

Heap Usage:
G1 Heap:
   regions  = 3000
   capacity = 3145728000 (3000.0MB)
   used     = 793539160 (756.7779159545898MB)
   free     = 2352188840 (2243.22208404541MB)
   25.22593053181966% used
G1 Young Generation:
Eden Space:
   regions  = 717
   capacity = 879755264 (839.0MB)
   used     = 751828992 (717.0MB)
   free     = 127926272 (122.0MB)
   85.45887961859357% used
Survivor Space:
   regions  = 1
   capacity = 1048576 (1.0MB)
   used     = 1048576 (1.0MB)
   free     = 0 (0.0MB)
   100.0% used
G1 Old Generation:
   regions  = 40
   capacity = 2264924160 (2160.0MB)
   used     = 40661592 (38.777915954589844MB)
   free     = 2224262568 (2121.22208404541MB)
   1.7952738867865667% used

31956 interned Strings occupying 3299320 bytes.
[master@magic-gateway-5497d74689-pg92n ~]$ jmap -heap 1
Attaching to process ID 1, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.381-b09

using thread-local object allocation.
Garbage-First (G1) GC with 2 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 3145728000 (3000.0MB)
   NewSize                  = 838860800 (800.0MB)
   MaxNewSize               = 1426063360 (1360.0MB)
   OldSize                  = 5452592 (5.1999969482421875MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 528482304 (504.0MB)
   MaxMetaspaceSize         = 536870912 (512.0MB)
   G1HeapRegionSize         = 1048576 (1.0MB)

Heap Usage:
G1 Heap:
   regions  = 3000
   capacity = 3145728000 (3000.0MB)
   used     = 745342192 (710.8137054443359MB)
   free     = 2400385808 (2289.186294555664MB)
   23.693790181477866% used
G1 Young Generation:
Eden Space:
   regions  = 671
   capacity = 879755264 (839.0MB)
   used     = 703594496 (671.0MB)
   free     = 176160768 (168.0MB)
   79.9761620977354% used
Survivor Space:
   regions  = 1
   capacity = 1048576 (1.0MB)
   used     = 1048576 (1.0MB)
   free     = 0 (0.0MB)
   100.0% used
G1 Old Generation:
   regions  = 40
   capacity = 2264924160 (2160.0MB)
   used     = 40699120 (38.81370544433594MB)
   free     = 2224225040 (2121.186294555664MB)
   1.7969308076081452% used

31956 interned Strings occupying 3299320 bytes.
[master@magic-gateway-5497d74689-pg92n ~]$

相关文章:
如何监控kubernetes中的JVM
利用VisualVm和JMX远程监控K8S里的Java进程

为者常成,行者常至