性能调优指南

Red Hat JBoss Enterprise Application Platform 7.4

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

Red Hat Customer Content Services

摘要

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

提供有关 JBoss EAP 文档的反馈

要报告错误或改进文档,请登录到 Red Hat JIRA 帐户并提交问题。如果您没有 Red Hat Jira 帐户,则会提示您创建一个帐户。

流程

  1. 单击以下链接 以创建 ticket
  2. 请包含 文档 URL章节编号 并描述问题
  3. Summary 中输入问题的简短描述。
  4. Description 中提供问题或功能增强的详细描述。包括一个指向文档中问题的 URL。
  5. Submit 创建问题,并将问题路由到适当的文档团队。

使开源包含更多

红帽承诺替换我们的代码、文档和网页属性中存在问题的语言。我们从这四个术语开始: master、slave、blacklist 和 whitelist。这些更改将在即将发行的几个发行本中逐渐实施。详情请查看 CTO Chris Wright 信息

第 1 章 性能调优简介

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

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

You should stress test and verify all performance configuration changes under anticipated conditions in a development or testing environment prior to deploying them to production.

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

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

  • 如果您安装了 JBoss EAP 压缩文件,则安装目录是您提取压缩存档的 jboss-eap-7.4 目录。
  • 如果您使用 RPM 安装方法安装 JBoss EAP,安装目录为 /opt/rh/eap7/root/usr/share/wildfly/
  • 如果您使用安装程序安装 JBoss EAP,EAP_HOME 的默认路径为 ${user.home}/EAP-7.4.0

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

    • 对于 Red Hat Enterprise Linux:/home/USER_NAME/devstudio/runtimes/jboss-eap/
    • 对于 Microsoft Windows:C:\Users\USER_NAME\devstudio\runtimes\jboss-eapC:\Documents and Settings\USER_NAME\devstudio\runtimes\jboss-eap\
注意

如果您在 Red Hat CodeReady Studio 中将 Target runtime 设为 7.4 或更新的运行时版本,则您的项目与 Jakarta EE 8 规范兼容。

注意

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 本地单机 JBoss EAP 服务器 JVM

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

      图 2.2. JConsole 本地受管域 JBoss EAP JVM

      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 本地独立 JBoss EAP 服务器 JVM

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

      图 2.5. VisualVM 本地受管域 JBoss EAP JVM

      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 的详细信息:

    • Connection 字段中,插入要监控的远程 JBoss EAP JVM 进程的 URI。请参阅有关为 要使用的 URI 配置 JBoss EAP 远程监控连接 的说明。
    • 选中 Use security credentials 复选框,然后为监控连接输入用户名和密码。
    • 如果您不使用 SSL 连接,请选择 Do not require SSL connection 复选框。

    图 2.6. VisualVM 远程 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 8 或 Oracle JDK 8:

      -verbose:gc -Xloggc:<path_to_directory>/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=3M -XX:-TraceClassUnloading
    • 对于 OpenJDK、Oracle JDK 或支持 JEP 271 的 JDK 版本:

      -Xlog:gc*:file=<path_to_directory>/gc.log:time,uptimemillis:filecount=5,filesize=3M
    • 对于 IBM JDK:

      -Xverbosegclog:<path_to_directory>/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 and 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)等工具

3.4. 受管执行器服务和受管调度执行器服务的运行时统计信息

您可以通过查看管理 CLI 属性生成的运行时统计信息,监控受管 executor 服务的性能和管理调度的执行者服务。您可以查看单机服务器的运行时统计信息,或者查看映射到主机的个别服务器的运行时统计信息。

重要

domain.xml 配置不包括运行时统计管理 CLI 属性的资源,因此您无法使用管理 CLI 属性来查看受管域的运行时统计信息。

表 3.1. 显示用于监控受管执行器服务和托管调度执行器服务性能的管理 CLI 属性。

属性描述

active-thread-count

主动执行任务的近似线程数量。

completed-task-count

已完成执行的任务约为总数。

hung-thread-count

挂起的 executor 线程数量。

max-thread-count

执行器线程的最大数量.

current-queue-size

executor 任务队列的当前大小。

task-count

已提交执行的任务的近似总数。

thread-count

执行器线程的当前数量。

查看在单机服务器上运行的受管 executor 服务的运行时统计信息示例:

