性能调优指南

Red Hat JBoss Enterprise Application Platform 7.3

评估红帽 JBoss 企业应用平台性能以及配置更新以提高性能的说明。

摘要

本书是针对红帽 JBoss 企业应用平台进行性能调优的指南。

第 1 章 简介

JBoss EAP 安装默认为优化。但是,对您的环境、应用和使用 JBoss EAP 子系统的配置可能会影响性能,这意味着可能需要其他配置。

本指南针对常见 JBoss EAP 用例提供优化建议,以及监控性能和诊断性能问题的说明。

重要

在将开发或测试环境中部署至生产之前,您应该先测试并验证所有性能配置更改。

1.1. 关于本文档中 EAP_HOME 的使用

在本文档中,变量 EAP_HOME 用于表示 JBoss EAP 安装的路径。将此变量替换为 JBoss EAP 安装的实际路径。

  • 如果您使用 ZIP 安装方法安装 JBoss EAP,安装目录是您提取 ZIP 存档的 jboss-eap-7.3 目录。
  • 如果您使用 RPM 安装方法安装 JBoss EAP,安装目录为 /opt/rh/eap7/root/usr/share/wildfly/
  • 如果您使用安装程序安装 JBoss EAP,EAP _HOME 的默认路径为 ${user.home}/EAP-7.3.0

    • 对于红帽企业 Linux 和 Solaris: /home/USER_NAME/EAP-7.3.0/
    • 对于 Microsoft Windows: C:\Users\USER_NAME\EAP-7.3.0\
  • 如果您使用 Red Hat CodeReady Studio 安装程序安装和配置 JBoss EAP 服务器,EAP _HOME 的默认路径为 ${user.home}/devstudio/runtimes/jboss-eap

    • 对于红帽企业 Linux: /home/USER_NAME/devstudio/runtimes/jboss-eap/
    • 对于 Microsoft Windows: C:\Users\USER_NAME\devstudio\runtimes\jboss-eapC:\Documents 和 Settings\USER_NAME\devstudio\runtimes\jboss-eap\
注意

EAP_HOME 不是环境变量。JBOSS_HOME 是脚本中使用的环境变量。

第 2 章 监控性能

您可以使用任何工具来监控 JBoss EAP 性能,这些工具可以检查计算机上运行的 JVM。红帽建议您使用 JConsole,而 JBoss EAP 包含预配置的打包程序脚本或 Java VisualVM。这两个工具都提供 JVM 进程的基本监控,包括内存使用情况、线程利用率、加载的类和其他 JVM 指标。

如果您在运行 JBoss EAP 的同一计算机上本地运行其中一种工具,则无需配置。但是,如果您运行以下其中一种工具来监控远程计算机上运行的 JBoss EAP,则需要进行一些配置才能接受远程 JMX 连接

2.1. 为远程监控连接配置 JBoss EAP

用于单机服务器

  1. 确保您已创建了管理用户。您可能希望创建单独的管理用户来监控 JBoss EAP 服务器。详情请查看 JBoss EAP 配置指南
  2. 启动 JBoss EAP 时,将管理接口绑定到您要用于远程监控服务器的 IP 地址:

    $ EAP_HOME/bin/standalone.sh -bmanagement=IP_ADDRESS
    警告

    这将所有 JBoss EAP 管理接口(包括管理控制台和管理控制台 CLI)公开给指定的网络。确保您仅将管理接口绑定到专用网络。

  3. 在 JVM 监控工具中使用以下 URI 和您的管理用户名和密码来连接 JBoss EAP 服务器:以下 URI 使用默认管理端口(9990)

    service:jmx:remote+http://IP_ADDRESS:9990

对于受管域主机

利用上述在受管域主机上绑定管理接口的步骤,仅公开主机控制器 JVM 进行远程监控,而不公开该主机上运行的单个 JBoss EAP 服务器。

要将 JBoss EAP 配置为远程监控受管域主机上的个别服务器,请按照以下步骤操作:

  1. ApplicationRealm 中创建一个新用户,您将使用它连接 JBoss EAP 服务器以进行远程监控。详情请查看 JBoss EAP 配置指南
  2. 要将 远程 子系统配置为使用 Elytron,请执行以下命令:

    /profile=full/subsystem=jmx/remoting-connector=jmx:add(use-management-endpoint=false)
    /socket-binding-group=full-sockets/socket-binding=remoting:add(port=4447)
    /profile=full/subsystem=remoting/connector=remoting-connector:add(socket-binding=remoting,sasl-authentication-factory=application-sasl-authentication)
  3. 启动 JBoss EAP 受管域主机时,请将以下一个或多个接口绑定到您将用于监控的 IP 地址:

    • 如果要连接到在受管域主机上运行的单个 JBoss EAP 服务器 JVM,请绑定公共接口:

      $ EAP_HOME/bin/domain.sh -b=IP_ADDRESS
    • 如果要连接 JBoss EAP 主机控制器 JVM,还要绑定管理接口:

      $ EAP_HOME/bin/domain.sh -bmanagement=IP_ADDRESS
      警告

      这将所有 JBoss EAP 管理接口(包括管理控制台和管理控制台 CLI)公开给指定的网络。确保您仅将管理接口绑定到专用网络。

  4. 在 JVM 监控工具中使用以下详情:

    • 若要连接受管域主机上运行的单个 JBoss EAP 服务器 JVM,可将以下 URI 与之前创建的 ApplicationRealm 用户名和密码搭配使用:

      service:jmx:remote://IP_ADDRESS:4447

      要在单一主机上连接不同的 JBoss EAP 服务器,请将相应服务器的端口偏移值添加到上述端口号。

    • 若要连接 JBoss EAP 主机控制器 JVM,可使用以下 URI 和管理用户名和密码:

      service:jmx:remote://IP_ADDRESS:9990

2.2. JConsole

预配置的 JConsole 打包程序脚本与 JBoss EAP 捆绑在一起。使用此打包程序脚本可确保所有必需的库都添加到类路径中,同时还可在 JConsole 内提供对 JBoss EAP 管理 CLI 的访问。

2.2.1. 使用 JConsole 连接到本地 JBoss EAP JVM

连接到与 JConsole 在同一台机器上运行的 JBoss EAP JVM:

  1. EAP_HOME/bin 中运行 jconsole 脚本。
  2. 在本地进程下,选择要监控的 JBoss EAP JVM 进程。

    • 对于独立 JBoss EAP 服务器,有一个 JBoss EAP JVM 进程。

      图 2.1. JConsole Local Standalone JBoss EAP Server JVM

      JConsole 本地独立
    • JBoss EAP 受管域主机具有多个可以连接的 JVM 进程:主机控制器 JVM 进程、进程控制器 JVM 进程,以及主机上每一 JBoss EAP 服务器的 JVM 进程。您可以通过查看 JVM 参数来确定您已连接到的 JVM。

      图 2.2. JConsole Local Managed Domain JBoss EAP JVMs

      JConsole 本地域
  3. 连接

2.2.2. 使用 JConsole 连接到远程 JBoss EAP JVM

先决条件

  1. EAP_HOME/bin 中运行 jconsole 脚本。
  2. Remote Process 下,插入要监控的远程 JBoss EAP JVM 进程的 URI。

    请参阅有关为要使用的 URI 配置 JBoss EAP 远程监控连接的说明

    图 2.3. JConsole Remote JBoss EAP JVM

    JConsole 远程
  3. 确保您为监控连接提供了用户名和密码。
  4. 连接

2.3. Java VisualVM

Java VisualVM 包含在 Oracle JDK 中,位于 JAVA_HOME/bin/jvisualvm。如果不使用 Oracle JDK,也可从 VisualVM 网站下载 VisualVM。请注意,VisualVM 无法与 IBM JDK 一起使用。

以下小节提供了使用 VisualVM 连接到本地或远程 JBoss EAP JVM 的说明。有关使用 VisualVM 的其他信息,请参阅 VisualVM 文档

2.3.1. 使用 VisualVM 连接到本地 JBoss EAP JVM

