最近在做一个linux上的文件监控程序,2.6内核提供了inotify机制,这仅仅是个机制,任何策略都必须自己实现,这一点从inotify不提供递归接口就可以看出来,如果我实时监控到目录被创建,那么马上将这个新目录加入监控表,这个想法是最初的想法,也是最直接的想法,可是仔细推敲一下就会发现这个实现有问题,比如在检测到目录被创建到新目录添加到监控表的时间间隔内,新的子目录的文件事件以及目录事件将被遗漏,而且会像丝袜脱丝一样一发不可收拾,新子目录内又创建了一个目录没有被监控到,那么这个子子目录内的事件将递归的丢失,看来这个事情很严重,那么有没有办法呢?前面说了一种补救的办法,可是难度太大,没有必要,仔细想想这种丢失并不是频繁发生,只有在像cp -r或者tar快速创建目录时才会发生,既然我们没有办法实现补救方案,那么可以从进程执行这个大框架入手,如果我们可以让cp或者tar在监控程序加入新目录之前不执行就可以了,于是可以通过优先级来实现,将监控程序设置为实时FIFO优先级就可以了。当文件系统的系统调用执行完,inotify开始执行的时候,最后会wake up等待inotify描述符的监控进程,而在系统调用返回用户空间的时候会检查need_sched标志位,因为监控进程是实时调度类,优先级是很高的,因此必定会抢占当前的文件操作的进程,可是在多cpu上怎么能保证这个文件操作进程不被调度到别的cpu上呢?说实话,不能,于是有了下面的解决方案。

文件同步方案已经找到,还是用inotify,利用inotify-tools工具的inotifywait程序对目录进行监控,并且实时加入新创建的子目录,为了避免遗漏,我的做法是:

单cpu方案:

解决办法:将监控进程的优先级设置为FIFO实时优先级,根据inotify的内核实现和2.6内核的进程调度原理(根据是2.6.X的内核源代码),实时优先级的监控进程总是可以在新子目录创建文件前首先加入该子目录,这样就不会遗漏了。

多cpu方案:

问题:因为在多cpu的情况下,即使将监控进程设置为FIFO的实时进程,那么还是可能将cp -r或者tar等快速创建子目录和文件的进程调度到别的cpu,从而和我们的监控进程构成竞争最终造成事件遗漏。

解决办法:将监控进程分解为多个线程,每个cpu绑定一个线程,这些线程共享一个inotify描述符,这样就不会造成读取的事件重复。如此一来,在新目录被添加以后,每个cpu上的均会运行实时FIFO线程,从而把任何非实时进程的执行拦截。在多cpu上,实际只要有一个文件操作,就会唤醒所有cpu上的监控进程,这是靠ipi(处理器间中断)实现的。

效果:经过测试,发现没有遗漏。

仍然具有的问题:从内核源代码来看,如果没有将内核编译成内核抢占,那么还是有可能遗漏,只不过这种可能性非常之小,我用tar和cp -r没有测试出来。

虽然每个cpu一个监控进程解决了大致框架问题,但是又引入了新的问题,怎么处理这么多的进程间的通信,inotifywait是用红黑树实现的文件索引,那么多的线程肯定会打乱红黑树的,于是又有了新的想法。想想看设置多个线程,每个cpu一个线程的原因就是靠这些线程的优先级是实时FIFO来阻止新目录加入监控表前的文件操作,于是我们只要保证一个cpu上进行实际工作,别的cpu上的线程不做任何监控,只是一个桩就可以了,现在问题就是这个桩怎么设计,很简单,办法有两个,一个就是在别的cpu的线程随便实现一个无限的等待循环,另一个方案就是在别的cpu上执行inotify描述符的select而不做read,这种方案一定可以,相信我没错的。

本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1273972

