使用fanotify监听execve时,/etc/ld.so.cache事件延迟原因咨询
以下是可能导致该现象的几个核心原因:
动态链接器的延迟加载逻辑
动态链接器ld-*.so在execve执行后,不会立刻读取/etc/ld.so.cache。它会先完成自身初始化、加载核心依赖库(如libc.so),只有当进程需要查找非核心依赖库时,才会触发对ld.so.cache的读取操作。如果进程在启动后一段时间内没有加载这类非核心库,对应的FAN_OPEN_PERM事件就会延迟出现。FAN_OPEN_PERM的同步阻塞特性
FAN_OPEN_PERM属于同步权限事件:内核生成该事件后,对应的open系统调用会被阻塞,直到用户空间程序向fanotify描述符写入struct fanotify_response允许/拒绝操作。如果你的监听程序处理ld-*.so的权限请求时出现长时间阻塞(比如等待锁、IO超时),动态链接器后续的所有操作(包括读取ld.so.cache)都会被卡住,直到你回复完之前的请求,才会触发后续的open事件。系统页缓存的间接影响
若/etc/ld.so.cache已被缓存到系统页缓存中,动态链接器可能通过mmap而非open访问它——而fanotify默认不监听mmap操作(需显式添加FAN_MMAP_PERM标记)。但如果缓存失效或动态链接器仍需触发open,则实际的open操作会被推迟到缓存无法命中时,导致事件延迟。Fanotify事件队列积压
如果监听程序没有及时消费事件队列,内核会暂存事件。当队列中积压大量其他事件时,ld.so.cache的FAN_OPEN_PERM事件会被排在队列后方,直到前面的事件被处理完毕,才会被用户程序接收到。
内容的提问来源于stack exchange,提问作者JenyaKh