连接到与 VisualVM 在同一台机器上运行的 JBoss EAP JVM:

  1. 打开 VisualVM,然后在 VisualVM 窗口左侧找到 Applications 窗格。
  2. Local 下,双击您要监控的 JBoss EAP JVM 进程。

    • 对于独立 JBoss EAP 服务器,有一个 JBoss EAP JVM 进程。

      图 2.4. VisualVM Local Standalone JBoss EAP Server JVM

      Visualvm 本地独立
    • JBoss EAP 受管域主机具有多个可以连接的 JVM 进程:主机控制器 JVM 进程、进程控制器 JVM 进程,以及主机上每一 JBoss EAP 服务器的 JVM 进程。您可以通过查看 JVM 参数来确定您已连接到的 JVM。

      图 2.5. VisualVM Local Managed Domain JBoss EAP JVMs

      visualvm 本地域

2.3.2. 使用 VisualVM 连接到远程 JBoss EAP JVM

先决条件

  1. 您必须将所需的 JBoss EAP 库添加到远程监控 JBoss EAP JVM 的类路径中。使用本地机器上所需库的参数启动 VisualVM。例如:

    $ visualvm -cp:a EAP_HOME/bin/client/jboss-cli-client.jar  -J-Dmodule.path=EAP_HOME/modules
  2. File 菜单中,选择 Add JMX Connection
  3. 完成远程 JBoss EAP JVM 的详细信息:

    图 2.6. VisualVM Remote JBoss EAP JVM

    visualvm remote
  4. 点击 OK
  5. 在 VisualVM 窗口左侧的 Applications 窗格中,双击远程主机下的 JMX 项,以打开监控连接。

第 3 章 诊断性能问题

3.1. 启用 Garbage Collection Logging

检查垃圾回收日志在尝试对 Java 性能问题进行故障排除时很有用,特别是与内存用量相关的问题。

除了用于写入日志文件的一些额外磁盘 I/O 活动外,启用垃圾回收记录不会影响服务器性能。

在 OpenJDK 或 Oracle JDK 上运行的独立 JBoss EAP 服务器,已默认启用垃圾回收日志记录。对于 JBoss EAP 受管域,可以为主机控制器、流程控制器或个别 JBoss EAP 服务器启用垃圾回收日志记录。

  1. 获取正确的 JVM 选项,以为您的 JDK 启用垃圾回收日志记录。将以下选项中的路径替换为您希望创建日志的位置。

    注意

    红帽客户门户具有一个 JVM Options 配置工具,可帮助您生成最佳 JVM 设置。

    • 对于 OpenJDK 或 Oracle JDK:

      -verbose:gc -Xloggc:/path/to/gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationStoppedTime
    • 对于 IBM JDK:

      -verbose:gc -Xverbosegclog:/path/to/gc.log
  2. 将垃圾回收 JVM 选项应用到您的 JBoss EAP 服务器。

    有关如何将 JVM 选项应用到受管域中的单机服务器或服务器的说明,请参阅 JBoss EAP 配置指南

3.2. Java Heap Dumps

Java 堆转储是某一时间点上创建的 JVM 堆的快照。创建和分析堆转储对于诊断和故障排除 Java 应用的问题非常有用。

根据您使用的 JDK,可以通过不同的方法来为 JBoss EAP 进程创建和分析 Java 堆转储。本节介绍 Oracle JDK、OpenJDK 和 IBM JDK 的常用方法。

3.2.1. 创建 Heap Dump

3.2.1.1. OpenJDK 和 Oracle JDK

创建 On-Demand Heap Dump

您可以使用 jcmd 命令为在 OpenJDK 或 Oracle JDK 上运行的 JBoss EAP 创建按需堆转储。

  1. 确定您要从中创建堆转储的 JVM 进程 ID。
  2. 使用以下命令创建堆转储:

    $ jcmd JAVA_PID GC.heap_dump -all=true FILENAME.hprof

    这会以 HPROF 格式创建一个堆转储文件,通常位于 EAP_HOME 或 EAP_HOME/bin 中。或者,您可以指定另一个目录的文件路径。

在 OutOfMemoryError 上创建一个 Heap Dump Automatically

您可以使用 -XX:+HeapDumpOnOutOfMemoryError JVM 选项在抛 出 OutOfMemoryError 异常时自动创建堆转储。

这会以 HPROF 格式创建一个堆转储文件,通常位于 EAP_HOME 或 EAP_HOME/bin 中。或者,您可以使用 -XX:HeapDumpPath=/path/ 为堆转储设置自定义路径。如果您使用 -XX:HeapDumpPath 指定文件名,例如 -XX:HeapDumpPath=/path/filename.hprof,堆转储会相互覆盖。

有关如何将 JVM 选项应用到受管域中的单机服务器或服务器的说明,请参阅 JBoss EAP 配置指南

3.2.1.2. IBM JDK

使用 IBM JDK 时,当抛 出 OutOfMemoryError 时会自动生成堆转储。

IBM JDK 的堆转储保存至 /tmp/ 目录中,作为可移植堆转储(PHD)格式文件保存在 /tmp/ 目录中。

3.2.2. 分析 Heap Dump

堆转储分析工具

有许多工具可以分析堆转储文件并帮助识别问题。红帽支持建议使用 Eclipse Memory Analyzer 工具(MAT),该工具可分析 HPROF 或 PHD 格式的堆转储。

有关使用 Eclipse MAT 的详情请参考 Eclipse MAT 文档

Hap Dump Analysis Tips

有时,堆性能问题的原因显而易见,但有时您可能需要了解应用的代码和导致 OutOfMemoryError 等问题的具体情况。这有助于识别问题是否为内存泄漏,或者堆是否足够大。

些识别内存用量问题的建议包括:

  • 如果发现单个对象消耗过多内存,请尝试类分组,以查看许多小对象消耗了大量内存。
  • 检查内存的最大使用量是否为线程。这是一个很好的指示点,即 OutOfMemoryError-triggered 堆转储比指定的 Xmx 最大堆大小小得多。
  • 使内存泄漏更易于检测的一种技巧是暂时使通常的最大堆大小加倍。发生 OutOfMemoryError 时,与内存泄漏相关的对象大小大约是堆大小的一半。

识别内存问题的来源后,您可以查看垃圾回收 root 的路径,以查看对象的活跃状态。

3.3. 通过 Java 线程识别高 CPU 利用率

注意

对于在红帽企业 Linux 或 Solaris 上使用 JBoss EAP 的客户,红帽客户门户上的 JVMPeg 实验室工具有助于收集和分析 Java 线程信息,以识别 CPU 利用率。按照使用 JVMPeg 实验工具的说明,而不使用以下步骤:

对于 OpenJDK 和 Oracle JDK 环境,可以使用 jstack 实用程序获取 Java 线程诊断信息。

  1. 确定占用 CPU 较高百分比的 Java 进程的进程 ID。

    它也可用于获取高利用率进程的每线程 CPU 数据。这可以通过在 Red Hat Enterprise Linux 系统上使用 top -H 命令来完成。

  2. 使用 jstack 实用程序创建 Java 进程的堆栈转储。例如,在 Linux 和 Solaris 中:

    jstack -l JAVA_PROCESS_ID > high-cpu-tdump.out

    您可能需要间隔创建多个转储,以查看一段时间内的任何变化或趋势。

  3. 分析堆栈转储。您可以使用线程 Dump Analyzer(TDA)等工具

第 4 章 JVM Tuning

为您的应用和 JBoss EAP 环境配置最佳 JVM 选项是调优性能的最基本方法之一。本章论述了配置一些常规 JVM 选项。

注意

可以使用红帽客户门户上的 JVM 选项工具轻松生成本章中列出的许多 JVM 选项

有关如何将 JVM 选项应用到受管域中的单机服务器或服务器的说明,请参阅 JBoss EAP 配置指南

4.1. 设置固定的 Heap Size

您必须设置适当的堆大小,以防止内存不足。

X ms 选项设置初始堆大小,-Xmx 设置最大堆大小。建议在生产环境中将初始和最大堆大小选项设置为相同的大小,以便固定并预分配堆大小。

