CKB Explorer性能优化记录 #15
ShiningRay
started this conversation in
Show and tell
Replies: 1 comment 1 reply
-
@shaojunda 了解之前这两个查询是如何规避了性能问题的吗 |
Beta Was this translation helpful? Give feedback.
1 reply
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
本周我进行了ckb explorer的服务器迁移工作。原本以为这个事情花不了多久,实际却出现了很多预想不到的情况,结果让我搞了好几天,每天都搞到凌晨。
首先,测试网ckb explorer数据库dump出来有250多G之巨,下载和导入便用了半天(6小时以上)的时间。
在部署了ckb explorer的服务器端应用并在线复核的时候,各种奇怪的性能问题便出现了。
比如区块同步进程启动之后几乎不跑。某些页面链接无法加载成功等等。
最初我认为是数据库服务器的配置不足,首先将数据库的配置和磁盘iops提升到了一个比较高的水平,然而问题依旧存在。
之后我将原有的
sentry-raven
gem升级到了最新的sentry-rails
,新版本的sentry支持性能统计,可以分析出很多东西。同时我也在访问了一些页面,并且观察rails的日志,发现有些请求的处理时间长达十几分钟,甚至个别超过了1个小时。经过sentry的数据收集之后,发现大量的时间花费在了一些数据库的查询上。
这时候定位就越来越清晰了,是因为数据库表过大,一些查询未能有效使用索引产生了一些不恰当的扫描导致时间过程。
我从Sentry中找到了几个较慢的事务:
Api::V1::BlockTransactionsController#show
和Api::V1::AddressTransactionsController#show
以及在NodeProcessor
的同步进程,从其中分别找出了有和
等非常缓慢的 SQL 查询。
这些长时间的查询集中在
ckb_transactions
表和cell_outputs
表,这两个表分别有 16,454,581 条 和 51,241,776 条记录,12GB和15GB数据。我通过对这两个SQL进行 explain,可以发现postgres都采用了主键索引进行全局扫描,并没有使用最佳的索引去查找,如:
实际上,在
ckb_transactions
上存在有index_ckb_transactions_on_block_id_and_block_timestamp
索引可以缩小搜索范围,然而却没有被使用。前面的SQL如果去掉order by id
,pg才会使用index_ckb_transactions_on_block_id_and_block_timestamp
而不是 id 。另外一个 cell_outputs 也是类似的情况。
根据我对MySQL的了解,这种情况可以使用 index hint 来强制 MySQL 采用特定索引进行查询。
原先的postgres是nervos的运维同学通过ECS自建的,使用的是pg 12。而我选择了AWS的RDS,版本是13。
由于对postgres不熟,我查询了相关资料,发现postgres并不支持在查询中指定要使用的索引,索引的选择全部由postgres内置的智能判断算法决定。
为了能强制postgres使用正确的索引,对于 ckb_transactions 的查询,我在where条件中将 index_ckb_transactions_on_block_id_and_block_timestamp 涉及的两个字段
block_id
和block_timestamp
全部加上了问题便得到了解决。
explain也显示了使用了正确的索引:
而在接口和区块同步进程中,我将原本在数据库端进行排序的查询,改成一次性将相关数据全部读取过来,并且在应用层进行排序
如
cell_outputs.limit(10).order(:id)
改成了
Rails 中
.find_each
这个方法是内置了一个 id 的游标进行分段的记录遍历。为了满足索引的需求,改成了to_a.each
。在这些地方去掉了
order by id
之后,pg便可以正确使用相关索引减少查询范围,提升了性能。虽然这可能导致网络通信的增加和本地计算量和内存占用,但是可以未来也可以通过一些方式,分散到不同的服务器上进行计算,减轻数据库的压力。
目前看来效果不错,但是由于对pg不了解,我不太理解为什么原来的 ckb explorer 则没有类似问题,希望有对pg熟悉的大佬指点指点
Beta Was this translation helpful? Give feedback.
All reactions