分析fuse-python性能

3
我正在使用fuse-python编写一个文件系统,它已经实现了预期的功能。然而,几周后挂载后它变得明显缓慢,所以我想对其进行剖析。我知道一些可以优化的点,但这些不应该是罪魁祸首。
然而,fuse-python在一个无限循环中挂起(请参见 fuse源代码的733行和757行)。如果我使用-d开关在调试模式下运行fuse,则它将在前台运行。但是,我无法使用SIGINTCTRL+C停止它(这两个都是相同的)。

我试图使用 signal 模块来捕获主线程中的信号。但这也无法正常工作。有趣的是,一旦我用 SIGKILL 结束进程,我就会在 stdout 上看到 KeyboardInterrupt 异常。同时,在执行 SIGKILL 之后,信号处理程序将按预期执行。

这对性能分析产生了影响。由于进程从未正常终止,cProfile 永远没有机会保存统计文件。

有什么想法吗?


@matt:我还没有机会去处理它。我简要地阅读了你的答案,看起来很不错。我告诉自己只接受我确实检查和验证过的答案。在接下来的几周里,我会尽力而为。由于这只是一个非常低优先级的项目,我在业余时间里没有太多时间来处理它。性能和分析目前并不是我关注的重点。 - exhuma
1个回答

8

Python会安装一个处理程序,在SIGINT上引发KeyboardInterrupt。如果在fuse的主函数被调用时检测到非默认信号处理程序,则不会替换其自己的处理程序,这通常会调用fuse_session_exit清理工作。在调用fuse的主函数之后,KeyboardInterrupt会被CFUNCTYPE包装程序吞噬,您永远看不到它们。

你的选择是:

  • 通过按下Ctrl+\,或任何其他终止信号而发送SIGQUIT。但是,fuse将无法正常退出。
  • 在调用fuse的主函数之前安装默认的信号处理程序到SIGINT,并在完成后恢复原始信号处理程序。

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

我强烈建议您转换到另一种绑定,因为fuse-python非常混乱且难以使用。 我在fusepy上运气很好,并提交了一些补丁。
当您能够在不使用未捕获信号的情况下终止FUSE实例时,Python分析器将能够像平常一样保存统计信息。

感谢您提到 fusepyfuse-python 的确非常混乱。我曾经试图深入了解代码两次,但再也没有看过它 ;) 我将首先更改我的代码以使用 fusepy。然后我会再次查找性能分析... - exhuma
@exhuma:在经过一段时间的重度使用后,我已经将fusepy适应了我的绑定。您可以在此处阅读最新版本:http://code.google.com/p/cpfs/source/browse/python/fuse.py 如果有价值的话,我会将其剥离出来,进行文档化,并为其创建一个独立的项目。 - Matt Joiner
你有某种变更日志吗?变更的快速摘要?我会下载它,一旦我有时间,我会做一个diff。但是一个快速的变更日志仍然会很有帮助 ;) - exhuma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接