[standalone@localhost:9990 /] /subsystem=ee/managed-executor-service=default:read-resource(include-runtime=true,recursive=true)

在单机服务器上运行的受管调度执行器服务的运行时统计数据示例。

[standalone@localhost:9990 /] /subsystem=ee/managed-scheduled-executor-service=default:read-resource(include-runtime=true,recursive=true)

查看在映射到主机的服务器上运行的受管 executor 服务的运行时统计信息示例:

[domain@localhost:9990 /] /host=<host_name>/server=<server_name>/subsystem=ee/managed-executor-service=default:read-resource(include-runtime=true,recursive=true)

在映射到主机的服务器上运行的受管计划执行器服务的运行时统计数据示例。

[domain@localhost:9990 /] /host=<host_name>/server=<server_name>/subsystem=ee/managed-scheduled-executor-service=default:read-resource(include-runtime=true,recursive=true)

其他资源

第 4 章 JVM 调整

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

注意

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

其他资源

4.1. 设置固定堆大小

要在生产环境中预先分配并修复堆大小,您必须将初始和最大堆大小选项设置为相同的大小。

流程

  1. 设置适当的堆大小,以防止出现内存错误。

    1. 使用 -Xms 选项设置初始堆大小和 -Xmx 以设置最大堆大小。

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

    -Xms2048M -Xmx2048M
  2. 在开发环境中测试您的应用程序负载,以确定最大内存用量。

您的生产堆大小应至少比测试的最大值高 25%,以便为开销腾出空间。

4.2. 配置 Garbage Collector

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

流程

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

    -XX:+UseG1GC
垃圾收集器日志选项

垃圾回收日志记录默认为独立的 JBoss EAP 服务器启用。要为 JBoss EAP 受管域启用垃圾回收日志,请参阅启用垃圾回收

4.3. 激活大型页面

激活 JBoss EAP JVM 的大型页面会导致页面中被锁定,而无法像常规内存一样被交换到磁盘。

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

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

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

先决条件

  • 您的操作系统配置被设置为使用大型页面。

流程

  1. 如果您的操作系统没有配置为将大型页面用于 JBoss EAP 进程,请选择以下选项之一:

    • 对于红帽企业 Linux 系统,您必须明确配置 HugeTLB 页面,以确保 JBoss EAP 进程可以访问大页面。

      有关配置 Red Hat Enterprise Linux 内存选项的详情,请参考 Red Hat Enterprise Linux 性能调优指南中 的内存章节

    • 对于运行 JBoss EAP 的 Windows Server 系统,您必须分配大型页面权限:

      1. 选择 Control PanelAdmin ToolsLocal Security Policy
      2. 选择 Local PoliciesUsertitle Assignment
      3. 双击 内存中的锁定页面
      4. 添加您要使用大页面的 Windows Server 用户和组。
      5. 重新启动 计算机。
  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 选项是否已正确配置。

其他资源

4.4. 激活主动优化

使用积极优化(AggressiveOpts)JVM 选项可为您的环境提供性能改进。此选项提供 Java 性能优化功能,它们将在以后的 Java 版本中会变为默认功能。

流程

  1. 要启用 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.

流程

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

    • 对于软 ulimit 值:

      ulimit -Sa
    • 对于硬 ulimit 值:

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

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

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

      ulimit -Hn 4096
      注意

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

其他资源

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

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

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

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

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

第 5 章 Jakarta Enterprise Beans 子系统调优

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

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 值生效。

您可以将企业 Bean 配置为使用特定的实例池。这样,可以更精细地控制每种企业 bean 类型的可用实例。

5.1.1. 创建 Bean 实例池

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

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

  • 创建带有派生最大池大小的 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 将要使用的特定实例池。如需更多信息,请参阅 开发 Jakarta 企业 Bean 应用程序 中的 jboss-ejb3.xml 部署描述符参考

5.1.3. 禁用默认的 Bean 实例池

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

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

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

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

5.2. bean 线程池

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

注意

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

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

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

5.2.1. 创建 Bean 线程池

本节介绍如何使用管理 CLI 创建新的 bean 线程池。您还可以通过从 Configuration 选项卡导航到 Jakarta Enterprise Beans 子系统并在左侧菜单中选择 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. 配置企业 Bean 服务以使用特定的 Bean 线程池

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

