Sun Java System Message Queue 3.7 UR1 管理指南

系统调整

以下各节讲述您可以对操作系统、JVM 和通信协议所做的调整。

Solaris 调整:CPU 利用率、分页/交换/磁盘 I/O

有关对操作系统的调整,请参见系统文档。

Java 虚拟机调整

默认情况下,代理使用大小为 192MB 的 JVM 堆。这对于较大的消息负载来说通常太小,应该增大。

当代理快要耗尽 Java 对象使用的 JVM 堆空间时,它将使用各种技术(如流控制和消息交换)来释放内存。在极端情况下,代理甚至关闭客户端连接以释放内存并减少消息内流。所以最好将最大 JVM 堆空间设置得足够大,以避免这种情况。

但是,与系统的物理内存相比,如果最大 Java 堆空间设置过大,代理将继续增大 Java 堆空间,直至整个系统耗尽内存。这会导致性能的降低、不可预计的代理崩溃和/或影响系统中运行的其他应用程序和服务的行为。通常,需要有足够的物理内存以供操作系统和其他应用程序在计算机上运行。

总的说来,好的方法是:估算正常和峰值系统内存容量,并配置 Java 堆大小,使其足以提供良好性能,但同时不应过大,以免引起系统内存问题。

要更改代理的最小和最大堆大小,请在启动代理时使用 -vmargs 命令行选项。例如:

/usr/bin/imqbrokerd -vmargs "-Xms256m -Xmx1024m"

此命令将启动 Java 堆大小设置为 256MB,将最大 Java 堆大小设置为 1GB。

在任何情况下,都应当通过检查代理的日志文件或通过使用 imqcmd metrics bkr -m cxn 命令来验证设置。

调整传输协议

选择了符合应用程序需要的协议后,基于该协议进行其他调整可能有助于提高性能。

可以使用下面三个代理属性修改协议的性能:

对于 TCP 和 SSL 协议,这些属性会影响客户端与代理之间的消息传送速度。对于 HTTP 和 HTTPS 协议,这些属性会影响 Message Queue 隧道 Servlet(在 Web 服务器上运行)与代理之间的消息传送速度。对于 HTTP/HTTPS 协议,还有其他可以影响性能的属性(请参见 HTTP/HTTPS 调整)。

协议调整属性将在以下各节中讲述。

nodelay

nodelay 属性影响给定协议的 Nagle 算法(TCP/IP 上的 TCP_NODELAY 套接字级选项的值)。Nagle 算法用于提高使用慢速连接(例如广域网 (Wide-area Network, WAN))的系统上的 TCP 性能。

如果使用了此算法,TCP 将通过把多个数据捆绑为较大的包来尝试防止将多个小块数据发送到远程系统。如果写入套接字中的数据没有填满需要的缓冲区大小,协议将延迟发送包,直到缓冲区被填满,或者经过了特定的延迟时间为止。填满了缓冲区或者发生了超时后,包将被发送。

对于大多数消息传送应用程序,如果包发送过程中没有延迟(Nagle 算法未启用),则性能是最佳的。这是因为客户端与代理之间的大多数交互都是请求/响应交互:客户端向代理发送数据包,并等待响应。例如,典型的交互包括:

对于这些交互,大多数包都比缓冲区大小要小。这意味着如果使用 Nagle 算法,代理会在向使用方发送响应之前延迟几毫秒。

但是,在连接较慢以及不需要代理响应的情况下,Nagle 算法可以提高性能。例如,客户端发送非持久性消息或者客户端确认未被代理确认(DUPS_OK_ACKNOWLEDGE 会话)就属于这样的情况。

inbufsz/outbufsz

inbufsz 属性用于在读取来自套接字的数据的输入流上设置缓冲区大小。同样,outbufsz 用于设置代理用来将数据写入套接字的输出流的缓冲区大小。

通常,这两个参数都应该设置为比收发的平均包稍大的值。一个很好的经验是将这些属性值设为平均包的大小再加上 1k(舍入为最接近的 k 值)。例如,如果代理正在接收主体大小为 1k 的包,则该包的总体大小(消息主体+标题+属性)约为 1200 字节;大小为 2k(2048 字节)的 inbufsz 可以提供合理的性能。增大 inbufszoutbufsz(使其大于该值)可以稍微提高性能,但这样会增加每个连接所需的内存。

HTTP/HTTPS 调整

除了前面两节讨论的一般属性之外,HTTP/HTTPS 的性能还受到客户端向作为 Message Queue 隧道 Servlet 宿主的 Web 服务器发出 HTTP 请求的速度的限制。

Web 服务器可能需要优化,以处理单个套接字上的多个请求。在 JDK 1.4 版及更高版本中,与 Web 服务器的 HTTP 连接会一直保持活动状态(与 Web 服务器的套接字保持打开状态),以尽量减少 Web 服务器在处理多个 HTTP 请求时使用的资源。如果使用 JDK 1.4 版的客户端应用程序的性能比运行早期 JDK 版本的同一应用程序要低,则可能需要调整 Web 服务器的 keep-alive 配置参数以提高性能。

除了这样的 Web 服务器调整之外,您还可以调整客户端轮询 Web 服务器的频率。HTTP 是一种基于请求的协议。这意味着使用基于 HTTP 的协议的客户端需要定期检查 Web 服务器,以查看是否有消息在等待。imq.httpjms.http.pullPeriod 代理属性(以及相应的 imq.httpsjms.https.pullPeriod 属性)指定 Message Queue 客户端运行时环境轮询 Web 服务器的频率。

如果 pullPeriod 值为 -1(默认值),客户端运行时环境将在前一个请求返回后立即轮询服务器,从而最大限度地提高各个客户端的性能。结果,每个客户端连接都会在 Web 服务器中独占一个请求线程,这样可能会耗费 Web 服务器资源。

如果 pullPeriod 值为正数,客户端运行时环境将定期向 Web 服务器发送请求,以查看是否有挂起的数据。在这种情况下,客户端不会独占 Web 服务器中的请求线程。因此,如果有大量客户端在使用 Web 服务器,您可以通过将 pullPeriod 设为正值来节省 Web 服务器资源。

调整基于文件的持久性存储库

有关调整基于文件的持久性存储库的信息,请参见持久性服务