句柄不回收,空间不释放

举报
大鱼炖海棠 发表于 2021/09/01 15:16:05 2021/09/01
【摘要】 关键字:         句柄不回收;空间不释放;deleted;磁盘满;磁盘使用率高;现象:         磁盘使用率高,df -h和du -sh查看数据目录,发现大小不同,差别很大。lsof查看发现有大量的文件处于deleted状态:这类文件分三种,按照下面命令可以统计这类不回收文件的数量1. base 目录下数据文件:lsof|grep deleted |grep base| wc ...
关键字:

         句柄不回收;空间不释放;deleted;磁盘满;磁盘使用率高;

现象:

         磁盘使用率高,df -h和du -sh查看数据目录,发现大小不同,差别很大。lsof查看发现有大量的文件处于deleted状态:

20210802-110155(WeLinkPC).png

这类文件分三种,按照下面命令可以统计这类不回收文件的数量

1. base 目录下数据文件:

lsof|grep deleted |grep base| wc -l

2. pg_xlog目录下的xlog文件;

lsof|grep deleted |grep pg_xlog| wc -l

3. cm和om目录下的各种目录文件,这类文件句柄查出来有很多重复的,一般情况不用处理;

通过lsof|grep deleted |grep '.log'| wc -l

规避措施:

1. base目录下数据文件和pg_xlog下xlog文件可以采用以下方法之一进行处理:

方法一:kill dn实例。具体操作步骤如下:

  • gsql 连接CN, 执行checkpoint;
  • 在空间不回收的实例上杀掉dn进程; 这里27620是上图中dn的进程号,实际操作请替换给对应的进程号:

         kill -9 27620

影响:kill DN实例会导致当前业务执行报错,请确认后操作;

方法二:在线清理句柄。具体操作如下:

  • 连接CN执行checkpoint;
  • 连接CN清理每个库的空闲连接:

        clean connection to all for database xxxx;

这里xxxx是数据库名称,通过 \l 命令可以查看当前所有数据库。对每个库都做同样的清理。

该动作知会清理idle连接,不影响业务。

  • 如果前面两步执行完,空间依旧不释放,说明可能存在长连接,连接空间不释放的实例,找出这些连接,全部杀掉即可。查询语句如下:

select now()-query_start as ctime, * from pg_stat_activity where state='idle' order by ctime desc;

杀语句方法:

select pg_terminate_backend(pid) from pg_stat_activity where state='idle' order by ctime desc;

2. cm和om日志,这部分使用空间不大,一般只有几十MB,可以不用处理。但是部分异常情况下,日志没有分割,导致占用空间比较大:

20210802-162316(WeLinkPC).png

规避措施分两步:

  • 查看om日志持续上涨的原因,这里27709是上图中的进程号,3是文件句柄:

tailf /proc/27709/fd/3

根据报信息找研发处理对应报错;

  • 清理存量数据

cat /dev/null > /proc/27709/fd/3

注释:该方法不会释放文件句柄,只是释放空间,并保证空间不会上涨。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。