例如,以下选项设置 2048 MB 堆大小:

-Xms2048M -Xmx2048M

建议您在开发环境中测试负载下的应用,以确定最大内存使用量。您的生产堆大小应至少比测试的最大值高 25%,以便为开销腾出空间。

4.2. 配置 Garbage Collector

虽然并行垃圾收集器(也称为吞吐量垃圾收集器)是 Java 8 中服务器级机器中的默认垃圾收集器,但红帽建议使用 G1 垃圾收集器,这应当是 Java 9 之后的默认垃圾收集器。在大多数情况下,G1 垃圾收集器的性能通常要优于 CMS 和并行垃圾收集器。

要启用 G1 收集器,请使用以下 JVM 选项:

-XX:+UseG1GC

垃圾收集器日志选项

垃圾回收日志记录默认为独立的 JBoss EAP 服务器启用。若要为 JBoss EAP 受管域启用垃圾回收日志,请参阅 第 3.1 节 “启用 Garbage Collection Logging”

4.3. 启用大页面

为 JBoss EAP JVM 启用大页面会导致内存锁定且无法像常规内存交换到磁盘的页面。

对内存密集型应用程序而言,使用大页面的优势在于堆无法分页或交换到磁盘,因此始终可以随时使用。

使用大页面的一个缺点是系统上的其他进程可能无法快速访问内存,这可能会导致这些进程过量分页。

与任何其他性能配置更改一样,建议您在测试环境中测试更改的影响。

  1. 您必须确保您的操作系统配置允许进程使用大页面。

  2. 启用或禁用大页面支持:

    • 要显式启用对 JBoss EAP JVM 的大页面支持,请使用以下 JVM 选项:

      -XX:+UseLargePages
    • 要明确禁用对 JBoss EAP JVM 的大页面支持,请使用以下 JVM 选项:

      -XX:-UseLargePages
  3. 在启动 JBoss EAP 时,请确保没有与保留内存相关的警告。

    • 在 Red Hat Enterprise Linux 中,可能会有如下错误:

      OpenJDK 64-Bit Server VM warning: Failed to reserve shared memory. (error = 1)
    • 在 Windows Server 中,错误可能类似如下:

      Java HotSpot(TM) 64-Bit Server VM warning: JVM cannot use large page memory because it does not have enough privilege to lock pages in memory.

    如果您看到警告,请验证您的操作系统配置和 JVM 选项是否已正确配置。

如需更多信息,请参阅甲骨文有关 Java 支持大页的文档

4.4. 启用聚合优化

使用积极优化(AggressiveOpts)JVM 选项可为您的环境提供性能改进。此选项支持在未来 Java 版本中预期成为默认 Java 性能优化功能的 Java 性能优化功能。

要启用 AggressiveOpts,请使用以下 JVM 选项:

-XX:+AggressiveOpts

4.5. 设置 ulimits

对于红帽企业 Linux 和 Solaris 平台,您必须为 JBoss EAP JVM 进程配置适当的 ulimit 值。可以临时超过"soft" ulimit,而"hard" ulimit 是资源使用的一个严格条件。适当的 ulimit 值因您的环境和应用而异。

重要

如果您使用的是 IBM JDK,请务必注意,IBM JDK 对 JVM 进程使用的最大打开文件数使用软限制。在红帽企业 Linux 上,对于使用 IBM JDK 的 JBoss EAP 进程而言,默认的软限制(1024)被视为太低。

如果应用到 JBoss EAP 进程的限值过低,您在启动 JBoss EAP 时会看到类似如下的警告:

WARN  [org.jboss.as.warn.fd-limit] (main) WFLYSRV0071: The operating system has limited the number of open files to 1024 for this process; a value of at least 4096 is recommended.

要查看您当前的 ulimit 值,请使用以下命令:

  • 对于软 ulimit 值:

    ulimit -Sa
  • 对于硬 ulimit 值:

    ulimit -Ha

要为打开文件的最大数量设置 ulimit,请使用以下命令并显示您要应用的数量:

  • 要为打开文件的最大数量设置软 ulimit

    ulimit -Sn 4096
  • 要为打开文件的最大数量设置硬 ulimit

    ulimit -Hn 4096
注意

为确保 ulimit 设置有效,建议在生产系统上将软限制和硬限制设置为相同的值。

有关使用配置文件设置 ulimit 值的更多信息,请参阅 如何在客户门户网站中设置 ulimit 值

4.6. 主机控制器和进程控制器 JVM 调优

JBoss EAP 受管域主机具有单独的 JVM 用于主机控制器和进程控制器。 如需有关主机控制器和流程控制器 角色的更多信息,请参阅 JBoss EAP 配置指南

您可以调优主机控制器和进程控制器 JVM 设置,但即使在大型受管域环境中,主机控制器和进程控制器的默认 JVM 配置也应足够。

主机控制器和进程控制器 JVM 的默认配置已测试了受管域大小多达 20 台 JBoss EAP 主机,每台运行 10 个 JBoss EAP 服务器,总域大小为 200 个 JBoss EAP 服务器。

如果您在大型受管域中遇到问题,您可能需要监控环境中的主机控制器或进程控制器 JVM,以确定堆大小等 JVM 选项的相应值。

第 5 章 EJB 子系统调整

JBoss EAP 可以缓存 Jakarta Enterprise Beans,以节省初始化时间。这通过使用 bean 池来完成。

JBoss EAP 中有两个不同的 bean 池:bean 实例池和 bean 线程池

适当的 bean 池大小取决于您的环境和应用程序。建议您测试不同的 bean 池大小,并在可模拟您预期实际状况的开发环境中执行压力测试。

5.1. Bean 实例池

Bean 实例池用于无状态会话 Bean(SLSB)和消息 Driven Beans(MDB)。默认情况下,SLSB 使用实例池 default-slsb-instance-pool,MDB 使用实例池 default-mdb-instance-pool

bean 实例池的大小限制了一次可以创建的特定 EJB 的实例数量。如果特定 EJB 的池已满,客户端将阻止并等待实例可用。如果客户端没有在池的 超时 属性中设置的时间内获取实例,则会引发异常。

bean 实例池的大小是使用 derived -size 或 max- pool-size 来配置的。您可以使用以下值之一 配置 池大小:

  • from-worker-pools,这表示池的最大大小源自系统上配置的所有工作程序池的总线程大小。
  • from-cpu-count,这表示最大池大小派生自系统上可用的处理器总数。请注意,这不一定是 1:1 映射,并且可能会由其它因素进行增强。

如果未定义 derived-size,则 max-pool-size 的值用于 bean 实例池的大小。

注意

derived -size 属性覆盖 max-pool-size 中指定的任何值。gene-size 必须未定义,才能使 max-pool-size 值生效。

您可以将 EJB 配置为使用特定的实例池。这样,可以更精细地控制可供各个 EJB 类型使用的实例。

5.1.1. 创建 Bean 实例池

本节介绍如何使用管理 CLI 创建新的 bean 实例池。您也可以使用管理控制台从 Configuration 选项卡导航到 EJB 子系统,然后选择 Bean Pool 选项卡,来配置 bean 实例池。

要创建新实例池,请使用以下命令之一:

  • 创建带有派生最大池大小的 bean 实例池:

    /subsystem=ejb3/strict-max-bean-instance-pool=POOL_NAME:add(derive-size=DERIVE_OPTION,timeout-unit=TIMEOUT_UNIT,timeout=TIMEOUT_VALUE)

    以下示例创建一个名为 my_derived_pool 的 bean 实例池,其最大大小从 CPU 数派生,超时为 2 分钟:

    /subsystem=ejb3/strict-max-bean-instance-pool=my_derived_pool:add(derive-size=from-cpu-count,timeout-unit=MINUTES,timeout=2)
  • 创建具有显式最大池大小的 bean 实例池:

    /subsystem=ejb3/strict-max-bean-instance-pool=POOL_NAME:add(max-pool-size=POOL_SIZE,timeout-unit=TIMEOUT_UNIT,timeout=TIMEOUT_VALUE)

    以下示例创建一个名为 my_pool 的 bean 实例池,其超时时间最多为 30 秒:

    /subsystem=ejb3/strict-max-bean-instance-pool=my_pool:add(max-pool-size=30,timeout-unit=SECONDS,timeout=30)