本节介绍如何使用管理 CLI 配置上述企业 bean 服务以使用特定的 Bean 线程池。您还可以从 Configuration 选项卡中导航到 Enterprise Bean 子系统,选择"服务"选项卡,然后选择 相应的 服务,从而使用管理控制台配置这些服务。

要将企业 bean 服务配置为使用特定的 bean 线程池,请使用以下命令:

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

SERVICE_NAME 替换为您要配置的企业 bean 服务:

  • 企业 Bean 异步调用 服务的异步异步调用服务
  • 企业 bean 计时 器服务的定时器服务

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

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

5.3. Runtime bean 部署信息

运行时元数据可从 bean 部署中获得,以便您可以监控 Bean 的性能。

运行时元数据可用于以下 Bean 类型:

  • 有状态会话 Bean
  • 无状态会话 Bean
  • 单例 bean
  • 消息驱动的 Bean

Bean 应用将元数据作为代码或部署描述符中的注释包含在内。应用可以同时使用这两个选项。有关可用运行时数据的详情,请查看 JBoss EAP 管理模型中的 ejb3 子系统。

其他资源

5.3.1. 用于从 Jakarta Enterprise Beans 检索运行时数据的命令行选项

通过管理 CLI 提供了 Jakarta Enterprise Beans 的运行时数据,以便您评估 Jakarta 企业 Bean 的性能。

用于获取所有类型的 Bean 的运行时数据的命令使用以下模式:

/deployment=<deployment_name>/subsystem=ejb3/<bean_type>=<bean_name>:read-resource(include-runtime)

<deployment_name> 替换为检索运行时数据的部署 .jar 文件的名称。将 <bean_type> 替换为检索运行时数据的 bean 类型。以下选项对这个占位符有效:

  • stateless-session-bean
  • stateful-session-bean
  • singleton-bean
  • message-driven-bean

<bean_name> 替换为您要检索运行时数据的 bean 的名称。

系统将结果提供给 stdout,格式为 JavaScript 对象表示法(JSON)数据。

获取名为 ejb-management.jar的文件中的名为 ManagedSingletonBean 的单例的运行时数据示例

/deployment=ejb-management.jar/subsystem=ejb3/singleton-bean=ManagedSingletonBean:read-resource(include-runtime)

单例 bean 的输出运行时数据示例

{
    "outcome" => "success",
    "result" => {
        "async-methods" => ["void async(int, int)"],
        "business-local" => ["sample.ManagedSingletonBean"],
        "business-remote" => ["sample.BusinessInterface"],
        "component-class-name" => "sample.ManagedSingletonBean",
        "concurrency-management-type" => undefined,
        "declared-roles" => [
            "Role3",
            "Role2",
            "Role1"
        ],
        "depends-on" => undefined,
        "execution-time" => 156L,
        "init-on-startup" => false,
        "invocations" => 3L,
        "jndi-names" => [
            "java:module/ManagedSingletonBean!sample.ManagedSingletonBean",
            "java:global/ejb-management/ManagedSingletonBean!sample.ManagedSingletonBean",
            "java:app/ejb-management/ManagedSingletonBean!sample.ManagedSingletonBean",
            "java:app/ejb-management/ManagedSingletonBean!sample.BusinessInterface",
            "java:global/ejb-management/ManagedSingletonBean!sample.BusinessInterface",
            "java:module/ManagedSingletonBean!sample.BusinessInterface"
        ],
        "methods" => {"doIt" => {
            "execution-time" => 156L,
            "invocations" => 3L,
            "wait-time" => 0L
        }},
        "peak-concurrent-invocations" => 1L,
        "run-as-role" => "Role3",
        "security-domain" => "other",
        "timeout-method" => "public void sample.ManagedSingletonBean.timeout(javax.ejb.Timer)",
        "timers" => [{
            "time-remaining" => 4304279L,
            "next-timeout" => 1577768415000L,
            "calendar-timer" => true,
            "persistent" => false,
            "info" => "timer1",
            "schedule" => {
                "year" => "*",
                "month" => "*",
                "day-of-month" => "*",
                "day-of-week" => "*",
                "hour" => "0",
                "minute" => "0",
                "second" => "15",
                "timezone" => undefined,
                "start" => undefined,
                "end" => undefined
            }
        }],
        "transaction-type" => "CONTAINER",
        "wait-time" => 0L,
        "service" => {"timer-service" => undefined}
    }
}

