我们有一堆java REST服务,它们使用本地数据库来处理各种用例。我们注意到,在对这些服务进行压力测试时(20个并发客户端发出各种请求),一些请求(大约10个中的10个)需要大约5-10秒,而平均值为50-100毫秒。
我已将问题分解为数据库操作。这些都是小/空表上非常简单的操作。所以,我已经完成以下工作以获取更多信息:
setMaxWait
设置为1秒,以便捕获池队列问题。没有异常被抛出。deadlock_timeout
设置为200毫秒,并在 postgresql.conf 文件中启用log_lock_waits
,以便捕获是否存在任何锁定原因。我在postgresql中看不到这样的日志。启用并将log_min_duration_statement
设置为1500毫秒,以确保数据库操作确实是原因。示例(此时gce_resolver
是一个空表):
2017-08-09 10:15:21 CEST LOG时长:1597.000 ms bind:/ * SiteDao.getAllGceResolvers * / SELECT * FROM gce_resolver ORDER BY name
听起来不相关,但只是确定,通过将其设为log_autovacuum_min_duration
启用0
。在压力测试时没有产生相关的日志。
已启用auto_explain
并将auto_explain.log_min_duration
设置为1000,将auto_explain.log_verbose
设置为on
。样本:
2017-08-09 10:20:59 CEST LOG: duration: 2881.699 ms plan:
Query Text: /* UserLicenseDao.insertLicense */ INSERT INTO user_license (user_dn, created) VALUES ($1, $2)
Insert on public.user_license (cost=0.00..0.01 rows=1 width=0)
-> Result (cost=0.00..0.01 rows=1 width=0)
Output: NULL::integer, 'CN=user172,OU=local'::text, '2017-08-09 10:20:56.153'::timestamp without time zone
这是一个非常简单的插入,看起来像成本很少,但出于某种原因不知怎的花了将近3秒。现在我没有想法了。什么可能导致这种延迟?为什么有时呢?
PostgreSQL 9.4.12