fuse-python性能分析

3 投票
1 回答
2098 浏览
提问于 2025-04-16 12:05

我现在正在用fuse-python写一个文件系统,它已经能正常工作了。不过,挂载几周后,它变得明显慢了。所以我想对它进行性能分析。我知道有几个地方可以优化,但这些地方应该不是问题所在。

不过,fuse-python在某些情况下会陷入无限循环(可以查看fuse源代码的733和757行)。如果我在调试模式下运行fuse(使用-d选项),它会在前台运行。但是,我无法用SIGINTCTRL+C来停止它(这两者其实是一样的)。

我尝试使用signal模块在主线程中捕获信号,但这也不管用。有趣的是,一旦我用SIGKILL强制终止进程,我会在stdout上看到KeyboardInterrupt。而且,在SIGKILL之后,信号处理程序会按预期执行。

这对性能分析有影响。因为进程从来没有正常结束,cProfile就没有机会保存统计文件。

有没有什么想法?

1 个回答

8

在Python中,当你按下中断信号(比如Ctrl+C)时,它会安装一个处理程序,这个处理程序会引发一个叫做KeyboardInterrupt的异常。如果在调用fuse的主函数时,发现有一个非默认的信号处理程序,它就不会用自己的处理程序替换掉这个非默认的处理程序。通常情况下,它会调用fuse_session_exit来进行清理。但是,一旦你调用了fuse的主函数,KeyboardInterrupt就会被CFUNCTYPE的包装给吞掉,你是看不到这个异常的。

你有以下几种选择:

  • 按下Ctrl+\发送SIGQUIT信号,或者发送其他任何终止信号,除了SIGINT。不过这样做的话,fuse不会正常退出。
  • 在调用fuse的主函数之前,先安装默认的SIGINT信号处理程序,等你完成后再恢复原来的处理程序。

old_handler =signal(SIGINT, SIG_DFL)
# call main
signal(SIGINT, old_handler)

我强烈建议你换一个其他的绑定,fuse-python实在是太乱了,使用起来很麻烦。我在使用fusepy时运气不错,还提交了一些补丁。

当你能够在不使用未捕获信号的情况下终止你的FUSE实例时,Python的性能分析器就能正常保存统计数据了。

撰写回答