今天上午监控人员反映一台数据库主机 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