4.19内核执行ll时间比4.12内核(suse)长的问题

点击这里查看配套的教学视频

点击跳转到nfs课程所有目录

1 问题描述

麒麟server v10系统(内核4.19)执行ls -l遍历目录文件所花的时间比SUSE系统更长, suse的发行版是SUSE Linux Enterprise Server 12 SP5(内核版本4.12.14-120-default)。

2 调试

2.1 环境准备

在nfs server端(suse)的测试目录下创建足够多的文件:

counter=100000
path=/tmp/test
rm -rf ${path}
mkdir -p ${path}
cd ${path}

i=0
while true
do
    echo 1234567890 > file${i} # 不要用touch创建文件,因为更慢
    ((i++))
    echo ${i}
    if [ ${i} -eq ${counter} ]
    then
        break
    fi
done

nfs server端的配置文件/etc/exports如下:

/tmp *(rw,sync,no_all_squash,no_root_squash,no_subtree_check)

nfs client端挂载:

mount -t nfs -o lookupcache=none,proto=tcp,rsize=262144,wsize=262144,soft,timeo=180,retrans=300 192.168.122.7:/tmp /mnt
mount | grep nfs
    # SUSE Linux Enterprise Server 12 SP5 上的输出
        # 192.168.122.7:/tmp on /mnt type nfs4 (rw,relatime,vers=4.0,rsize=262144,wsize=262144,namlen=255,soft,proto=tcp,timeo=180,retrans=300,sec=sys,clientaddr=192.168.122.251,lookupcache=none,local_lock=none,addr=192.168.122.7)
    # 麒麟server v10系统(内核4.19)上的输出
        # 192.168.122.7:/tmp on /mnt type nfs4 (rw,relatime,vers=4.2,rsize=262144,wsize=262144,namlen=255,soft,proto=tcp,timeo=180,retrans=300,sec=sys,clientaddr=192.168.122.73,lookupcache=none,local_lock=none,addr=192.168.122.7)

2.2 测试

在虚拟机环境中复现不出来。

nfs client测试命令:

echo 3 > /proc/sys/vm/drop_caches
counter=3
for ((i=1;i<=${counter};i++))
do
    echo $i
    time ls -l /mnt/test/ > /dev/null &
    sleep 1
done

suse 4.12内核测试结果如下:

real    0m45.698s # 执行一次
# 连续执行3次
real    1m11.736s
real    1m15.464s
real    1m17.997s

suse内核替换为麒麟的4.19,测试结果如下:

real    0m50.777s # 执行一次
# 连续执行3次
real    1m10.020s
real    1m13.480s
real    1m15.569s

suse内核替换为主线,测试结果如下:

real    0m20.973s # 执行一次
# 连续执行3次
real    0m24.753s
real    0m24.534s
real    0m24.502s

3 结论

在虚拟机中SUSE Linux Enterprise Server 12 SP5 的4.12内核替换为4.19内核(使用suse的内核config),测试时间一样。

但在某些物理机环境上还是有问题,需要进一步定位。

4 补丁

tags/v6.7-rc1 5aa8fd9cea2e fs: add a new SB_I_NOUMASK flag