Symlinking(ln)比移动(mv)更快?

时间:2010-03-26 18:44:55

标签: performance symlink

当我们构建Web软件版本时,我们在一个临时目录中准备该版本,然后将该版本目录替换为刚准备好的临时版本:

# Move and replace existing release directory.
mv /path/to/httpdocs /path/to/httpdocs.before
mv /path/to/$newReleaseName /path/to/httpdocs

在这种方案中,每15个版本中大约有1个,用户在运行上面的命令时正好使用原始版本目录中的文件,并且该用户发生致命错误。

我想知道在处理时间方面使用符号如下的符号会更快,从而有助于减少出现此问题的可能性:

# Remove and replace existing release symlink.
ln -sf /path/to/$newReleaseName path/to/httpdocs

4 个答案:

答案 0 :(得分:6)

使用符号链接的主要优点是你可以原子地完成它。强制新的符号链接不是原子的,但您可以创建新的符号链接,然后将其重命名为现有符号链接。重命名是一个原子操作,所以你应该没有竞争条件。

ln -s /path/to/newrelease /path/to/httpdocs.tmp && mv -Tf /path/to/httpdocs.tmp /path/to/httpdocs

答案 1 :(得分:1)

在我看来,因为Linux中的mv只是对inode信息的更改,并且ln正在复制inode记录,所以它们都应该具有足够快的持续时间而你无法告诉与秒表的区别。

但我想知道他们是否真的会解决你的问题。我猜你说的是用户正在使用目标文件 - 所以它不会以任何方式失败吗?

答案 2 :(得分:1)

如果你跨越分区,它肯定会更快。在同一个分区中,我猜想使用链接仍然会更顺畅。

我的建议是计时 - 就像这样:

#!/bin/bash
for i in $(seq 1 1000); do
   time mv /path/to/httpdocs /path/to/httpdocs.before
   time mv /path/to/$newReleaseName /path/to/httpdocs
done

for i in $(seq 1 1000); do
   time ln -sf /path/to/$newReleaseName path/to/httpdocs
done

最好收集真实的指标而不是猜测。

答案 3 :(得分:0)

请注意,符号链接可能会慢一些:http://httpd.apache.org/docs/2.0/misc/perf-tuning.html

它可以解决一个问题并创建另一个问题。