【问题标题】:Slow ipython --pylab and ipython notebook startupipython --pylab 和 ipython notebook 启动慢
【发布时间】:2013-09-29 09:35:56
【问题描述】:

我已从 ipython 0.10 切换到 1.1.0。现在我正在经历非常烦人的启动过程缓慢。

虽然单独的ipython 仍然很快启动,但ipython --pylab 的启动速度非常慢,即~8 secs(在 Intel(R) Core(TM)2 Duo CPU P9500 @ 2.53GHz 系统上)甚至更何况是我在 ipython 0.10 中没有的新 ipython notebook,即 ~12 secs

当我执行strace -o tessi.txt -tt ipython --pylab 时,我至少可以识别出似乎是造成大部分延迟的部分。非常欢迎任何有关摆脱这些问题的帮助。

对于--pylab 选项,strace 的输出包含一个部分,它会蚕食~5 secs,并且在仅启动 ipython 时不存在,即

10:23:24.331968 stat("/etc/resolv.conf", {st_mode=S_IFREG|0644, st_size=868, ...}) = 0
10:23:24.332028 socket(PF_FILE, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 9
10:23:24.332074 connect(9, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = 0
10:23:24.332152 sendto(9, "\2\0\0\0\4\0\0\0\35\0\0\0MYHOST.DOM.AIN."..., 41, MSG_NOSIGNAL, NULL, 0) = 41
!! -> 10:23:24.332227 poll([{fd=9, events=POLLIN|POLLERR|POLLHUP}], 1, 5000) = 1 ([{fd=9, revents=POLLIN|POLLHUP}])
!! -> 10:23:29.336301 read(9, "\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 32) = 32
10:23:29.336533 close(9)                = 0
10:23:29.336839 close(7)                = 0

我用MYHOST.DOM.AIN替换了我的实际主机名

ipython notebook 的情况下,似乎基本上有两个这样的区域。第一个似乎与ipython --pylab 相同。第二个带走另一个~4 secs

10:39:31.823298 stat("/etc/resolv.conf", {st_mode=S_IFREG|0644, st_size=868, ...}) = 0
10:39:31.823358 socket(PF_FILE, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 9
10:39:31.823405 connect(9, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = 0
10:39:31.823499 sendto(9, "\2\0\0\0\4\0\0\0\35\0\0\0MYHOST.DOM.AIN."..., 41, MSG_NOSIGNAL, NULL, 0) = 41
!! -> 10:39:31.824166 poll([{fd=9, events=POLLIN|POLLERR|POLLHUP}], 1, 5000) = 1 ([{fd=9, revents=POLLIN|POLLHUP}])
!! -> 10:39:36.827298 read(9, "\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 32) = 32
10:39:36.827503 close(9)                = 0
10:39:36.827828 close(7)                = 0    

10:39:38.591774 setsockopt(6, SOL_TCP, TCP_NODELAY, [0], 4) = 0
10:39:38.591922 poll([{fd=3, events=POLLIN}, {fd=4, events=POLLIN}, {fd=6, events=POLLIN}, {fd=7, events=POLLIN}], 4, 0) = 0 (Timeout)
10:39:38.592007 poll([{fd=3, events=POLLIN}, {fd=4, events=POLLIN}, {fd=6, events=POLLIN}, {fd=7, events=POLLIN}], 4, 0) = 0 (Timeout)
!! -> 10:39:38.592049 poll([{fd=3, events=POLLIN}, {fd=4, events=POLLIN}, {fd=6, events=POLLIN}, {fd=7, events=POLLIN}], 4, 3600000) = ? ERESTART_RESTARTBLOCK (To be restarted)
!! -> 10:39:42.355658 --- SIGINT (Interrupt) @ 0 (0) ---
10:39:42.355773 write(5, "\0", 1)       = 1
10:39:42.355916 rt_sigreturn(0x2)       = -1 EINTR (Interrupted system call)
10:39:42.356113 rt_sigaction(SIGINT, {0x7f26dc0fbfc6, [], SA_RESTORER, 0x7f26dbe5a2d0}, {0x7f26dc0fbfc6, [], SA_RESTORER, 0x7f26dbe5a2d0}, 8) = 0
10:39:42.356672 clone(child_stack=0x7f26cfb49ff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7f26cfb4a9d0, tls=0x7f26cfb4a700, child_tidptr=0x7f26cfb4a9d0) = 11084

欢迎任何有关如何摆脱这些延迟的帮助。

最后,趁我还在的时候。当我查看 strace 的剩余输出时,我看到,在启动时,ipython 尝试在我天真地认为它不应该这样做的地方打开很多“python 相关”文件,而我的系统 python 肯定没有安装?所有这些许多公开调用都失败了。例如:

11:11:26.465594 open("/opt/intel/composerxe-2011.3.174/compiler/lib/intel64/tls/libpython2.7.so.1.0", O_RDONLY) = -1 ENOENT (No such file or directory)
11:11:26.465646 stat("/opt/intel/composerxe-2011.3.174/compiler/lib/intel64/tls", 0x7fff0efb0100) = -1 ENOENT (No such file or directory)

or

11:11:26.468293 stat("/usr/local/lib/vtk-5.4/tls/x86_64", 0x7fff0efb0100) = -1 ENOENT (No such file or directory)
11:11:26.468347 open("/usr/local/lib/vtk-5.4/tls/libpython2.7.so.1.0", O_RDONLY) = -1 ENOENT (No such file or directory)

这些调用的总时间弥补了剩余启动缓慢的另一重要部分,但我无法指出具体的时间段。知道如何减少这些调用吗?

【问题讨论】:

标签: python performance ipython


【解决方案1】:

1) 我建议不要以--pylab 开头,我们鼓励人们在开始后使用%matplotlib。使用--pylab 时启动的开销很可能是由于导入了我们无权访问的包。例如,在 ArchLinux 上存在错误,其中每个 ipython --pylab 占用数百 MB,因为内存泄漏不在 IPython 代码中。

对套接字的访问仍然看起来很奇怪,确切地知道它的来源可能会有所帮助。

2) 使用笔记本的第二个可能是由于 ZMQ 以及通过 localhost 上的套接字开始的一些通信。我们知道在某些情况下可能需要一些时间,但我们还需要找出代码的哪一部分执行起来很慢。 Notebook 还启动了一个网络服务器,因此可以进行网络操作。

3) 可能是由于我们使用了一些库,我们没有在 ipython 中显式打开此类。特别是VTK。您有加载特定内容的配置文件吗?

您可以尝试在 IPython 跟踪器上打开一个问题,但我们可能会要求您更深入地了解 ipython 中需要花费这么多时间的 python 调用。启动时间的问题在核心开发者之间已经问过了。

大家一致认为这将是“最大努力”,但我们绝对是一个太小的团队,无法将其作为优先事项。与 vbech 之类的工具集成来跟踪回归仍然会很好,如果有人有动力深入研究慢速调用,我们将很高兴尽最大努力改进。

【讨论】:

  • ad 1 和 2) 如果 %matplotlib 可以帮助我解决 --pylab 问题,那么这对笔记本有什么帮助?特别是因为,如 strace 所示,50% 的 notebook 问题与 --pylab 的问题相同。您是否建议对于笔记本我将不得不接受〜12秒?广告 3) 不,我认为我没有加载 VTK 的配置文件。实际上,在将 ipython 0.11 与 1.1.0 交换后,我重新生成了我的个人资料。最后,你有什么线索吗?我用 strace 展示的这两个约 5 秒的中途停留是什么?
  • 哦,我读得太快了,我以为你是在比较 ipython --pylabipython notebook --pylab 因此共享时间问题,这很奇怪。我对大约 12 秒的笔记本并不感到惊讶,因为您必须生成一个不那么小的网络服务器,但是一旦它生成,它可能会存活数天。但我知道这可能很烦人。当 wifi 在某些操作系统上处于活动状态时(由于网络响应缓慢),我们在监听 LOCALHOST 时遇到了一些问题,但是上游问题,我们真的无能为力。
【解决方案2】:

请参阅https://github.com/ipython/ipython/issues/4298 了解本期的其余内容

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    相关资源
    最近更新 更多