halo icon indicating copy to clipboard operation
halo copied to clipboard

连接远程数据库超级慢

Open mogody opened this issue 5 years ago • 26 comments

Server 版本:1.3.2 Admin 版本:1.2.0 数据库:MySQL 5.7.18 运行模式:production

如题,目前发现连接远程的数据库超级慢,我后端服务器在上海,然后数据库服务器在北京,都是用腾讯云的服务,数据库用的是云服务,而不是自建的;数据库方面排查延迟很低,ping都是在30ms左右,并且其他应用访问速度很快(其他应用服务器和halo博客在同一台机器(上海地域),连接的是同一个mysql数据库(北京地域))

博客地址: https://www.mogody.com

可以随便打开一篇文章,速度是肉眼可见的慢,每个请求基本都是在3-4s左右。测试切换到内网数据库,访问速度有明显提升,每个请求差不多在300ms左右,但是还是不如 1.2.0 版本的

mogody avatar Jun 12 '20 03:06 mogody

如果切换为内网数据库变快了,应该想到之前的 3-4s 中的大部分延时是地域造成的。

JohnNiang avatar Jun 12 '20 03:06 JohnNiang

如果方便的话,建议开启 debug 模式,查看 halo 的详细日志,看每一步的耗时。

JohnNiang avatar Jun 12 '20 03:06 JohnNiang

@JohnNiang 可如果是地域问题导致,那为何我其他应用,访问非常稳定;而且我切换为内网的话,速度明显不如1.2.0版本的,也是肉眼可见的差别

mogody avatar Jun 12 '20 03:06 mogody

ok 那我排查下看看

mogody avatar Jun 12 '20 03:06 mogody

@JohnNiang debug模式是哪个配置呢?

mogody avatar Jun 12 '20 03:06 mogody

@JohnNiang debug模式是哪个配置呢?

application.yml 中新增配置以下内容:

logging:
  level:
    run.halo.app: DEBUG
    org.hibernate: INFO
    org.hibernate.type.descriptor.sql.BasicBinder: INFO
    org.hibernate.type.descriptor.sql.BasicExtractor: INFO

JohnNiang avatar Jun 12 '20 04:06 JohnNiang

@JohnNiang 按照这个配置了,还有没有产生任何日志,下一步该怎么排查呢

mogody avatar Jun 12 '20 06:06 mogody

@JohnNiang 按照这个配置了,还有没有产生任何日志,下一步该怎么排查呢

配置后需要重启才会生效。

JohnNiang avatar Jun 12 '20 06:06 JohnNiang

观察了大半天,日志中除了 Token 相关的之外,只有这一条信息:

2020-06-13 06:49:08.123  WARN 6 --- [XNIO-1 task-1] com.zaxxer.hikari.pool.PoolBase          : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@164183d7 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value.

MySQL服务器的 wait_timeout 的配置是 3600

mogody avatar Jun 12 '20 23:06 mogody

可能得靠缓存来解决这个问题了。

JohnNiang avatar Jun 15 '20 15:06 JohnNiang

可能得靠缓存来解决这个问题了。

这个问题的原因是什么?链接远程服务器慢是肯定的,但是也不至于这么慢。而且我博客也基本上没什么文章,如果直接加缓存来加速,是否意味着程序代码上面还有优化的空间呢?

mogody avatar Jun 16 '20 06:06 mogody

2020-06-13 06:49:08.123  WARN 6 --- [XNIO-1 task-1] com.zaxxer.hikari.pool.PoolBase          : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@164183d7 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value.

这个错误日志报的非常频繁,

mogody avatar Jun 16 '20 06:06 mogody

可能得靠缓存来解决这个问题了。

这个问题的原因是什么?链接远程服务器慢是肯定的,但是也不至于这么慢。而且我博客也基本上没什么文章,如果直接加缓存来加速,是否意味着程序代码上面还有优化的空间呢?

是的,代码上确实有很多优化空间,一个页面查询太多次数据库,导致查询时间线性递增。

JohnNiang avatar Jun 16 '20 06:06 JohnNiang

2020-06-13 06:49:08.123  WARN 6 --- [XNIO-1 task-1] com.zaxxer.hikari.pool.PoolBase          : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@164183d7 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value.

这个错误日志报的非常频繁,

这个日志非常有用,基本判定为连接池配置和 MySQL 那边的配置问题,通过这个异常搜索到:

  • https://github.com/brettwooldridge/HikariCP/issues/856
  • https://github.com/brettwooldridge/HikariCP/issues/1131

后面有时间我们将验证一下。

