在Linux环境下,你有没有遇到过文件被删除但空间还没有释放的情况?本篇小文将介绍这个问题的一个场景以及相应的解决方案。我们的一台应用服务器,操作系统是RedHatLinux,监控告警,/opt/applog文件系统使用率超过阈值,整体容量50G,但是发现实际文件容量是20G,剩下的30G是多少空间?我们知道,在Linux环境中,一切都以文件的形式存在。系统在后台为每个应用程序分配一个文件描述符,为应用程序与操作系统的交互提供一个通用的接口,既然是文件,就会占用空间。这时候可以使用lsof命令,它可以列出系统当前正在打开的文件。>lsofCOMMANDPIDUSERFDTYPEDEVICESIZE/OFFNODENAME...filebeat111442app1rREG253,32097152291040407/opt/applog/E.20171016.info.012.logfilebeat111442app2rREG253,3209715254385080/opt/applog/E.20171015.info.001.log(deleted)表头各字段,含义如下:COMMAND:进程名PID:进程标识符USER:进程所有者FD:文件描述符,应用程序通过文件描述符来识别文件。如cwd、txt等TYPE:文件类型,如DIR、REG等DEVICE:指定磁盘的名称SIZE:文件的大小NODE:索引节点(文件在磁盘上的标识)NAME:可以看到打开的文件的确切名称,有一些行,NAME标识(deleted)/opt/applog/E.20171015.info.001.log(deleted),表示文件已经被删除已删除,但打开文件的句柄尚未关闭。再看COMMAND的名字是filebeat,USER进程的属主是app,也就是我们的日志收集进程,app用户启动filebeat进程。插入日志采集平台传统的开源日志平台即ELK,由三个开源工具组成:ElasticSearch、Logstash和Kiabana,其中:Elasticsearch是一个开源的分布式搜索引擎,分布式、零配置、自动发现、自动化索引分片、索引复制机制、restful风格接口、多数据源、自动搜索加载等。Logstash是一个开源的收集工具,可以收集、过滤、存储日志以备后用。Kibana是一个开源的图形化Web工具,为Logstash和ElasticSearch提供了一个日志分析友好的Web界面,可以汇总、分析和搜索重要的数据日志。常见的部署图,如下图,上面说的filebeat是什么?和ELK有什么关系?因为logstash是jvm运行的,资源消耗比较大,所以作者后来在golang中写了一个功能比较少但是资源密集型的消耗较少的轻量级logstash-forwarder。然而,作者只是一个人。加入http://elastic.co后,因为es公司自己收购了另一个开源项目packetbeat,而这个项目专门用golang,有一整个团队,所以es公司干脆把logstash-forwarder的开发也合并了进入同一个golang团队,所以新项目叫做filebeat。简单的说,filebeat就是日志收集的进程代理,负责收集应用日志文件。对于我上面的问题,之所以出现大量(已删除)和未释放的文件句柄,还有一个背景,就是由于磁盘空间非常有限,临时添加了一个任务,12小时前的日志每小时删除一次,也就是说,定时任务会自动删除此时filebeat正在打开的一些文件,所以这些文件就变成了未释放文件,所以实际文件被删除了,但是空间没有释放。解决方案一:为了快速释放占用的空间,最直接的方法是kill-9filebeat进程,此时空间就会被释放。但这不是根本的解决办法。定时任务也会删除这些filebeat打开的文件,导致空间满。方案二:filebeat的配置文件filebeat.yml其实有两个参数:close_older:1h说明:closeolder关闭比close_older更长时间没有被修改的文件handler。可以使用2h(2小时)、5m(5分钟)等时间字符串。即如果某个文件在一定时间内没有更新,则被监视的文件句柄将被关闭。默认值为1小时。force_close_files:false说明:一旦文件名更改,此选项将关闭文件。仅建议在Windows上使用此配置选项。Filebeat使它正在读取的文件保持打开状态。这可能会在删除文件时导致问题,因为在Filebeat关闭读取之前,文件不会被完全删除。Filebeat在ignore_older之后关闭文件处理程序。在此期间不能创建具有相同名称的新文件。另一方面,打开此功能可能会导致旋转文件上的数据丢失。文件旋转后可能会跳过新文件的开头,因为读取从末尾开始。我们建议将此选项保留为false,但降低ignore_older值以更快地释放文件。即当文件名发生变化,包括重命名和删除时,一个文件会自动关闭。结合这两个参数,根据应用需求,如果一个文件在30分钟内没有更新,需要关闭句柄,重命名或删除文件,满足句柄close_older:30m??force_close_files:true即可。Filebeat会定期收集日志并删除历史文件。这两项任务的基本要求。