检索名为 ejb-management.jar的文件中部署的名为 NoTimerMDB 的消息的运行时数据示例

/deployment=ejb-management.jar/subsystem=ejb3/message-driven-bean=NoTimerMDB:read-resource(include-runtime)

消息驱动的 Bean 的输出示例

{
    "outcome" => "success",
    "result" => {
        "activation-config" => [
            ("destination" => "java:/queue/NoTimerMDB-queue"),
            ("destinationType" => "javax.jms.Queue"),
            ("acknowledgeMode" => "Auto-acknowledge")
        ],
        "component-class-name" => "sample.NoTimerMDB",
        "declared-roles" => [
            "Role3",
            "Role2",
            "Role1"
        ],
        "delivery-active" => true,
        "execution-time" => 0L,
        "invocations" => 0L,
        "message-destination-link" => "queue/NoTimerMDB-queue",
        "message-destination-type" => "javax.jms.Queue",
        "messaging-type" => "javax.jms.MessageListener",
        "methods" => {},
        "peak-concurrent-invocations" => 0L,
        "pool-available-count" => 16,
        "pool-create-count" => 0,
        "pool-current-size" => 0,
        "pool-max-size" => 16,
        "pool-name" => "mdb-strict-max-pool",
        "pool-remove-count" => 0,
        "run-as-role" => "Role3",
        "security-domain" => "other",
        "timeout-method" => undefined,
        "timers" => [],
        "transaction-type" => "CONTAINER",
        "wait-time" => 0L,
        "service" => undefined
    }
}

5.4. 涉及企业 Bean 子系统调优的例外 ight Be 要求

  • Stateless Jakarta Enterprise Beans 实例池不够大,或者超时太低

    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 实例池

  • 企业 bean 线程池的容量不够大,或者企业 bean 处理的时间比调用超时要长

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

    请参阅 Bean 线程池

5.5. SFSB 的默认全局超时值

ejb3 子系统中,您可以使用 default-stateful-bean-session-timeout 属性,为服务器实例上部署的所有有状态会话 Bean(SFSB)配置默认的全局超时值。

使用 default-stateful-bean-session-timeout 属性,您可以在 ejb3 子系统上使用以下管理 CLI 操作:

  • 管理 CLI 中的 read-attribute 操作,用于查看 属性的当前全局超时值。
  • 使用管理 CLI 配置 属性的 write-attribute 操作。

属性行为因服务器模式而异。例如:

  • 在单机服务器中运行时,配置的值将应用到应用服务器上部署的所有 SFSB。
  • 在受管域中运行服务器时,服务器组内服务器实例上部署的所有 SFSB 都将获得并发超时值。
注意

当您更改属性的全局超时值时,更新的设置仅适用于新部署。您必须重新加载服务器,才能将新设置应用到当前部署。

默认情况下,属性值设置为 -1,这意味着部署的 SFSB 被配置为永不超时。但是,您可以为属性配置以下两种有效值:

  • 当将属性值设置为 0 时,属性会立即标记合格的 SFSB 以供 ejb 容器移除。
  • 当您设置大于 0 的属性值时,SFSB 会在 ejb 容器删除合格的 SFSB 前在指定时间内保持闲置。
注意

您仍然可以使用预先存在的 @StatefulTimeout 注释或 stateful-timeout 元素(位于 ejb-jar.xml 部署 描述符中)来配置 SFSB 的超时值。但是,设置此类配置会将默认的全局超时值覆盖 SFSB。

有两种方法可用于验证您为属性设置的新值:

  • 在管理 CLI 中使用 read-attribute 操作。
  • 检查 服务器配置文件的 ejb3 子系统部分。

其他资源

  • 有关查看属性当前全局超时值的更多信息,请参阅 管理 CLI 指南 中的 显示属性值
  • 有关更新属性当前全局超时值的更多信息,请参阅 管理 CLI 指南中 的更新属性

第 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. 进入 standalone 或 domain mode 中的 datasources。

    • 在独立模式中使用以下导航:

      ConfigurationSubsystemsDatasources & DriversDatasources

    • 在域模式中使用以下导航:

      configurationProfilesfullDatasources & 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 logging 子系统性能。

