为什么使用postgres和spring batch时,查询速度逐渐变慢?

问题描述 投票:0回答:1

我正在使用Spring Batch 4.2.0和postgres (11.2)作为后台运行一项工作。这一切都被包裹在一个spring boot应用程序中。我有5个步骤,每个步骤都使用一个简单的分区策略,按id范围划分数据,并将数据读入每个分区(由不同的线程处理)。我的表中有大约18M行,每一步都会读取、修改一些字段,然后写回来。每一步读完18M行,再写回来。我面临的问题是,运行的查询把数据拉到每个线程中,按id范围扫描数据,比如。

select field_1, field_2, field_66 from table where id >= 1 and id < 10000.

在这种情况下,每个线程一次处理10_000行。当没有流量的时候,查询只需要不到一秒钟的时间就可以读完所有的10,000行。但是当作业运行时,大约有70个线程在读取所有这些数据。它逐渐变慢到差不多一分半钟,有什么想法可以从哪里开始排除这个问题?

我确实看到autovacuum几乎在整个作业期间都在后台运行。它绝对有足够的内存来保存所有的数据(大约6GB的最大堆)。Postgres有足够的shared_buffers 2GB,max_wal_size 2GB,但不确定这本身是否足够。我看到的另一件事是负载的 COMMIT 循环查询 pg_stat_activity. 通常与分区的数量一样多。所以,70个分区使用了70个连接,而不是70个分区使用了140个连接,其中70个连接在运行。COMMIT. 随着时间的推移,这些 COMMIT的速度也越来越慢。

spring postgresql spring-boot spring-batch hikaricp
1个回答
0
投票

你可能正在打 https:/github.comspring-projectsspring-batchissues3634。.

这个问题已经解决,并将成为计划在本周发布的4.2.3版本的一部分。

© www.soinside.com 2019 - 2024. All rights reserved.