새로운 대화형 bash 셸을 시작할 때 기록 파일을 읽는 데 소요된 시간을 측정합니다.

새로운 대화형 bash 셸을 시작할 때 기록 파일을 읽는 데 소요된 시간을 측정합니다.

sleep실행 속도를 저하시키는 명령이나 무언가가 있는 경우 .bashrc이를 프로파일링하여 다음과 같이 느린 부분을 확인할 수 있습니다.

$ printf "set -x\nPS4='+\\\\t '\nexport  HISTFILE=empty\nsleep 4\ntrue\n" > mybashrc
$ > empty
$ time bash --rcfile mybashrc -i <<< exit
+ PS4='+\t '
+19:13:47 export HISTFILE=empty
+19:13:47 HISTFILE=empty
+19:13:47 sleep 4
+19:13:51 true
$ exit
+19:13:51 exit
exit

real    0m4.022s
user    0m0.010s
sys     0m0.010s

그리고 다른 옵션 정확성을 높이려면 GNU를 사용하십시오 date.

하지만 다음과 같은 대규모 bash 기록 파일이 있다고 가정해 보겠습니다.

$ yes ls | head -n 9999999 > big-hist
$ du -sh big-hist
29M     big-hist

이제 셸도 매우 느리게 시작되지만(내 컴퓨터에서는 약 4초) 시간이 어디에 소요되는지 알 수 없습니다 .bashrc.

$ printf "set -x\nPS4='+\\\\t '\nexport HISTSIZE=-1\nexport HISTFILESIZE=-1\nexport HISTFILE=big-hist\ntrue\n" > mybashrc
$ time bash --rcfile mybashrc -i <<< exit
+ PS4='+\t '
+19:12:23 export HISTSIZE=-1
+19:12:23 HISTSIZE=-1
+19:12:23 export HISTFILESIZE=-1
+19:12:23 HISTFILESIZE=-1
+19:12:23 export HISTFILE=big-hist
+19:12:23 HISTFILE=big-hist
+19:12:23 true
$ exit
+19:12:27 exit
exit

real    0m4.184s
user    0m3.641s
sys     0m0.536s

내가 생각해 낼 수 있는 가장 좋은 추측은 다음과 같이 실행하는 것입니다.

$ time bash -i <<< exit
$ SHLVL=2 $ exit
exit

real    0m0.400s
user    0m0.326s
sys     0m0.075s

그런 다음 마지막 줄을 추가하십시오 .bashrc.

HISTFILE=/dev/null

그리고 다시 실행하세요:

$ time bash -i <<< exit
$ exit
exit

real    0m0.081s
user    0m0.059s
sys     0m0.023s

이것이 기록 파일을 처리하는 데 소요된 시간만을 측정하는지 완전히 확신할 수는 없습니다.

(참고: 직접 해보면 .bashrc 타이밍이 완료된 후 마지막 줄을 삭제하는 것을 잊지 마세요!)

내가 몇 년 동안 갖고 있었기 때문에 이것은 나에게 특히 흥미로웠다. 활성화됨 무한한 역사 내 경우에는 .bashrc 새로운 대화형 셸의 시작 시간이 영향을 받은 것으로 나타났습니다. 위의 타이밍이 정확하면 지연 시간이 300밀리초를 넘었습니다.

답변1

나는 당신의 측정을 신뢰하지 않을 이유가 없습니다.

하지만 bash이를 실행해 strace보면 파일이 열리는 순서를 볼 수 있습니다.

$ strace -t -f -e trace=file bash -i <<<exit 2>&1 | grep -E 'open(at)?\(' ; fg
[...]
03:10:39 openat(AT_FDCWD, "/home/hl/.bashrc", O_RDONLY) = 4
03:10:39 openat(AT_FDCWD, "/home/hl/.DISPLAY", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4
03:10:39 openat(AT_FDCWD, "/etc/inputrc", O_RDONLY) = 4
03:10:39 openat(AT_FDCWD, "/etc/inputrc.keys", O_RDONLY) = 4
03:10:39 openat(AT_FDCWD, "/etc/inputrc.keys", O_RDONLY) = 4
03:10:39 openat(AT_FDCWD, "/etc/inputrc.keys", O_RDONLY) = 4
03:10:39 openat(AT_FDCWD, "/home/hl/.inputrc", O_RDONLY) = 4
03:10:39 openat(AT_FDCWD, "/home/hl/.bash_history", O_RDONLY) = 4
03:10:39 openat(AT_FDCWD, "/home/hl/.bash_history", O_RDONLY) = 4
03:10:39 openat(AT_FDCWD, "/etc/localtime", O_RDONLY|O_CLOEXEC) = 4

fg이것이 왜 필요한지 모르겠습니다 . 어쩌면 셸을 배경으로 보내는 것이 내 셸 구성에 있는 것일 수도 있습니다.

관련 정보