Spring启动应用程序在启动时消耗100%的CPU

时间:2017-11-13 17:23:38

标签: spring-boot

我们有40多个春季启动应用程序,当我们尝试并行启动所有这些应用程序时,大约需要9到10分钟。我们注意到在整个持续时间内CPU使用率始终为100%。 在所有应用程序成功启动并在Eureka注册后,CPU使用率恢复正常(启动后平均CPU使用率约为30-40%)。

似乎每个春季启动应用程序至少花费大约15-20秒来启动,我们不满意,因为应用程序开始时相对较小。

我们还禁用了弹簧启动自动配置,以确保只需要匹配"类在春季启动时启动时加载。在此次更改后,我们在启动时仅获得了大约1或2秒的时间。

我们似乎拥有足够的系统资源,其中有8个核心CPU和32 GB的内存。

Spring boot版本是1.3.6.RELEASE。

是否与Spring启动有关?因为即使我们启动单个弹簧启动应用程序,它也会使CPU达到70-80%的使用率。非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

这更多的是在启动应用程序时执行的bean和自动配置的数量。

对于简单的Web应用程序以及JPA,还有webcontainer及其thread poolsDataSources初始化以及需要初始化的更多支持bean和自动配置。这些都是一些严肃的资源采取行动,它们都在应用程序启动时匆匆忙忙,以便尽快启动应用程序。

鉴于您同时启动了40多个这样的应用程序,服务器将不得不支付其费用。

有一些方法可以改善应用程序启动时间。

  1. 从应用程序中删除不必要的模块和bean定义。开发人员最常犯的错误是当应用程序甚至不需要Web环境时包含spring-boot-starter-web。其他starter模块也是如此。
  2. 使用Conditional @ConditionalOnMissingBean @ConditionalOnProperty @ConditionalOnClass @ConditionalOnBean @ConditionalOnMissingClass来使用@ConditionalOnExpression Bean定义。如果你让春天来检查有很多条件的豆子,这可能会适得其反。
  3. 使用spring profiles。如果您不希望特定的一组bean不属于该运行实例,您可以将它们分组到配置文件中并启用它们或禁用它们
  4. 配置Web容器可以拥有的initial number of threads。同样适用于Datasources。仅使用所需数量的活动线程启动池。
  5. 通过使用@Lazy注释类或bean来对bean使用延迟初始化。此注释可以是每个bean,也可以是整个@Configuration
  6. 如果这不能满足您的需求,您可以使用nicecputools等命令来限制每个进程的CPU使用率。

    这是围绕cputools的article