后端应用程序是在play框架中开发的。
连接到2个不同的数据库mysql和oracle。

2至3个小时后,CPU消耗将激增至100%。

部署6个月后,我找不到同一问题的确切根本原因。但是,在Windows事件查看器中,我发现了MYsql的以下错误

WindowsEventViewer日志


  与db的连接472中止了:'mydb'用户:'root'主机:'localhost'(在写入通信数据包时出错)有关更多信息,请参见http://www.mysql.com的帮助和支持中心。


在mysql的WINSERVER.err中找到的日志


  2019-12-18T05:07:35.110436Z 472 [注意]中止与数据库的连接472:
  'mydb'用户:'root'主机:'localhost'(写错误
  通信数据包)


我在应用程序的开头创建了一个数据库连接,整个应用程序都在使用它。

我的数据库配置


  db.mydb.hikaricp.minimumIdle = 2 db.mydb.hikaricp.maximumPoolSize = 4
  db.mydb.hikaricp.idleTimeout = 600000 #### 10分钟
  db.mydb.hikaricp.maxLifetime = 1800000 #### 30分钟
  db.mydb.hikaricp.cachePrepStmts = true
  db.mydb.hikaricp.prepStmtCacheSize = 250
  db.mydb.hikaricp.prepStmtCacheSqlLimit = 2048
  db.mydb.hikaricp.useServerPrepStmts = true
  db.mydb.hikaricp.useLocalSessionState = true
  db.mydb.hikaricp.rewriteBatchedStatements = true
  db.mydb.hikaricp.cacheResultSetMetadata = true
  db.mydb.hikaricp.cacheServerConfiguration = true
  db.mydb.hikaricp.elideSetAutoCommits = true
  db.mydb.hikaricp.maintainTimeStats = false

最佳答案

我认为您存在内存泄漏。

是的,我知道,这不是一个好消息:您的应用程序创建了无法删除的对象,因为它们被其他对象引用,因此堆满了,垃圾收集器开始更频繁地运行而没有成功。对CPU使用率有负面影响。

论文验证

您有几种测试内存使用情况的方法,根据问题是否发生,它们会有所不同。

问题在继续

如果可以通过ssh访问生产环境,则可以运行以下命令(以超级用户身份):

jstat -gc <pid java> 15000 10

获得这样的东西:

java - CPU使用率高峰发挥框架Java MySQL-LMLPHP

通过这种方式,您将在垃圾收集器活动的最后15秒内采样10个样本。如果FGC(从jvm启动开始的Full Garage Collection事件的数量)频率是每秒1或类似的频率,则可能发生内存泄漏!请记住,通常对于10个YGC(Young Garbage Collection:gc的轻量版本)运行,您只有1个FGC(此数字仅供参考)。

或者,如果您可以在生产环境中具有堆的监视器(VisualVM或类似工具)

在这种情况下,您可以具有如下图:

java - CPU使用率高峰发挥框架Java MySQL-LMLPHP

您可以进行堆转储并对其进行分析,以验证最新的对象。

问题尚未发生

同样,使用堆监视器(VisualVM),您可以在应用程序中使用一段时间,然后强制运行Full Garbage Collector,并验证每次运行时您自己的对象(应用程序的对象)的数量已显着减少或归零。 。

关于java - CPU使用率高峰发挥框架Java MySQL,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59386099/

10-08 20:44