我正在分析使用 Spring、Hibernate 和 mysql-java-connector 的应用程序。 VisualVM显示超过50%的CPU时间花费在com.myql.jdbc.utils.ReadAheadInputStream.fill()
当有 1000 个并行连接进行读取时的方法。
有什么优化可以让它更快吗?
只要 JVM 认为线程可运行,VisualVM 就会将线程计为正在使用 CPU 时间。这意味着任何不等待锁的线程或多或少都被认为是可运行的,包括在内核中等待 I/O 的线程!这就是CPU使用量大的地方com.myql.jdbc.utils.ReadAheadInputStream.fill()
是来自。因此,您遇到的不是 CPU 问题,而是 I/O 问题。
您可以在 JVM 端执行一些操作,但不能进行大量直接优化:
- 调整连接池大小。 1,000 个并发查询是lot。除非您的 MySQL 实例确实很大,否则它在处理这种级别的负载时会遇到困难,并且在查询之间切换会占用大量时间。尝试将池大小降低到 250 甚至 50,并在那里进行基准测试。
- 执行更少或更小的查询。如果您的应用程序很小,那么很明显每个查询的每一行都是必要的,但也许您的应用程序比这更大。不同的地方是否查询相同的数据,或者两个不同的查询是否可以组合成一个同时满足两者的查询?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)