strace에 따르면 getcwd()는 때때로 0.5초 정도 소요됩니다. 이것이 어떻게 가능합니까?

strace에 따르면 getcwd()는 때때로 0.5초 정도 소요됩니다. 이것이 어떻게 가능합니까?

내가 이해하는 한 파일 시스템도 포함되지 않습니다. 그렇다면 그 이유는 무엇입니까 strace -T?

     0.481441 getcwd("/home/user/web/url.com/public_html", 4096) = some number

저는 리눅스 4.9.30을 사용하고 있습니다.

시스템에 이상한 지연이 발생하여 이를 확인하고 싶습니다. CPU, iowait, 로드, 메모리 등 모든 것이 괜찮아 보입니다. kvm 가상 머신인데 뭔가 변경되었을 수도 있습니다.

답변1

팁: sudo perf record -ag커널 디버깅 기호가 설치되어 있으면 특정 커널 기능에 소요된 시간을 포함하여 흥미로운 정보를 얻을 수 있습니다.

그래도,

내가 이해하는 한 파일 시스템도 포함되지 않습니다.

이것은 정확하지 않습니다. getcwdLinux 커널에 의해 구현된 대로 cwd가 여전히 존재하는지, 파일 시스템이 여전히 마운트되어 있는지 확인하고 파일 시스템의 루트를 반복하여 디렉토리에 여전히 액세스할 수 있는지 확인해야 합니다.

파일 시스템이 차단된 상태로 인해 부작용과 지연이 발생할 수 있습니다.

여기서 가장 가능성이 높은 원인은 커널에서 매우 자주 실행되는 메모리 회수로 인해 유지되는 RCU 잠금입니다. 이는 위험한 드라이버 문제일 수도 있지만 매우 빈번한 네임스페이스 생성 등의 문제일 수도 있습니다.

답변2

우리는 이것이 SSD에 결함이 있음을 발견했습니다. 이를 식별하는 데 도움이 되는 명령은 다음과 같습니다.

$ ioping -c 20 /home/jsaak/temp/
min/avg/max/mdev = 1.00 ms / 5.71 ms / 29.3 ms / 7.62 ms
$ fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=fiotest --filename=testfio --bs=4k --iodepth=64 --size=32M --readwrite=randrw --rwmixread=75
  read : io=24608KB, bw=3136.8KB/s, iops=784, runt=  7845msec
  write: io=8160.0KB, bw=1040.2KB/s, iops=260, runt=  7845msec

관련 정보