5.1.2. 指定实例池应该使用

您可以通过使用 @org.jboss.ejb3.annotation.Pool 注释,或通过修改 Bean 的 jboss-ejb3. xml 部署描述符来设置特定 bean 将要使用的特定实例池。如需更多信息,请参阅 开发 EJB 应用中的 jboss-ejb3.xml 部署描述符参考

5.1.3. 禁用默认的 Bean 实例池

可以禁用默认的 bean 实例池,这导致 EJB 默认不使用任何实例池。相反,当线程需要在 EJB 上调用方法时,会创建新的 EJB 实例。如果您不想对创建的 EJB 实例数量有任何限制,这可能很有用。

要禁用默认的 bean 实例池,请使用以下管理 CLI 命令:

/subsystem=ejb3:undefine-attribute(name=default-slsb-instance-pool)
注意

如果 bean 配置为使用特定的 bean 实例池,禁用 default 实例池不会影响 bean 使用的池。

5.2. bean 线程池

默认情况下,名为 default 的 bean 线程池用于异步 EJB 调用和 EJB 计时器。

注意

从 JBoss EAP 7 起,默认情况下,远程 EJB 请求在 io 子系统中定义的工作程序中处理。

如果需要,您可以将这些 EJB 服务各自配置为使用不同的 Bean 线程池。如果您想更精细地控制每个服务对 bean 线程池的访问,这非常有用。

在确定合适的线程池大小时,请考虑您预期的并发请求数。

5.2.1. 创建 Bean 线程池

本节介绍如何使用管理 CLI 创建新的 bean 线程池。您还可以通过从 Configuration 选项卡导航到 EJB 子系统并选择左侧菜单中的 ContainerThread Pool,使用管理控制台配置 bean 线程池。

要创建新的线程池,请使用以下命令:

/subsystem=ejb3/thread-pool=POOL_NAME:add(max-threads=MAX_THREADS)

以下示例创建一个名为 my_thread_pool 的 bean 线程池,最多有 30 个线程:

/subsystem=ejb3/thread-pool=my_thread_pool:add(max-threads=30)

5.2.2. 配置 EJB 服务以使用特定的 Bean 线程池

EJB3 异步调用服务和定时器服务可以分别配置为使用特定的 Bean 线程池。默认情况下,这两个服务都 使用默认的 bean 线程池。

本节介绍如何使用管理 CLI 配置上述 EJB 服务以使用特定的 Bean 线程池。您还可以从 Configuration 选项卡中导航到 EJB 子系统,选择服务选项卡并选择适当的服务,从而使用管理控制台配置这些服务。

要将 EJB 服务配置为使用特定 Bean 线程池,请使用以下命令:

/subsystem=ejb3/service=SERVICE_NAME:write-attribute(name=thread-pool-name,value=THREAD_POOL_NAME)

SERVICE_NAME 替换为您要配置的 EJB 服务:

  • 用于 EJB3 异步调用服务的 async
  • EJB3 计时 器服务的定时器服务

以下示例将 EJB3 async 服务设置为使用名为 my_thread_pool 的 bean 线程池

/subsystem=ejb3/service=async:write-attribute(name=thread-pool-name,value=my_thread_pool)

5.3. 指示 EJB 子系统调优 Might 满足以下条件的例外

  • Stateless EJB 实例池太大,或者超时太低

    javax.ejb.EJBException: JBAS014516: Failed to acquire a permit within 20 SECONDS
         at org.jboss.as.ejb3.pool.strictmax.StrictMaxPool.get(StrictMaxPool.java:109)

    请参阅 Bean 实例池

  • EJB 线程池的容量不够大,或者 EJB 处理所需的时间比调用超时长

    java.util.concurrent.TimeoutException: No invocation response received in 300000 milliseconds

    请参阅 Bean 线程池

第 6 章 数据源和资源适配器调优

连接池是 JBoss EAP 用来优化使用数据源(如关系数据库或资源适配器)的环境的性能的主要工具。

分配并分配资源用于数据源和资源适配器连接的资源在时间和系统资源方面非常昂贵。连接池通过创建可供应用使用的连接池来降低连接成本。

在配置连接池以获得最佳性能前,您必须监控负载下的数据源池统计信息 或资源适配器统计信息,以确定适合您的环境。

6.1. 监控池统计信息

6.1.1. Datasource Statistics

为数据源启用统计集合后 ,您可以查看数据源的运行时统计信息

6.1.1.1. 启用数据源统计信息

默认情况下不启用数据源统计您可以使用管理 CLI 或管理控制台启用数据源统计信息收集

使用管理 CLI 启用数据源统计信息

以下管理 CLI 命令启用 ExampleDS 数据源的统计信息收集:

注意

在受管域中,在此命令前加上 /profile=PROFILE_NAME

/subsystem=datasources/data-source=ExampleDS:write-attribute(name=statistics-enabled,value=true)

重新加载服务器以使更改生效。

使用管理控制台启用数据源统计信息

使用以下步骤,通过管理控制台为数据源启用统计信息收集。

  1. 导航到 ConfigurationSubsystemsDatasources & DriversDatasources
  2. 选择数据源并点击 View
  3. 单击属性选项卡下的 编辑
  4. Statistics Enabled 字段设置为 ON,再单击 Save。此时会出现一个弹出窗口,表示更改需要重新加载才能生效。
  5. 重新加载服务器:

    • 对于单机服务器,请单击弹出窗口中的重新加载链接,以重新加载服务器。
    • 对于受管域,单击弹出窗口中的 Topology 链接。从 Topology 选项卡中,选择相应的服务器,再选择重新加载服务器的重新加载选项

6.1.1.2. 查看数据源统计信息

您可以使用管理 CLI 或管理控制台查看数据源的运行时统计信息

使用管理 CLI 查看数据源统计信息

以下管理 CLI 命令检索 ExampleDS 数据源的核心 统计信息:

注意

在受管域中,在这些命令前加上 /host=HOST_NAME/server=SERVER_NAME