ruibaby avatar Jun 16 '20 06:06 ruibaby

  1. 大概率是halo业务代码或者配置层面的问题,我用的mysql是云数据库,不是自建的,参数都是走默认的,原则上不会有很大问题。
  2. 这个数据库稳定运行很久了,就最近部署了一个全新的halo应用,只有halo应用非常慢
  3. 其他应用性能都非常ok,稳定快速,延时都是在正常跨地域连接延时内,而且halo和其他应用都是部署在同一地域不同可用区的k8s集群内,配置什么的和其他应用都是一样的

mogody avatar Jun 18 '20 06:06 mogody

1. 大概率是halo业务代码或者配置层面的问题,我用的mysql是云数据库,不是自建的,参数都是走默认的,原则上不会有很大问题。

2. 这个数据库稳定运行很久了,就最近部署了一个全新的halo应用,只有halo应用非常慢

3. 其他应用性能都非常ok,稳定快速,延时都是在正常跨地域连接延时内,而且halo和其他应用都是部署在同一地域不同可用区的k8s集群内,配置什么的和其他应用都是一样的

是的,下一步得考虑缓存所有页面了,减少数据库访问次数。

JohnNiang avatar Jun 18 '20 07:06 JohnNiang

我感觉应该要优化sql语句以及减少不必要的查询,而不是加缓存。博客类应用其实数据量和访问量并不大,是完全不需要用到缓存的,如果用了缓存本质上也是治标不治本。

mogody avatar Jun 18 '20 08:06 mogody

我感觉应该要优化sql语句以及减少不必要的查询,而不是加缓存。博客类应用其实数据量和访问量并不大,是完全不需要用到缓存的,如果用了缓存本质上也是治标不治本。

你可能误解了我的意思了。这里缓存是指直接渲染页面成静态内容,缓存在内存或磁盘。

JohnNiang avatar Jun 18 '20 08:06 JohnNiang

如果是因为 SQL 执行速度太慢,是需要着重优化 SQL;但是因为数据库连接太慢,我认为更重要的是要优化一下为什么连接如此慢。减少不必要的 SQL 的幅度也不会太大,该慢仍然会慢(当然,我们也会努力减少不必要的查询,或改进为并发查询)。

JohnNiang avatar Jun 18 '20 08:06 JohnNiang

嗯,这样确实是可以解决问题的。但是个人还是感觉要从两点出发:

  1. 减少不必要的查询
  2. 优化SQL语句效率
  3. 列表尽量避免n+1查询

这个才是根本上解决问题的,直接缓存页面还要考虑页面的更新策略等等,其实加重了设计,也是治标不治本的表现

mogody avatar Jun 18 '20 08:06 mogody

现在可以使用最新版本测试一下文章页面。

ruibaby avatar Aug 12 '20 06:08 ruibaby

用了latest版本访问,无论是mysql和h2版,当数据量级达到1w左右的时候,查询非常慢,单个文章的查询基本在5-6s加载完成。排查中导出数据到mysql,单个查询,速度并不慢【20-100ms】,我跟踪代码进去,单个文章的关联查询多,还会查询上一篇和下一篇的文章。每一个查询递归 加起来,确实非常慢 【10106.wang】

weizeng avatar Aug 25 '21 02:08 weizeng

用了latest版本访问,无论是mysql和h2版,当数据量级达到1w左右的时候,查询非常慢,单个文章的查询基本在5-6s加载完成。排查中导出数据到mysql,单个查询,速度并不慢【20-100ms】,我跟踪代码进去,单个文章的关联查询多,还会查询上一篇和下一篇的文章。每一个查询递归 加起来,确实非常慢 【10106.wang】

weizeng avatar Aug 25 '21 02:08 weizeng

用了latest版本访问,无论是mysql和h2版,当数据量级达到1w左右的时候,查询非常慢,单个文章的查询基本在5-6s加载完成。排查中导出数据到mysql,单个查询,速度并不慢【20-100ms】,我跟踪代码进去,单个文章的关联查询多,还会查询上一篇和下一篇的文章。每一个查询递归 加起来,确实非常慢 【10106.wang】

感谢问题的排查。性能优化问题将会是 1.5.x 的重点。

JohnNiang avatar Aug 25 '21 03:08 JohnNiang

/reopen

这个问题还没有彻底根治,所以我重新打开它。

JohnNiang avatar May 05 '22 01:05 JohnNiang

@JohnNiang: Reopened this issue.

In response to this:

/reopen

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository.

f2c-ci-robot[bot] avatar May 05 '22 01:05 f2c-ci-robot[bot]