Autovacuum 进程引起 SWAP 使用率高

今天上午监控人员反映一台数据库主机 SWAP使用率达到 48%, 需要关注;通常情况下 SWAP 使用率都比较低的,只有当可用内存用完的时候进程才会去申请SWAP的内存空间, 下面是操作日志。

内存使用情况

1
2
3
4
5
[postgres@logdb](mailto:postgres@logdb)-> free -m  
total used free shared buffers cached
Mem: 24104 24031 72 0 3 6411
-/+ buffers/cache: 17616 6487
Swap: 16386 8588 7797

Mem: 24G,几乎用尽; Swap: 16G,用了8.5G, 使用率 50%左右;那什么进程用了这么多内存呢?

查找内存消耗 TOP 进程

top命令查找消耗内存的进程

1
2
3
4
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND  
5821 postgres 14 -1 26.2g 16g 26m S 0.0 70.0 313:02.00 postgres: autovacuum launcher process
32161 postgres 14 -1 1473m 1.3g 1.3g S 0.3 5.4 558:48.77 postgres: community community 192.168.169.42(36625) idle
32167 postgres 14 -1 1473m 1.3g 1.3g S 0.0 5.4 559:08.57 postgres: community community 192.168.169.42(36638) idle

第一个进程引起了我的注意,是 PostgreSQL 的 “autovacuum” 进程,吃了16G的内存。

查看 Autovaccum 进程详细信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
postgres=# select query_start,current_query from pg_stat_activity where current_query !='<IDLE>';  
query_start | current_query
-------------------------------+----------------------------------------------------------------------------------------
2011-02-14 09:37:41.495117+08 | autovacuum: VACUUM myschema.tbl_user_login_log_p201010 (to prevent wraparound)
2011-02-14 09:33:49.798097+08 | autovacuum: VACUUM myschema.tbl_download_stat (to prevent wraparound)
2011-02-14 08:53:50.657176+08 | autovacuum: VACUUM myschema.tbl_register_log (to prevent wraparound)
2011-02-14 10:12:21.757808+08 | select query_start,current_query from pg_stat_activity where current_query !='<IDLE>';
(4 rows)

myschema=> select pg_size_pretty(pg_relation_size('tbl_download_stat'));
pg_size_pretty
----------------
3550 MB
(1 row)

myschema=> select pg_size_pretty(pg_relation_size('tbl_user_login_log_p201010'));
pg_size_pretty
----------------
5115 MB
(1 row)

myschema=> select pg_size_pretty(pg_relation_size('tbl_register_log'));
pg_size_pretty
----------------
1763 MB
(1 row)

发现有三张表在做 vacuum, 并且这三张表都有点大;根据query_start来看,有个VACUUM进程也做了有两小时了, 几G的表正常情况下也应该完成了,为什么还在跑呢?

监控

上午一直在监控,到了下午的时候发现 SWAP 空间使用率依然保持不变,但 autovaccum 进程依然还在跑;猜想 autovacuum 进程可能有异常,后来将上面现象请教德哥,德哥回复可能 OS SWAP 换页有异常,建议将 PostgreSQL 的 autovaccum 进程杀掉,它会自动重起;后来通过 pg_terminate_backend()将 vaccum 进程杀掉后,SWAP空间果然释放。

查看 SWAP 使用情况

1
2
3
4
5
[postgres@logdb](mailto:postgres@logdb)-> free -m  
total used free shared buffers cached
Mem: 24104 24033 70 0 94 20118
-/+ buffers/cache: 3820 20283
Swap: 16386 53 16333

总结

autovaccum 进程长时间未完成的原因尚不明确,今天将以上现象,经验记下,供参考。

原创文章,作者:3628473679,如若转载,请注明出处:https://blog.ytso.com/tech/database/236362.html

(0)
上一篇 2022年1月24日 21:27
下一篇 2022年1月24日 21:27

相关推荐

发表回复

登录后才能评论