From: Jakob B. <jak...@ce...> - 2011-05-31 20:16:33
|
Hi, I have a Fuse module based on libfuse which is an almost read-only file system. "Almost" means it stays untouched for a couple of hours, but then it might cache atomically and significantly (new file system snapshot). For performance reasons I'd like to use the kernel dentry/inode cache (entry_timeout, negative_timeout, ...), for instance with a 1 minute time to live. Unfortunately, once a new file system snapshot is served by the Fuse module, there might still be some old entries served directly from the kernel cache. Is there a way to manually drop all file system buffers connected to the Fuse module's file system? I know I can use /proc/sys/vm/drop_caches, but that drops all caches from all file systems. The fadvise system call would be for the page cache of a specific file. If there is an option to temporarily disable the dentry/inode cache from inside the Fuse module, I could turn off caching and "drain out" the file system and only then apply the new file system snapshot. Of course I can also just sleep in the Fuse module until the caches are expired for sure, but I'd really like to do something better. Is there something in libfuse that could solve the problem? Cheers, Jakob |
From: Christian T. <ct...@pi...> - 2011-06-01 01:14:12
|
Am Tue, 31 May 2011 22:16:14 +0200 schrieb Jakob Blomer <jak...@ce...>: > Hi, > > I have a Fuse module based on libfuse which is an almost read-only > file system. "Almost" means it stays untouched for a couple of > hours, but then it might cache atomically and significantly (new file > system snapshot). For performance reasons I'd like to use the kernel > dentry/inode cache (entry_timeout, negative_timeout, ...), for > instance with a 1 minute time to live. > > Unfortunately, once a new file system snapshot is served by the Fuse > module, there might still be some old entries served directly from > the kernel cache. > > Is there a way to manually drop all file system buffers connected to > the Fuse module's file system? I know I can > use /proc/sys/vm/drop_caches, but that drops all caches from all file > systems. The fadvise system call would be for the page cache of a > specific file. If there is an option to temporarily disable the > dentry/inode cache from inside the Fuse module, I could turn off > caching and "drain out" the file system and only then apply the new > file system snapshot. Of course I can also just sleep in the Fuse > module until the caches are expired for sure, but I'd really like to > do something better. Is there something in libfuse that could solve > the problem? for normal filesystems you can remount without any new options 'mount -o remount /mountpoint' this might work in your case too. I also barely remember that recent kernels (.38 or .39) got some syscall for syncing a filesystem, I have no idea if that can be used to drop caches selectively, take this just as hint, maybe you find some infos about that. Christian > > Cheers, > Jakob > > ------------------------------------------------------------------------------ > Simplify data backup and recovery for your virtual environment with > vRanger. Installation's a snap, and flexible recovery options mean > your data is safe, secure and there when you need it. Data protection > magic? Nope - It's vRanger. Get your free trial download today. > http://p.sf.net/sfu/quest-sfdev2dev > _______________________________________________ > fuse-devel mailing list > fus...@li... > https://lists.sourceforge.net/lists/listinfo/fuse-devel |
From: Miklos S. <mi...@sz...> - 2011-06-01 13:55:50
|
Christian Thaeter <ct...@pi...> writes: > Am Tue, 31 May 2011 22:16:14 +0200 > schrieb Jakob Blomer <jak...@ce...>: > >> Is there a way to manually drop all file system buffers connected to >> the Fuse module's file system? I know I can >> use /proc/sys/vm/drop_caches, but that drops all caches from all file >> systems. The fadvise system call would be for the page cache of a >> specific file. If there is an option to temporarily disable the >> dentry/inode cache from inside the Fuse module, I could turn off >> caching and "drain out" the file system and only then apply the new >> file system snapshot. Of course I can also just sleep in the Fuse >> module until the caches are expired for sure, but I'd really like to >> do something better. Is there something in libfuse that could solve >> the problem? On the low-level interface there's fuse_lowlevel_notify_inval_inode() which may be used to drop the caches for a single inode. If the filesystem keeps track of which inode may have caches then it can iterate through those and call this function. > for normal filesystems you can remount without any new options 'mount -o > remount /mountpoint' this might work in your case too. "mount -oremount" will drop unused dentries together with the caches. But this is only a side effect and not guaranteed to work. > I also barely remember that recent kernels (.38 or .39) got some > syscall for syncing a filesystem, I have no idea if that can be used > to drop caches selectively, take this just as hint, maybe you find > some infos about that. The new syncfs() syscall can only sync the filesystem, it cannot be used to drop the caches. Thanks, Miklos |