/subsystem=datasources/data-source=ExampleDS/statistics=pool:read-resource(include-runtime=true)
{
    "outcome" => "success",
    "result" => {
        "ActiveCount" => 1,
        "AvailableCount" => 20,
        "AverageBlockingTime" => 0L,
        "AverageCreationTime" => 122L,
        "AverageGetTime" => 128L,
        "AveragePoolTime" => 0L,
        "AverageUsageTime" => 0L,
        "BlockingFailureCount" => 0,
        "CreatedCount" => 1,
        "DestroyedCount" => 0,
        "IdleCount" => 1,
        ...
}

以下管理 CLI 命令检索 ExampleDS 数据源的 JDBC 统计数据:

/subsystem=datasources/data-source=ExampleDS/statistics=jdbc:read-resource(include-runtime=true)
{
    "outcome" => "success",
    "result" => {
        "PreparedStatementCacheAccessCount" => 0L,
        "PreparedStatementCacheAddCount" => 0L,
        "PreparedStatementCacheCurrentSize" => 0,
        "PreparedStatementCacheDeleteCount" => 0L,
        "PreparedStatementCacheHitCount" => 0L,
        "PreparedStatementCacheMissCount" => 0L,
        "statistics-enabled" => true
    }
}
注意

由于统计信息是运行时信息,因此务必指定 include-runtime=true 参数。

如需了解所有可用统计数据的详细列表,请参阅数据源统计信息

使用管理控制台查看数据源统计信息

若要从管理控制台查看数据源统计信息,可从 Runtime 选项卡中导航到 Datasources 子系统,选择数据源,再单击 View

如需了解所有可用统计数据的详细列表,请参阅数据源统计信息

6.1.2. 资源适配器统计信息

您可以查看已部署的资源适配器的核心运行时统计信息。有关所有可用统计数据的详细列表,请参阅资源适配器统计信息附录

启用资源适配器统计信息

默认情况下不启用资源适配器统计。以下管理 CLI 命令为简单资源适配器 myRA.rar 启用统计集合,该适配器为 JNDI 绑定为 java:/eis/AcmeConnectionFactory

注意

在受管域中,在命令前加上 /host=HOST_NAME/server=SERVER_NAME/

/deployment=myRA.rar/subsystem=resource-adapters/statistics=statistics/connection-definitions=java\:\/eis\/AcmeConnectionFactory:write-attribute(name=statistics-enabled,value=true)
查看资源适配器统计信息

资源适配器统计数据可以从管理 CLI 检索。以下管理 CLI 命令返回资源适配器 myRA.rar 的统计数据,其连接工厂在 JNDI 中绑定为 java:/eis/AcmeConnectionFactory

注意

在受管域中,在命令前加上 /host=HOST_NAME/server=SERVER_NAME/

deployment=myRA.rar/subsystem=resource-adapters/statistics=statistics/connection-definitions=java\:\/eis\/AcmeConnectionFactory:read-resource(include-runtime=true)
{
    "outcome" => "success",
    "result" => {
        "ActiveCount" => "1",
        "AvailableCount" => "20",
        "AverageBlockingTime" => "0",
        "AverageCreationTime" => "0",
        "CreatedCount" => "1",
        "DestroyedCount" => "0",
        "InUseCount" => "0",
        "MaxCreationTime" => "0",
        "MaxUsedCount" => "1",
        "MaxWaitCount" => "0",
        "MaxWaitTime" => "0",
        "TimedOut" => "0",
        "TotalBlockingTime" => "0",
        "TotalCreationTime" => "0"
    }
}
注意

由于统计信息是运行时信息,因此务必指定 include-runtime=true 参数。

6.2. 池属性

本节详细介绍了可为优化数据源或资源适配器性能配置的所选池属性的建议。有关如何配置这些属性的说明,请参阅:

  • 配置数据源池属性
  • 配置资源适配器池属性

    最小池大小

    min-pool-size 属性定义连接池的最小大小。默认最小连接为零连接。如果为零 min-pool-size,则在第一次事务发生时创建连接并放入池中。

    如果 min-pool-size 太小,则在执行初始数据库命令时会导致延迟增加,因为可能需要建立新的连接。如果 min-pool-size 太大,则会导致到数据源或资源适配器的连接浪费。

    在不活动期间,连接池将缩小,可能会缩小到 min-pool-size 值。

    红帽建议您将 min-pool-size 设置为允许理想按需吞吐量的连接数量。

    最大池大小

    max-pool-size 属性定义连接池的最大大小。这是一个重要的性能参数,因为它限制了活动连接的数量,因此也限制了并发活动的数量。

    如果 max-pool-size 太小,可能会导致请求被不必要的阻止。如果 max-pool-size 太大,则可能会导致 JBoss EAP 环境、数据源或资源适配器使用超出其处理的资源。

    红帽建议您将 max-pool-size 设置为至少 15% 大于负载 监控性能 后观察到的 MaxUsedCount。这样,一些缓冲区可满足高于预期条件。

    预填充

    pool-prefill 属性指定 JBoss EAP 是否在 JBoss EAP 启动时预先填充连接池,其连接数量最少。默认值为 false

    pool-prefill 设为 true 时,JBoss EAP 会在启动时使用更多资源,但初始事务的延迟会较小。

    如果您优化了 min -pool-size,红帽建议将 pool- prefill 设置为 true

    严格的最小值

    pool-use-strict-min 属性指定 JBoss EAP 是否允许池中的连接数低于指定的最小值。

    如果 pool-use-strict-min 设为 true,则 JBoss EAP 不允许连接数量暂时低于指定的最小值。默认值为 false

    尽管指定了最少的池连接数,但当 JBoss EAP 关闭连接时,例如如果连接处于空闲状态并且已达到超时时间,则结束可能会导致连接总数暂时低于创建新连接并添加到池中前的最低连接。

    超时

    连接池可以配置多个超时选项,但性能调优的一个重要选项为 空闲时间 超时。

    idle-timeout-minutes 属性指定连接在关闭前的最空闲时间(以分钟为单位)。随着空闲连接关闭,池中的连接数量将向下减少到指定的最小值。

    超时时间越长,使用的资源越多,但请求可能会更快。超时越少,使用的资源越少,但可能需要等待创建新连接。

6.3. 配置池属性

6.3.1. 配置数据源池属性

先决条件

您可以使用管理 CLI 或管理控制台配置数据源池属性:

  • 要使用管理控制台,请导航到 ConfigurationSubsystemsDatasources & DriversDatasources,选择数据源并点 View池选项可在数据源池选项卡下进行配置。超时选项可在 datasource Timeouts 选项卡下进行配置。
  • 要使用管理 CLI,请执行以下命令:

    /subsystem=datasources/data-source=DATASOURCE_NAME/:write-attribute(name=ATTRIBUTE_NAME,value=ATTRIBUTE_VALUE)

    例如,要将 ExampleDS 数据源 min-pool-size 属性设置为 5 连接,请使用以下命令:

    /subsystem=datasources/data-source=ExampleDS/:write-attribute(name=min-pool-size,value=5)

6.3.2. 配置资源适配器池属性

先决条件

您可以使用管理 CLI 或管理控制台配置资源适配器池属性:

  • 要使用管理控制台,请导航到 ConfigurationSubsystemsResource Adapters,选择您的资源适配器,点 View,然后在左侧菜单中选择 Connection Definitions池选项可在池选项卡下进行配置。超时选项可在 Attributes 选项卡下配置。
  • 要使用管理 CLI,请执行以下命令:

    /subsystem=resource-adapters/resource-adapter=RESOURCE_ADAPTER_NAME/connection-definitions=CONNECTION_DEFINITION_NAME:write-attribute(name=ATTRIBUTE_NAME,value=ATTRIBUTE_VALUE)

    例如,要将 my_RA 资源适配器 my_CD 连接定义 min-pool-size 属性设置为 5 连接,请使用以下命令:

    /subsystem=resource-adapters/resource-adapter=my_RA/connection-definitions=my_CD:write-attribute(name=min-pool-size,value=5)

第 7 章 消息传递子系统调整

JBoss EAP 配置消息传递指南 中的 性能调优 部分介绍了 messaging-activemq 子系统的性能调优建议。

第 8 章 日志记录子系统调整

您可以通过禁用登录控制台、配置适当的日志记录级别 并指定存储日志文件的最佳位置,进一步提升生产环境中的 JBoss EAP 日志记录子系统性能。

有关配置 日志记录子系统的更多信息,请参阅 JBoss EAP 配置指南 中的 日志记录章节

8.1. 禁用日志记录到控制台

禁用控制台日志记录可以提高 JBoss EAP 性能。虽然将日志输出到控制台在开发和测试环境中很有用,但在生产环境中,大部分情况下不需要这样做。JBoss EAP 根日志记录器包括用于除 standalone- full-ha 之外的所有默认单机服务器配置文件的控制台日志处理程序。默认受管域配置文件不包含控制台处理程序。

若要从根日志记录器移除默认的控制台处理程序,可使用以下管理 CLI 命令:

/subsystem=logging/root-logger=ROOT:remove-handler(name=CONSOLE)

8.2. 配置日志级别

为获得理想的性能,您必须为生产环境正确配置日志级别。例如,尽管 INFODEBUG 级别可能适合用于开发或测试环境,但在大多数情况下,您应将生产环境日志记录级别设置为更高的级别,如 WARNERROR

有关为不同日志记录处理程序设置日志级别的详细信息,请参阅 JBoss EAP 配置指南中的配置日志处理程序

8.3. 配置日志文件的位置

您应该将日志文件的存储位置视为潜在的性能问题。如果您将日志保存到 I/O 吞吐量不佳的文件系统或磁盘配置中,则可能会影响整个平台的性能。

为防止日志记录影响 JBoss EAP 性能,建议您将日志位置设置为具有大量空间的高性能专用磁盘。

有关为不同日志记录处理程序配置日志文件位置的详情,请参阅 JBoss EAP 配置指南中的配置日志处理程序

第 9 章 Undertow 子系统调优

与 JBoss EAP 6 中的上一 Web 子系统相比,JBoss EAP 7 中引入的非阻塞 I/O undertow 子系统性能显著提高。根据您的环境调优 undertow 子系统的机会包括配置 缓冲区缓存JSP 设置监听器

9.1. 缓冲区缓存

缓冲区缓存用于缓存 undertow 子系统所处理的静态文件。这包括映像、静态 HTML、CSS 和 JavaScript 文件。您可以为每个 Undertow servlet 容器指定默认的缓冲区缓存。为 servlet 容器设置优化的缓冲区缓存可提高提供静态文件的 Undertow 性能。

缓冲区缓存中的缓冲区在区域中分配,且大小固定。每个缓冲区缓存有三个可配置的属性:

buffer-size
单个缓冲区的大小,以字节为单位。默认值为 1024 字节。红帽建议您将缓冲区大小设置为完全存储最大的静态文件。
buffers-per-region
每个区域的缓冲区数量。默认值为 1024。
Max-regions
区域的最大数量,设置分配给缓冲区缓存的最大内存量。默认值为 10 个区域。

您可以通过乘以缓冲区大小、每个区域的缓冲区数以及区域的最大数量来计算缓冲区缓存使用的最大内存量。例如,默认的缓冲区缓存为 1024 字节 * 1024 缓冲区,每个地区 * 10 区域 = 10MB。

根据静态文件的大小以及开发环境中测试预期负载的结果来配置缓冲区缓存。在确定对性能的影响时,请考虑缓冲区缓存性能与所使用的内存的平衡。

有关使用管理 CLI 配置缓冲区缓存的说明,请参阅 JBoss EAP 配置指南中的配置缓冲区缓存

9.2. 配置缓冲池

Undertow 字节缓冲区池用于分配池 NIO Buffer 实例。所有监听器都有一个字节缓冲区池,您可以为每个监听器使用不同的缓冲区池和工作程序。字节缓冲区池可以在不同的服务器实例之间共享。

有关可用于配置字节缓冲区池属性的完整列表,请参阅 JBoss EAP 配置指南中的 Byte Buffer Pool Attributes

严重影响性能的主要字节缓冲区池属性是 buffer-size。默认值基于系统的 RAM 资源计算,并且在大多数情况下已足够。如果您手动配置此属性,大多数服务器的理想大小为 16KB。

有关如何创建和配置字节缓冲区池的说明,请参阅 JBoss EAP 配置指南

9.3. JSP 配置

Undertow servlet 容器的 JSP 配置选项为 JSP 页面编译到 Java 字节码提供优化。

generate-strings-as-char-arrays
如果您的 JSP 包含大量 String 常量,启用此选项可通过将 String 常量转换为 char 数组来优化漏洞。
optimize-scriptlets
如果您的 JSP 包含多个 String 串联,启用此选项可通过删除每个 JSP 请求 的字符串 串联来优化漏洞。
trim-spaces
如果您的 JSP 包含大量空格,启用此选项会修剪来自 HTTP 请求的空格并减少 HTTP 请求有效负载。

配置 JSP 选项

您可以使用管理控制台或管理 CLI 启用这些 Undertow JSP 配置选项。

  • 使用管理控制台启用它们:

    1. 导航到 ConfigurationSubsystemsWeb(Undertow)Servlet Container
    2. 选择您要配置的 servlet 容器,然后单击 View
    3. 选择JSP 并单击编辑
    4. 对于您要启用的每个选项,将字段设置为 ON,然后单击 Save
  • 要使用管理 CLI 启用它们,请使用以下命令:

    /subsystem=undertow/servlet-container=SERVLET_CONTAINER/setting=jsp/:write-attribute(name=OPTION_NAME,value=true)

    例如,要为 默认 servlet 容器启用 generate-strings-as-char-arrays,请使用以下命令:

    /subsystem=undertow/servlet-container=default/setting=jsp/:write-attribute(name=generate-strings-as-char-arrays,value=true)

9.4. 监听程序

根据您的应用和环境,您可以配置特定于特定类型流量的多个侦听器,例如:特定端口的流量,然后为每个监听器配置选项。

以下是可以在 HTTP、HTTPS 和 AJP 侦听器上配置的与性能相关的选项。

max-connections

侦听器可以处理的并发连接的最大数量。默认情况下,此属性未定义,这会导致连接无限制。

您可以使用这个选项设置监听器可以处理的连接数,这对于上限资源使用量可能很有用。在配置此值时,您应该考虑您的工作负载和流量类型。另请参见下面的 no-request-timeout

no-request-timeout

连接在关闭前闲置的时间长度,以毫秒为单位。默认值为 60000 毫秒(1 分钟)。

在您的环境中调整此选项以提高连接效率有助于提高网络性能。如果空闲连接永久关闭,则重新建立连接时会有开销。如果空闲连接打开太长时间,则不必要地使用资源。

max-header-size

HTTP 请求标头的最大大小,以字节为单位。默认值为 1048576(1024KB)。

限制标头大小有助于防止特定类型的拒绝服务攻击。

buffer-pool

指定用于监听器的 the io 子系统中的缓冲区池。默认情况下,所有侦听器都 使用默认的 缓冲区池。

您可以使用这个选项将每个监听程序配置为使用唯一的缓冲区池,或者让多个监听器使用相同的缓冲区池。

worker

undertow 子系统依赖于 io 子系统来提供 XNIO 工作程序。这个选项指定监听程序使用的 XNIO 工作程序。默认情况下,侦听器使用 the io 子系统 中的默认 工作程序。

将每个监听程序配置为使用特定的 worker 可能会很有用,以便您可以将不同的工作程序资源分配给特定类型的网络流量。

配置 Listener 选项

您可以使用管理控制台或管理 CLI 配置侦听器选项。

  • 使用管理控制台配置它们:

    1. 导航到 ConfigurationSubsystemsWeb(Undertow)Server
    2. 选择您要配置的服务器,然后单击 View
    3. 在左侧菜单中,选择 Listener,然后选择要配置的监听器类型,如 HTTP Listener,然后在表中选择侦听器。
    4. Edit,修改您要配置的选项,然后点 Save
  • 要使用管理 CLI 配置它们,请使用以下命令:

    /subsystem=undertow/server=SERVER_NAME/LISTENER_TYPE=LISTENER_NAME:write-attribute(name=OPTION_NAME,value=OPTION_VALUE)

    例如,要将 default - server Undertow 服务器中的默认 HTTP 侦听器的 max- connections 设置为 100000,请使用以下命令:

    /subsystem=undertow/server=default-server/http-listener=default:write-attribute(name=max-connections,value=100000)

第 10 章 IO 子系统调整

The io 子系统定义供其他 JBoss EAP 子系统使用的 XNIO 工作程序和缓冲区池,如 Undertow 和远程。

10.1. 配置工作程序

您可以创建多个单独的工作程序,每个工作程序都有各自的性能配置,并且可以处理不同的 I/O 任务。例如,您可以创建一个 worker 来处理 HTTP I/O,另一个工作程序用于处理 EJB I/O,然后根据特定的负载要求单独配置每个 worker 的属性。

有关可配置 worker 属性列表,请参阅 IO 子系统属性附录

严重影响性能的 worker 属性包括 io-threads,用于设置 worker 可以使用的 I/O 线程总数,以及设置特定任务可以使用的最多线程数量的 task-max-threads。这两个属性的默认值根据服务器的 CPU 数计算。

有关如何创建和配置工作程序的说明,请参阅 JBoss EAP 配置指南

10.1.1. 监控工作程序统计信息

您可以使用管理 CLI 查看 worker 的运行时统计信息。这会公开 worker 统计信息,如连接数、线程数和队列大小。

以下命令显示 默认 worker 的运行时统计信息:

/subsystem=io/worker=default:read-resource(include-runtime=true,recursive=true)
注意

按照 core-pool-size 统计数据跟踪的核心线程数量目前始终设置为与最大线程数相同的值,该值由 max-pool-size 统计数据进行跟踪。

10.2. 配置缓冲池

注意

IO 缓冲池已弃用,但它们仍设置为当前版本中的默认设置。有关配置 Undertow 字节缓冲区池的更多信息,请参阅 JBoss EAP 配置指南中的配置缓冲区池 章节

io 子系统中的缓冲区池是池式 NIO 缓冲区实例,专门用于 I/O 操作。与 worker 一样,您可以创建可用于处理特定 I/O 任务的独立缓冲区池。

有关可配置缓冲区池属性列表,请参阅 IO 子系统属性附录

严重影响性能的主要缓冲区池属性是 buffer-size。默认值基于系统的 RAM 资源计算,并且在大多数情况下已足够。如果您手动配置此属性,大多数服务器的理想大小为 16KB。

有关如何创建和配置缓冲区池的说明,请参阅 JBoss EAP 配置指南

第 11 章 JGroups Subsystem Tuning

为获得最佳网络性能,建议您在支持该网络的环境中将 UDP 多播用于 JGroups。

注意

TCP 的开销更大,通常被视为比 UDP 慢,因为它处理错误检查、数据包排序和拥塞控制本身。JGroups 为 UDP 处理这些功能,而 TCP 则保证其自身。在不可靠或高拥塞网络上使用 JGroups 时,或者多播不可用时,TCP 是一种不错的选择。

本章假定您已选择了 JGroups 堆栈传输协议(UDP 或 TCP)以及 JGroups 通信将使用的通信协议。有关与 JGroups 进行集群通信的更多信息,请参阅 JBoss EAP 配置指南

11.1. 监控 JGroups 统计数据

您可以启用 jgroups 子系统的统计信息,以使用管理 CLI 或 JMX 监控 JBoss EAP 集群。

注意

启用统计数据对性能造成负面影响.仅在需要时启用统计信息。

  1. 使用以下命令启用 JGroups 通道的统计信息。

    注意

    在受管域中,先用 /profile=PROFILE_NAME 在这些命令之前。

    /subsystem=jgroups/channel=CHANNEL_NAME:write-attribute(name=statistics-enabled,value=true)

    例如,使用以下命令为 default ee 频道启用统计信息:

    /subsystem=jgroups/channel=ee:write-attribute(name=statistics-enabled,value=true)
  2. 重新加载 JBoss EAP 服务器。

    reload
  3. 现在,您可以使用管理 CLI 或带有 JVM 监控工具的 JMX 来查看 JGroups 统计信息:

    • 要使用管理 CLI,请在您要查看统计信息的 JGroups 频道或协议上使用 :read-resource(include-runtime=true) 命令。

      注意

      在受管域中,在这些命令前加上 /host=HOST_NAME/server=SERVER_NAME

      例如:

      • 要查看 ee 频道的统计信息,请使用以下命令:

        /subsystem=jgroups/channel=ee:read-resource(include-runtime=true)
      • 要在 ee 频道中查看 FD_ALL 协议的统计信息,请使用以下命令:

        /subsystem=jgroups/channel=ee/protocol=FD_ALL:read-resource(include-runtime=true)
    • 要使用 JVM 监控工具连接 JBoss EAP,请参阅监控性能一章。您可以通过 JMX 连接查看 JGroups MBeans 的统计信息。

11.2. 网络和巨型帧

建议 JGroups 流量的网络接口成为专用虚拟局域网(VLAN)的一部分。这样,您可以将集群通信与其他 JBoss EAP 网络流量分隔开,以更加轻松地控制集群网络性能、吞吐量和安全性。

若要提高集群性能,需要考虑的另一个网络配置是启用巨型帧。如果您的网络环境支持,通过增加最大传输单元(MTU)来启用巨型帧有助于提高网络性能,特别是在高吞吐量环境中。

要使用巨型帧,网络中的所有 NIC 和交换机都必须支持它。有关为 Red Hat Enterprise Linux 启用巨型帧的说明,请参阅红帽客户门户网站。

11.3. 消息绑定

JGroups 中的消息捆绑通过将多个小消息捆绑到更大的捆绑包中来提高网络性能。相反,消息会排队,直到达到最大捆绑包大小或没有要发送的消息为止,而不是通过网络发送很多小消息。已排队的消息组合成一个更大的消息捆绑包,然后发送。

这种绑定降低了通信开销,特别是在网络通信开销较高的 TCP 环境中。

配置消息捆绑

JGroups 消息捆绑通过 max_bundle_size 属性进行配置。默认的 max_bundle_size 是 64KB。

调整捆绑包大小的性能改进取决于您的环境,以及是否与捆绑包组装时通信的延迟保持平衡。

使用以下管理 CLI 命令配置 max_bundle_size

/subsystem=jgroups/stack=STACK_NAME/transport=TRANSPORT_TYPE/property=max_bundle_size:add(value=BUNDLE_SIZE)

例如,将 default udp 堆栈的 max_bundle_size 设置为 60K

/subsystem=jgroups/stack=udp/transport=UDP/property=max_bundle_size:add(value=60K)

11.4. JGroups 线程池

jgroups 子系统使用自己的线程池来处理集群通信。JGroups 包含用于 默认内部oob定时器功能的 线程池,您可以单独进行配置。每个 JGroups 线程池都包含 keepalive-timemax-threadsmin-threadsqueue-length 的可配置属性。

每个线程池属性的适当值取决于您的环境,但在大多数情况下,默认值应足够。

有关如何配置 JGroups 线程池的说明,请参阅 JBoss EAP 配置指南

11.5. JGroups 发送和接收缓冲区

jgroups 子系统具有适用于 UDP 和 TCP 堆栈的可配置发送和接收缓冲区。

JGroups 缓冲区的适当值取决于您的环境,但在大多数情况下,默认值应足够。建议您在开发环境中测试负载下的集群,以便为缓冲区大小调整适当的值。

注意

您的操作系统可能会限制可用的缓冲区大小,并且 JBoss EAP 可能无法使用其配置的缓冲区值。请参阅 JBoss EAP 配置指南中的解决缓冲区大小警告

有关如何配置 JGroups 发送和接收缓冲区的说明,请参阅 JBoss EAP 配置指南

第 12 章 事务子系统调整

如果您的环境使用 XA 分布式事务,您可以调优事务管理器的日志存储以提高性能。

默认事务日志存储使用简单的文件存储。对于 XA 事务,此类日志存储可能效率较低,因为它为每个事务日志创建一个系统文件。尤其是对于 XA 事务,日志存储的效率要高得多,因为它使用由一个文件组成的日志来处理所有事务。

为了获得更好的 XA 事务性能,建议您使用日志日志存储。对于红帽企业 Linux 系统,您还可以在日志存储上启用异步 I/O(AIO),以进一步提高性能。

注意

对于 Red Hat Enterprise Linux 系统,如果您要在日志存储上启用异步 I/O(AIO),请确保安装了 libaio 软件包。

使用管理控制台启用 Journal 日志存储

  1. 导航到 ConfigurationSubsystemsTransaction → 并点 View
  2. Configuration 选项卡中,单击 Edit
  3. Use Journal Store 字段设置为 ON
  4. 可选 : 对于 Red Hat Enterprise Linux 系统,将 Journal Store Enable Async IO 字段设置为 ON
  5. Save

使用管理 CLI 启用 Journal 日志存储

  1. 要使用管理 CLI 启用日志存储,请使用以下命令:

    /subsystem=transactions:write-attribute(name=use-journal-store,value=true)
  2. 可选 : 对于 Red Hat Enterprise Linux 系统,使用以下命令启用日志存储异步 I/O:

    /subsystem=transactions:write-attribute(name=journal-store-enable-async-io, value=true)

附录 A. 参考资料

A.1. Datasource Statistics

表 A.1. Core Pool Statistics

名称描述

ActiveCount

活跃连接的数量。每个连接都可供应用使用,或者在池中可用。

AvailableCount

池中可用连接的数量。

AverageBlockingTime

阻止在池中获取专用锁定的平均时间。这个值以毫秒为单位。

AverageCreationTime

创建连接所需的平均时间。这个值以毫秒为单位。

AverageGetTime

获取连接所需的平均时间。这个值以毫秒为单位。

AveragePoolTime

池中连接的平均时间。这个值以毫秒为单位。

AverageUsageTime

使用连接的平均时间。这个值以毫秒为单位。

BlockingFailureCount

试图获得连接的失败数量。

CreatedCount

创建的连接数。

DestroyedCount

销毁的连接数量。

IdleCount

当前空闲的连接数。

InUseCount

当前使用的连接数。

MaxCreationTime

创建连接所花费的最长时间。这个值以毫秒为单位。

MaxGetTime

获取连接的最长时间。这个值以毫秒为单位。

MaxPoolTime

池中连接的最长时间。这个值以毫秒为单位。

MaxUsageTime

使用连接的最长时间。这个值以毫秒为单位。

MaxUsedCount

使用的最大连接数。

MaxWaitCount

同时等待连接的最大请求数。

MaxWaitTime

等待池中专用锁定的最长时间。这个值以毫秒为单位。

timedOut

连接超时的数量。

TotalBlockingTime

在池中等待专用锁定的总时间。这个值以毫秒为单位。

TotalCreationTime

创建连接所花费的总时间。这个值以毫秒为单位。

TotalGetTime

获取连接所花费的总时间。这个值以毫秒为单位。

TotalPoolTime

池中连接花费的总时间。这个值以毫秒为单位。

TotalUsageTime

使用连接所用的总时间。这个值以毫秒为单位。

WaitCount

必须等待的请求数以获取连接。

XACommitAverageTime

XAResource 提交调用的平均时间。这个值以毫秒为单位。

XACommitCount

XAResource 提交调用的数量。

XACommitMaxTime

XAResource 提交调用的最长时间。这个值以毫秒为单位。

XACommitTotalTime

所有 XAResource 提交调用的总时间。这个值以毫秒为单位。

XAEndAverageTime

XAResource 结束调用的平均时间。这个值以毫秒为单位。

XAEndCount

XAResource 端点调用的数量。

XAEndMaxTime

XAResource 结束调用的最长时间。这个值以毫秒为单位。

XAEndTotalTime

所有 XAResource 结束调用的总时间。这个值以毫秒为单位。

XAForgetAverageTime

XAResource 的平均时间忘记调用。这个值以毫秒为单位。

XAForgetCount

XAResource 忘记调用的数量。

XAForgetMaxTime

XAResource 忘记调用的最长时间。这个值以毫秒为单位。

XAForgetTotalTime

所有 XAResource 都忘记调用的总时间。这个值以毫秒为单位。

XAPrepareAverageTime

XAResource 准备调用的平均时间。这个值以毫秒为单位。

XAPrepareCount

XAResource 准备调用的数量。

XAPrepareMaxTime

XAResource 准备调用的最长时间。这个值以毫秒为单位。

XAPrepareTotalTime

所有 XAResource 准备调用的总时间。这个值以毫秒为单位。

XARecoverAverageTime

XAResource 恢复调用的平均时间。这个值以毫秒为单位。

XARecoverCount

XAResource 恢复调用的数量。

XARecoverMaxTime

XAResource 恢复调用的最长时间。这个值以毫秒为单位。

XARecoverTotalTime

所有 XAResource 恢复调用的总时间。这个值以毫秒为单位。

XARollbackAverageTime

XAResource 回滚调用的平均时间。这个值以毫秒为单位。

XARollbackCount

XAResource 回滚调用数量。

XARollbackMaxTime

XAResource 回滚调用的最长时间。这个值以毫秒为单位。

XARollbackTotalTime

所有 XAResource 回滚调用的总时间。这个值以毫秒为单位。

XAStartAverageTime

XAResource 开始调用的平均时间。这个值以毫秒为单位。

XAStartCount

XAResource start 调用的数量。

XAStartMaxTime

XAResource 开始调用的最长时间。这个值以毫秒为单位。

XAStartTotalTime

所有 XAResource 启动调用的总时间。这个值以毫秒为单位。

表 A.2. JDBC Statistics

名称描述

PreparedStatementCacheAccessCount

访问声明缓存的次数。

PreparedStatementCacheAddCount

添加至声明缓存的声明数。

PreparedStatementCacheCurrentSize

当前缓存在声明缓存中的已就绪和可调用语句的数量。

PreparedStatementCacheDeleteCount

从缓存中丢弃的声明数。

PreparedStatementCacheHitCount

使用缓存中的语句的次数。

PreparedStatementCacheMissCount

声明请求无法通过缓存中的语句满足的次数。

A.2. 资源适配器统计信息

表 A.3. 资源适配器统计信息

名称描述

ActiveCount

活跃连接的数量。每个连接可以由应用使用,或者在池中可用

AvailableCount

池中可用连接的数量。

AverageBlockingTime

阻止在池中获取专用锁定的平均时间。该值以毫秒为单位。

AverageCreationTime

创建连接所需的平均时间。该值以毫秒为单位。

CreatedCount

创建的连接数。

DestroyedCount

销毁的连接数量。

InUseCount

当前使用的连接数。

MaxCreationTime

创建连接所花费的最长时间。该值以毫秒为单位。

MaxUsedCount

使用的最大连接数。

MaxWaitCount

同时等待连接的最大请求数。

MaxWaitTime

等待池中专用锁定的最长时间。

timedOut

连接超时的数量。

TotalBlockingTime

在池中等待专用锁定的总时间。该值以毫秒为单位。

TotalCreationTime

创建连接所花费的总时间。该值以毫秒为单位。

WaitCount

必须等待连接的请求数。

A.3. IO 子系统属性

注意

这些表中的属性名称会在管理模型中出现时列出,例如使用管理 CLI 时。查看位于 EAP_HOME/docs/schema/wildfly-io_3_0.xsd 中的架构定义文件,以查看它们出现在 XML 中的元素,因为管理模型可能会有所不同。

表 A.4. 工作程序属性

属性默认描述

io-threads

 

为 worker 创建的 I/O 线程数量。如果没有指定,线程数被设置为 CPU 的数量 ¹ 2。

stack-size

0

堆栈大小(以字节为单位),以尝试用于 worker 线程。

task-keepalive

60000

非核心任务线程保持活动状态的毫秒数。

task-core-threads

2

内核任务线程池的线程数。

task-max-threads

 

worker 任务线程池的最大线程数。如果没有指定,则最大线程数被设置为 CPU ¹ 16 的最大数量,采用 MaxFileDescriptorCount JMX 属性(如果设置)。

表 A.5. buffer-pool 属性

属性默认描述
注意

IO 缓冲池已弃用,但它们仍设置为当前版本中的默认设置。有关配置 Undertow 字节缓冲区池的更多信息,请参阅 JBoss EAP 配置指南中的配置缓冲区池 章节此外,请参阅字节缓冲区池属性列表的 JBoss EAP 配置指南中的 缓冲池属性

buffer-size

 

每个缓冲区片段的大小(以字节为单位)。如果没有指定,则根据系统的可用 RAM 设置大小:

  • RAM 小于 64 MB 的 512 字节
  • 1024 bytes (1 KB) for 64 MB - 128 MB RAM
  • 16384 字节(16 KB),用于 128 MB RAM

有关此属性的性能调优建议,请参阅配置缓冲池

buffers-per-slice

 

将更大的缓冲区分成多少个片段或部分。这比分配多个单独的缓冲区更高效内存。如果没有指定,则根据系统的可用 RAM 设置分片数:

  • 10,内存小于 128 MB
  • 20 内存超过 128 MB

direct-buffers

 

缓冲区池是否使用直接缓冲区,在很多情况下,使用 NIO 时速度更快。请注意,有些平台不支持直接缓冲区。





修订了 2022 年 2 月 18:28:05 +1000