创build符号链接到另一个符号链接是否有任何副作用?

是否创build一个符号链接到另一个符号链接在Linux上有任何副作用(特别是在性能方面)?

一般来说,没有。 从技术上来说,这种间接性会造成很小的性能下降,但是对于你的应用程序来说不会有太大的影响。 例如,大多数共享库符号链接符号链接(例如libQtCore.so – > libQtCore.so.4 – > libQtCore.so.4.7 – > libQtCore.so.4.7.1)。

这主要是Daniel Gallagher的论点的一个评论,但它不适合在评论框中,所以这会使其更具可读性。 从维基百科上的符号链接 :

符号链接的早期实现将符号链接信息作为数据存储在常规文件中。 该文件包含链接目标的文本参考,以及指示它作为符号链接的指示器[澄清需要]。

这种方法速度慢,在小型系统上使用磁盘空间效率不高。 一种称为快速符号链接的改进允许将目标path存储在用于在磁盘(inode)上存储文件信息的数据结构中。 该空间通常存储分配给文件的磁盘块地址的列表。 因此,快速访问短目标path的符号链接。 如果目标path超过可用的inode空间,那么具有快速符号链接的系统通常会回退到使用原始方法。 原始风格被追溯称为慢速符号链接。 它也用于与其他或更早版本操作系统的磁盘兼容性。

尽pipe在inode中存储链接值可以节省磁盘块和读取磁盘,但是操作系统仍然需要parsing链接中的path名,这总是需要读取更多的inode,并且通常需要读取其他(可能是很多)目录包括文件列表和每个文件的索引节点,直到find与链接的path组件相匹配的文件。 只有链接指向同一目录中的文件时,“快速符号链接”才能提供比其他符号链接更好的性能。

因此,使用符号链接来处理/usr/lib库中符号链接的惩罚比较长的path查找要less得多,甚至可能跨越多个挂载点。

我还没有看到这方面的原始数据,但从个人经验来看,我认为这只是一个小小的performance,在大多数情况下并不明显。 性能命中和我听说过的符号链接(没有亲眼见过)一起出现在(可能是坏的)实现中,在这些实现中使用系统分支来查找某个符号链接的目标。

我很乐意看到关于符号链接和performance的“肉体”的评论,因为这是几个月来第二次,我没有得出明确的结论。

副作用

是。 在内核和/或应用程序拒绝遵循链之前,只能将这么多的符号链接堆叠在一起。 (因为循环检测代价昂贵,特别是在内核中,所以没有使用“看到”标志,而是recursion深度被限制。)