위력 strace
이 나를 실망시켰다. 이것이 어떻게 가능한지?
time foo
foo
실행 하는 데 몇 초가 걸리지 만 ( "실제") 사용자 공간 ( "user")과 커널 ( "sys") 모두에서 무시할 수있는 CPU 시간을 사용합니다. 궁금한 점 foo
은 아래에 정의되어 있습니다.
따라서 CPU 명령을 실행하지 않고 다른 것을 기다리는 데 대부분의 시간을 소비합니다. 일반적으로 대기 상태, strace
즉 어떤 시스템 호출이 오랫동안 차단 되는지 확인할 수 있습니다 . 불행히도이 방법은 효과가 없었습니다.
strace -ttt -T -C -w foo
시스템 호출, 타임 스탬프 및 시스템 호출에 소요 된 (실시간) 시간 요약을 보여줍니다. 그러나이 특정 프로세스는 시스템 호출 내부에서 무시할 수있는 전체 (실시간) 시간을 소비하는 것으로 나타났습니다.
foo
실제로 journalctl -b -u dev-hugepages.mount
입니다. 이것을 재현하기 위해 매번 마지막 인수를 다른 시스템 단위로 변경해야한다는 것을 제외하고. 다시 말해, 내가 조사하고있는 지연은 시스템 단위의 로그 하나를 처음으로 얻으려고 할 때 발생했습니다. 편집 : 주요 질문에 대답 한 후, 나는 이 문제가 지연을 재현하는 이유를 깨달았습니다 .
이 프로세스에 소요되는 시간은 특정 문제이며 모든 시스템에서 발생하는 것은 아닙니다. https://github.com/systemd/systemd/issues/7963
journalctl
하나의 프로세스 만 실행 한다고 생각 합니다. journalctl
어떤 이유로 든 하나의 추가 스레드를 사용 하는 느낌이 있습니다. iirc에는 하나의 clone () 호출이 있습니다. 나는 이것이 당신이 기술적으로 정확하다는 것을 의미한다고 생각하지만, 그것은 또한 질문과 관련이 없습니다. time
프로세스 전체를 살펴보고 전체 프로세스가 다소 졸리다는 것을 보여주었습니다. strace
충분한 수면을 보이지 않았다. 두 번째 스레드가 잠자고 있는지 여부는 중요하지 않으며 주 스레드도 time
결과 를 설명하기 위해 매우 졸려 야합니다 .