基于inotify的文件监控方案

2024-02-24 05:08
文章标签 监控 方案 inotify

本文主要是介绍基于inotify的文件监控方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近在做一个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,这种方案一定可以,相信我没错的。

这篇关于基于inotify的文件监控方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/741016

相关文章

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

通过prometheus监控Tomcat运行状态的操作流程

《通过prometheus监控Tomcat运行状态的操作流程》文章介绍了如何安装和配置Tomcat,并使用Prometheus和TomcatExporter来监控Tomcat的运行状态,文章详细讲解了... 目录Tomcat安装配置以及prometheus监控Tomcat一. 安装并配置tomcat1、安装

Redis 多规则限流和防重复提交方案实现小结

《Redis多规则限流和防重复提交方案实现小结》本文主要介绍了Redis多规则限流和防重复提交方案实现小结,包括使用String结构和Zset结构来记录用户IP的访问次数,具有一定的参考价值,感兴趣... 目录一:使用 String 结构记录固定时间段内某用户 IP 访问某接口的次数二:使用 Zset 进行

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

MySQL分表自动化创建的实现方案

《MySQL分表自动化创建的实现方案》在数据库应用场景中,随着数据量的不断增长,单表存储数据可能会面临性能瓶颈,例如查询、插入、更新等操作的效率会逐渐降低,分表是一种有效的优化策略,它将数据分散存储在... 目录一、项目目的二、实现过程(一)mysql 事件调度器结合存储过程方式1. 开启事件调度器2. 创

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.

使用zabbix进行监控网络设备流量

《使用zabbix进行监控网络设备流量》这篇文章主要为大家详细介绍了如何使用zabbix进行监控网络设备流量,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录安装zabbix配置ENSP环境配置zabbix实行监控交换机测试一台liunx服务器,这里使用的为Ubuntu22.04(

springboot健康检查监控全过程

《springboot健康检查监控全过程》文章介绍了SpringBoot如何使用Actuator和Micrometer进行健康检查和监控,通过配置和自定义健康指示器,开发者可以实时监控应用组件的状态,... 目录1. 引言重要性2. 配置Spring Boot ActuatorSpring Boot Act

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也