Spring Boot 性能相关的配置

由于有机会在Spring Boot中设置与性能相关的配置,所以我将其记录下来。

由于我还包含了自己的假设,请谅解这一点。
我打算随时改进它。

目前,主要的設定是關於同時執行連接數。

各种版本 (gè

“OpenJDK版本11.0.6”
“org.springframework.boot:spring-boot-starter-web:jar:2.1.7.RELEASE”
“org.springframework.boot:spring-boot-starter-jetty:jar:2.1.7.RELEASE”
“org.springframework.boot:spring-boot-starter-jdbc:jar:2.1.7.RELEASE”
“com.h2database:h2:jar:1.4.199”

Jetty(Java Servlet容器/网页服务器)

Jetty 是 Java Servlet 容器/Web 服务器,也是 Spring Boot 的嵌入式容器。在 Jetty 中,我们主要进行线程数的设置。

设定项目

設定項目意味デフォルト値application.propertiesの項目名スレッドプールの最大スレッド数意味は左記の通りですが、application.propertiesで値を設定してもデフォルト値から変更されませんでした。QueuedThreadPoolには外部からの設定を受け入れるような箇所がないのが原因かと思いますが、調査次第、記載しようと思います。ただ、最大で200もあれば十分なのかなと思ってしまうので、設定できる必要性は薄いのかもしれません。200server.jetty.max-threadsスレッドプールの最小スレッド数最大スレッド数と同様、設定しても有効になりませんでした。調査していこうと思います。8server.jetty.min-threadsアクセプタースレッドの数アクセプタースレッドは、クライアントからの要求を受け付け、セレクタースレッドに処理を任せます。アクセプタースレッド自体は大したことをしないので、このスレッド数は少なくても大丈夫です。デフォルトから変更する必要はほぼ無いかと思います。なお、アクセプタースレッドもスレッドプールのスレッドです。-1(オペレーティング環境から導出される。導出のロジックについては参考ページをご覧ください。)server.jetty.acceptorsセレクタースレッドの数セレクターとは、ノンブロッキングIOでクライアントとの通信チャンネルを管理するコンポーネントです。従来のブロッキングIOでは、クライアントとの通信が開始してから完了するまで、スレッドがブロックされていました。Jettyで採用されているノンブロッキングIOでは、ちょっとした待ち時間ではスレッドはブロックされず、その間に別の処理を実行することができ、効率性が向上しています。このためには、通信するチャンネルを覚えておく必要があり、その役割を担うのがセレクターです。セレクターは、後続のJava処理を呼び出したりするので、セレクタースレッドの数は性能に大きな影響を与えます。なお、セレクタースレッドもスレッドプールのスレッドです。-1(オペレーティング環境から導出される。導出のロジックについては参考ページをご覧ください。)jetty.server.selectors

将其配置在application.properties文件中,则会变成以下方式。

server.jetty.acceptors=2
server.jetty.selectors=3

确认设置是否起作用的方法

这是在Mac上确认的方法。(可能也适用于其他环境,但未经验证。)

启动Spring Boot应用程序。
②启动jconsole

在终端上输入”jconsole”并执行。jconsole是JDK内置的图形化工具,通过使用JMX来可视化MBean的状态。

スクリーンショット 2020-02-24 14.26.05.png
请确认线程的状态。

当检查线程的状态时,可以看到如下情况,验证了设置已生效。

スレッド.png

另外,在这里我们设置了如前所述的参数:server.jetty.acceptors=2、server.jetty.selectors=3。

顺便提一下,有8个以”qtp”开头的线程是因为线程池的最小大小(线程数)的默认值是8。

请提供原文以便进行翻译。

https://www.eclipse.org/jetty/documentation/current/architecture.html -> https://www.eclipse.org/jetty/documentation/current/architecture.html(了解Eclipse Jetty的架构)

https://support.sonatype.com/hc/en-us/articles/360000744687-Understanding-Eclipse-Jetty-9-4-8-Thread-Allocation -> https://support.sonatype.com/hc/en-us/articles/360000744687-Understanding-Eclipse-Jetty-9-4-8-Thread-Allocation(了解Eclipse Jetty 9.4.8的线程分配)

https://www.techscore.com/tech/Java/JavaSE/NIO/5/ -> https://www.techscore.com/tech/Java/JavaSE/NIO/5/(了解Java NIO(非阻塞IO)的基础)

https://www.techscore.com/tech/Java/JavaSE/NIO/5-2/ -> https://www.techscore.com/tech/Java/JavaSE/NIO/5-2/(深入了解Java NIO(非阻塞IO)的进阶)

https://spring.pleiades.io/spring-boot/docs/current/reference/html/appendix-application-properties.html#server-properties -> https://spring.pleiades.io/spring-boot/docs/current/reference/html/appendix-application-properties.html#server-properties(查看Spring Boot的服务器属性设置)

HikariCP(连接池)

HikariCP是一个高速的连接池,在Spring Boot中经常被使用。spring-boot-starter-jdbc依赖于HikariCP,当使用spring-boot-starter-jdbc时,默认会使用HikariCP。

在HikariCP中,可以对连接池中维护的连接数量等进行配置。

设置选项

設定項目意味デフォルト値application.propertiesの項目名connectionTimeoutクライアントがコネクションプールからコネクションを取得するときの最大待ち時間です。30000(30秒)spring.datasource.hikari.connection-timeoutidleTimeoutコネクションプールの中のコネクションが、この時間だけ使われずに放って置かれた場合、そのコネクションはコネクションプールから解放されます。この設定は、minimumIdleがmaximumPoolSize未満に定義されている場合にのみ適用されます。アイドルなコネクションがたくさんあっても、minimumIdleの数のコネクションは解放されずに維持されます。コネクションが解放されるかどうかの判定は、この設定値そのものが閾値になるわけではなく、この設定値を起点としてバラつきがあります(設定値+平均15秒、+最大30秒のバラつき)。値0は、アイドル接続がプールから解放されないことを意味します。許可される最小値は10000ms(10秒)です。600000(10分)spring.datasource.hikari.idle-timeoutmaxLifetimeプールされてからこの時間が経過したコネクションは、コネクションプールから解放されます。使用中のコネクションは、そのコネクションがcloseされるのを待って削除されます。とはいえ、一気に大量のコネクションが解放されるのはマズイので、そうならないように制御されます。1800000(30分)spring.datasource.hikari.max-lifetimeminimumIdleプールに最低限 維持しておこうとHikariCPが努める、アイドルなコネクションの数。つまりこの数を下回らないことは保証されません。下回った場合はHikarriCPがベストエフォルトでこの数だけのアイドルなコネクションを生成してくれます。しかし、最高のパフォーマンスと、突発的な処理要求に対応できるようにするために、そもそもHicariCPではこの設定を使わず、デフォルト値のまま(maximumPoolSize と同じ)が推奨されます。maximumPoolSize と同じ。spring.datasource.hikari.minimum-idlemaximumPoolSizeプールで維持するコネクション(使用中、アイドルの両方)の上限数です。プール中のコネクションが全て使用中だった場合、getConnection()すると、connectionTimeoutだけブロックします。10spring.datasource.hikari.maximum-pool-size

如果在application.properties文件中进行设置,将会如下所示。

spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.idle-timeout=600000
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.maximum-pool-size=10

确认设置是否生效的方法

下面是在Mac上进行确认的方法。(尽管还应该可以在其他环境中进行确认,但未经实际验证。)

将HikariCP对象配置为以MBean形式进行注册。

我会添加以下设定。

spring.datasource.hikari.register-mbeans=true

通过这样做,HikariCP的对象将被注册为MBean,并且可以使用JMX从外部进行监控。

启动Spring Boot应用程序
③打开jconsole

在终端输入jconsole并执行。jconsole是与JDK一起提供的GUI工具,使用JMX可视化MBean的状态。

スクリーンショット 2020-02-24 14.26.05.png
④检查MBean的状态
スクリーンショット 2020-02-24 14.29.53.png
スクリーンショット 2020-02-24 14.32.12.png
请参考

以下是相关的链接:
– https://github.com/brettwooldridge/HikariCP
– https://spring.pleiades.io/spring-boot/docs/current/reference/html/appendix-application-properties.html#data-properties
– https://matsumana.info/blog/2016/02/06/spring-boot-hikaricp-metrics/

请注意:以上链接是与HikariCP相关的资源。

bannerAds