基于inotify的文件监控方案相关推荐

  1. 基于 eBPF 的 prometheus 监控方案

    基于 eBPF 的 prometheus 监控方案 1. 前言 2. ebpf_exporter 环境搭建 3. Prometheus 与 Grafana 配置 4. ebpf_exporter 代码 ...

  2. 主流K8S集群监控方案

    Prometheus 什么是Prometheus Prometheus是一套开源的监控系统.报警.时间序列的集合,最初由SoundCloud开发,后来随着越来越多公司的使用,于是便独立成开源项目.自此 ...

  3. PHP Linux监控文件变化,文件监控与通知机制 audit inotify

    什么是auditThe Linux Audit Subsystem is a system to Collect information regarding events occurring on t ...

  4. Inotify与Android文件监控FileObserver原理

    Inotify: 高效.实时的Linux文件系统事件监控框架 概要 - 为什么需要监控文件系统? 在日常工作中,人们往往需要知道在某些文件(夹)上都有那些变化,比如: 通知配置文件的改变 跟踪某些关键 ...

  5. 基于时序数据库做监控,这里有超流行的开源方案

    点击上方"朱小厮的博客",选择"设为星标" 回复"666"获取新整理的1000+GB资料 在微服务架构下,我们对服务进行了拆分,所以用户的每 ...

  6. 基于工业4g网关的危化品运输车监控方案

    工业的发展立足于各种各样原材料的加工和应用,而其中就包括一些油料.化学品和易燃易爆货物,针对此类货物的运输,需要着重关注其安全性和稳定性,否则就容易造成严重的人身和财产损失. 得益于物联网技术的发展, ...

  7. linux 监控微信通知,一个 Linux 下基于 Bash 的文件和数据库监控及备份工具,可发送微信报警通知...

    shellMonitor 一个 Linux 下基于 bash 的文件和数据库监控及备份工具. 写这个工具的原因,在于一个朋友的一个小电商网站,因为未明原因被黑了,总是会被增加超级管理员,并将收款账号改 ...

  8. 基于 Prometheus 和 Zabbix 实现容器云平台整体监控方案

    一. 概述 容器云成为IT的主要基础设施平台,以Docker为代表的容器技术,加上以Kubernetes为代表的容器编排技术,是目前最流行的容器云建设方案.云平台的特点是快速部署.弹性伸缩.动态调整. ...

  9. 在微服务架构下基于 Prometheus 构建一体化监控平台的最佳实践

    欢迎关注方志朋的博客,回复"666"获面试宝典 随着 Prometheus 逐渐成为云原生时代的可观测事实标准,那么今天为大家带来在微服务架构下基于 Prometheus 构建一体 ...

最新文章

  1. es6学习笔记8--Map数据结构
  2. 学以致提高学生操作计算机能力,【学以致用】提供学习平台,提升学生实际应用能力...
  3. 做事范围是多么多么重要
  4. 本地文件与服务器传输,云服务器 与本地文件传输
  5. vue.js+socket.io打造一个好玩的新闻社区
  6. 使用NAT实现TCP负载均衡
  7. d3.js 封装一个方法更新柱状图,运用数据模板
  8. 自然语言处理NLP常用开源/免费工具
  9. springboot整合Mybatis提示org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
  10. 《Spring实战》第一章 — Spring之旅
  11. (66)SPI外设驱动发送驱动(五)(第14天)
  12. 如何制作一款HTML5 RPG游戏引擎——第五篇,人物人物特效
  13. SPSS缺失值处理【SPSS 009期】
  14. 2.1KaliLinux的安装
  15. 用户解锁不存在_“sim卡无效,显示lte,电信掉3g,通讯录+86”等出现在卡贴“tmsi解锁模式”中的解决方法...
  16. 关于 DRM 中 DUMB 和 PRIME 名字的由来
  17. 用C#WebClient+Server酱写一个监听网站通知的功能
  18. Adobe Audition CC 2019 下载安装教程
  19. Blender:如何翻转UV
  20. 一,java虚拟机概述(什么是java虚拟机,为什么会产生java虚拟机,java虚拟机解决了什么问题)

热门文章

  1. 送书 | 你一定能看懂的算法基础书(代码示例基于Python)
  2. 习惯了收听虾米酷狗网易云音乐的你,好歹知道一下音乐推荐到底是咋回事吧
  3. 接私活渠道,你有技术,就有钱!
  4. 百度最近开源了分布式配置中心,名叫BRCC
  5. 和 杠精 聊Redis多线程 :(
  6. 如何设计一个牛逼的本地缓存
  7. Python数据处理入门教程!
  8. 欧卡智舶发布全球首个城市内河无人驾驶数据集!
  9. 我们与Datawhale的故事!
  10. 零的突破!双非高校教师荣获杰青!曾把自己P成女娲,登上学术期刊封面