其他资源

  • 有关配置 日志记录子系统的更多信息,请参阅 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 7 中引入的非阻塞 I/O(NIO) undertow 子系统在 JBoss EAP 6 中与之前的 Web 子系统相比,性能大大提高。为您的环境调整 undertow 子系统的机会包括:

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 实例。所有监听器都有一个字节缓冲区池,您可以为每个监听器使用不同的缓冲区池和工作程序。字节缓冲区池可以在不同的服务器实例之间共享。

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

其他资源

9.3. jakarta 服务器页面配置

以下 Jakarta 服务器页面配置选项可用于 Undertow servlet 容器提供了优化功能,以如何将 Jakarta 服务器页面编译到 Java 字节码中:

generate-strings-as-char-arrays
如果您的 Jakarta 服务器页面包含大量字符串常量,启用该选项通过将 String constants 转换为 char 数组来优化脚本。
optimize-scriptlets
如果您的 Jakarta 服务器页面包含许多 String 串联,启用这个选项,通过删除每个 Jakarta 服务器请求的字符串连接来优化脚本。
trim-spaces
如果您的 Jakarta 服务器页面包含大量空格,则启用该选项修剪 HTTP 请求中的空格并减少 HTTP 请求有效负载。

9.3.1. 使用管理控制台启用 Jakarta 服务器页面选项

要使用管理控制台启用 Undertow Jakarta 服务器页面配置选项,请完成以下步骤:

流程

  1. 导航到 ConfigurationSubsystemsWeb(Undertow)Servlet Container
  2. 选择您要配置的 servlet 容器,然后单击 View
  3. 选择 Jakarta Server Pages,再单击 Edit
  4. 对于您要启用的每个选项,将该字段设置为 ON,然后单击 Save

9.3.2. 使用管理 CLI 启用 Jakarta 服务器页面选项

要使用管理 CLI 启用 Undertow Jakarta 服务器页面配置选项,请完成以下步骤:

流程

  • 使用以下命令:

    /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
连接在关闭前闲置的时间长度,以毫秒为单位。默认值为 60,000 毫秒(1 分钟)。在您的环境中调整此选项以提高连接效率有助于提高网络性能。如果空闲连接永久关闭,则重新建立连接时会有开销。如果空闲连接打开太长时间,则不必要地使用资源。
max-header-size
HTTP 请求标头的最大大小,以字节为单位。默认值为 1,048,576(1024 KB)。限制标头大小有助于防止特定类型的拒绝服务攻击。
buffer-pool
指定用于监听器的 the io 子系统中的缓冲区池。默认情况下,所有侦听器都 使用默认的 缓冲区池。您可以使用这个选项将每个监听程序配置为使用唯一的缓冲区池,或者让多个监听器使用相同的缓冲区池。
worker
undertow 子系统依赖于 io 子系统来提供 XNIO 工作程序。这个选项指定监听程序使用的 XNIO 工作程序。默认情况下,侦听器使用 the io 子系统 中的默认 工作程序。将每个监听程序配置为使用特定的 worker 可能会很有用,以便您可以将不同的工作程序资源分配给特定类型的网络流量。

9.4.1. 使用管理控制台配置监听程序选项

要使用管理控制台配置监听程序选项,请完成以下步骤:

流程

  1. 导航到 ConfigurationSubsystemsWeb(Undertow)Server
  2. 选择您要配置的服务器,然后单击 View
  3. 在左侧菜单中,选择 Listener,然后选择要配置的监听器类型,如 HTTP Listener,然后在表中选择侦听器。
  4. Edit,修改您要配置的选项,然后点 Save

9.4.2. 使用管理 CLI 配置监听程序选项

要使用管理 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,另一个 worker 处理 Jakarta Enterprise Beans 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 子系统调优

为获得最佳网络性能,建议您在支持该网络的环境中将 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

Name描述

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

Name描述

PreparedStatementCacheAccessCount

访问声明缓存的次数。

PreparedStatementCacheAddCount

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

PreparedStatementCacheCurrentSize

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

PreparedStatementCacheDeleteCount

从缓存中丢弃的声明数。

PreparedStatementCacheHitCount

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

PreparedStatementCacheMissCount

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

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

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

Name描述

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 Jakarta Management 属性(如果设置)。

表 A.5. buffer-pool 属性

属性默认描述
注意

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

buffer-size

 

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

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

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

buffers-per-slice

 

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

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

direct-buffers

 

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





更新于 2024-02-09

法律通告

Copyright © 2024 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.