对于通过路径名执行程序的execve()系统调用,Linux6.8内核将进行新的优化,以“显著”加速路径搜索。
的 执行更新对于Linux6.8,引入了新的快速失败检查来加速基于execve的路径搜索。
Linux开发人员Josh Triplett编写了这个优化并评论了补丁:
“目前,execve分配mm并在检查路径是否存在之前解析argv和envp。但是,通常情况下,$PATH搜索可能在一次成功之前多次调用EXEC失败。在执行更昂贵的操作之前,执行文件名查找的目的是返回ENOENT。
..。
为了测量性能,我运行了2000个fork和execvpe调用,其中一个七元素的PATH中的文件位于第七个目录中(常见情况的代表是/usr/bin是我的$PATH上的第七个目录),以及2000个fork和execve调用,其中一个绝对路径指向现有的二进制文件。我记录了每一个的最短时间,以消除上下文切换和类似的噪音。没有快速通道:
叉子/执行器:49876 ns
叉子/execve:32773 ns使用快速路径:
叉子/叉子:36890 ns
fork/execve:32069ns对于成功的EXEC来说,额外查找的成本似乎微不足道,但它为路径搜索提供了26%的改进
加快了六个失败的高管。”
对于基于execve的PATH搜索来说,这是一个相当不错的胜利,速度快了26%,特别是对于这是一个常见的操作。在该补丁中提出,shell脚本倾向于使用stat()来检查PATH中的文件,而GNU C库(glibc)和Musl libc,Python,Perl等倾向于使用基于execve的方法,从而受益于这种内核优化。
Nothing beats a small patch for a nice performance win.