【发布时间】:2012-06-09 14:54:59
【问题描述】:
我在更改 LD_LIBRARY_PATH 时有奇怪的副作用。
当我附加包含库的路径时,例如:
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/my_path/lib
然后,一切都变得异常缓慢。例如,一个简单的ls 可以长达 10 秒。
ldd 输出在LD_LIBRARY_PATH 更改之前和之后完全相同,我尝试使用strace 调试慢速ls 的执行:在这两种情况下我得到完全相同的执行。在ls 的执行过程中甚至不会卡住(因为strace 在10 秒的延迟期间没有输出任何东西,然后突然完美地执行ls)。所以我认为它可能来自我的 shell,但这是一样的,在我的 bash 上运行 strace 并在两种情况下执行 ls 给我相同的 strace 输出:shell 执行 ls 并等待执行结束(延迟strace 之前的最后一个strace 输出是waitpid(...))。所以我猜想在ls 的启动和它的执行之间发生了一些错误,就像它是一个内核级别的问题一样。就像在ls 上创建了sleep(0 cpu 使用率)。
在延迟期间,我的 CPU 和网络活动完全正常...
请注意,新 LD 路径中的库不与任何“标准库”冲突,因此在我的示例中不会干扰 ls。
所以我对LD_LIBRARY_PATH 副作用或如何深入调试我的示例的深入解释很感兴趣。
【问题讨论】:
-
好问题。我使用过
LD_LIBRARY_PATH并且从未见过这种行为,但您的观察似乎既孤立又清晰。很有趣。 -
export LD_DEBUG=all和man 8 ld.so -
很明显,但如果 ls 使用 LD_LIBRARY_PATH 中的任何内容,“ldd $(which ls)”可能会提供线索。
-
有趣。您是否尝试从新路径中删除库文件?还是用标准库的副本替换它?
-
@thb @Thomas @Matthias :我找到了导致滞后的原因,但不明白为什么(感谢
LD_DEBUG=all):LD_LIBRARY_PATH中不存在一条路径,这条路径在远程服务器上...但是同一台服务器上还有其他路径,它们绝对不会引起任何问题...