优化 GlassFish

来源:互联网 发布:环球易购 知乎 编辑:程序博客网 时间:2024/05/01 00:31

优化 HTTPConnector Grizzly

  GlassFish 的 HTTPConnector、Grizzly 默认将使用 NIO 处理客户机请求的连接。New Input/Output (NIO) 是 JDK 1.4 引入的 IO 机制,它提供了可伸缩的网络的文件 IOI,以及本地缓冲管理功能。NIO 引入了通道(channel)的概念,允许流(stream)成为通道。SocketChannel 是可选择的通道,并且允许选择读取或写入多个流。有了它,将不再需要为每个连接使用一个单独线程。因此服务器现在可以只使用少许线程处理多个客户机连接,从而提高性能并减少了线程开销。SocketChannel 可以是闭塞的也可以是非闭塞的。Grizzly 同时提供了闭塞和非闭塞实现,并且默认情况为非闭塞实现,它使用 2 个线程和最多 5 个线程处理来自客户机的请求。这种方式是可优化的,将线程数量增加到 10 个可以达到最佳性能。增加池容量也可以改进性能。池容量的增加如下所示:

<request-processing header-buffer-length-in-bytes="4096" initial-thread-count="2" request-timeout-in-seconds="30" thread-count="10" thread-increment="1"/>
<keep-alive max-connections="10000000" thread-count="1" timeout-in-seconds="30"/>
<connection-pool max-pending-count="14096" queue-size-in-bytes="14096" receive-buffer-size-in-bytes="14096" send-buffer-size-in-bytes="18192"/>

  keepalive 也得到的增加,方法是将 max-connections 修改为 10000000。keepalive 似乎存在一个问题,因为增加其计数实际上并不会阻止服务器建立新连接。为解决此问题,我们将 TCP_TIME_WAIT_INTERVAL 修改为 1000,并增加了文件描述符限制。

  优化垃圾收集(Garbage Collection)

<jvm-options>-Xms3400m</jvm-options>
<jvm-options>-Xmx3400m</jvm-options>
<jvm-options>-XX:UseParallelGC</jvm-options>
<jvm-options>-Xmn256m</jvm-options>

  使用并行收集程序可以将 GlassFish 性能提升为 27K,如 图 1 所示。在 4 核系统上使用并行收集程序之后,原来默认收集程序出现的暂停情况消失了。将堆大小从 1400m 增加到 3400m 也可以改进性能。将其进一步增加到 7m 可以实现更大的性能提升。(GlassFish 可能与 64 位 JVM 之间存在一些问题,我们并没有尝试这一组合。)

原创粉丝点击