反链面板计算逻辑与性能问题

打开软件,不开反链面板,打开一个有上百个反链的文档后,使用正常,此时后台没有在计算反链。

然后打开一下反链面板,之后马上关上,过一会儿再打开一个有上百个反链的文档,理论上来说,这时候我没有打开反链面板,后台应该不会计算这个文档的反链,然而事实上,此时后台确实在计算反链,CPU 占用一直在 20% 以上,所有和引用块相关的功能都不能用,等到 CPU 占用降低到 5% 以下时,我打开反链面板,发现 200 个反链秒出现,说明当时后台确实在计算反链,这是不符合预期的。

此外另一个问题(与上面的问题无关),我开着反链面板,然后我依次点开 10 个文档,后台会依次计算这 10 个文档的反链,好像有 10 个计算任务的队列,得等这 10 个任务全部出队之后才会释放资源,那么,如果我在两个有几百个反链的文档之间反复点击,一下打开这个文档,一下打开另一个文档,那么这个队列将会入队一堆计算任务,假设我在两个文档之间反复点击 10 次,将会入队 20 个计算任务,假设计算两个文档的反链分别都需要 10 秒钟,那么将有 200 秒钟的时间资源被占用,这 200 秒钟 CPU 占用很高,且所有的引用块功能都用不了,处于“假死”状态,这是灾难级的性能问题,而且事实上,这 20 个任务的队列里面,只有最后 1 个任务是有用的,前 19 个任务都是没有意义的,在我打开另一个文档后,当前文档的反链计算任务完全可以直接终止。

1 操作
fangly 在 2021-11-23 11:04:23 更新了该帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 88250
    订阅者

    打开文档(动态加载块)也需要阻塞,不然数据可能不一致。

    2 回复
  • 其他回帖
  • 88250
    订阅者

    可能要记录一下数据是否变动,没有变动的话就不请求了。我们后面优化了看 Issue #3473 · siyuan-note/siyuan

    1 回复
  • fangly 1
    订阅者 作者

    偶尔假死的时间比较长,看了一下日志,有下面这个信息,是正常的吗?

    E 2021/11/24 16:36:59 block_query.go:111: sql query failed: SELECT id FROM blocks WHERE parent_id = ?%!(EXTRA *errors.errorString=sql: transaction has already been committed or rolled back)
    E 2021/11/24 16:38:02 block_ref_query.go:432: query scan field failed: sql: Rows are closed
    

    尤其是 query scan field failed: sql: Rows are closed 这一条,我发现自从更新 alpha2 之后,日志里面有不少。

    完整 log:

    log.zip

    顺带提一下,a2 经常出现反链面板第一条内容为空的情况(除了第一条,后面的内容都正常),“传递型”和“关联型”都出现过这种情况,刷新反链面板之后恢复正常,而且有点难复现 😂 :

    image.png

    1 回复
    2 操作
    fangly 在 2021-11-24 16:54:03 更新了该回帖
    fangly 在 2021-11-24 16:53:13 更新了该回帖
  • fangly
    订阅者 作者

    alpha2 事务实现改了之后我觉得舒服了很多,但反链面板的性能上我体验下来感觉还是有提升空间

    200 个反链的文档第一次加载的时候比 alpha1 快一些,但还是要差不多 8 秒钟才能加载出来,第一次加载时候的时间不知道能否再压榨得短一些 😂

    第一次 8 秒钟加载出来后,打开别的文档,再返回来,反链面板能秒出现,这部分应该是 alpha2 新优化的,这个非常舒服,我猜是检查了“数据是否变动”,没变动就不请求了?

    但是过几分钟后再打开这个有 200 个反链的文档又要 8 秒钟加载,这个几分钟我也不清楚是多久,有时候有的文档上百个反链几分钟后仍然秒加载,但有时候有的文档几分钟后又要好久才能加载(都没有修改过,没有数据变动),不知道这里是不是有 bug?

    1 回复
  • 查看全部回帖