이제는 시간이 지남에 따라이 문제를 직접 해결할 수 있었으므로 적어도 후손을 위해 직접 조사 할 수 있습니다.
불행히도, 나는 커널 업그레이드에서 원래 문제를 잃었지만 대신 성능을 저하시키고 추적하기 어려운 새로운 문제를 얻었습니다. 내가 찾은 기술은 다음과 같습니다.
우선, blktrace
/ blkparse
는 매우 도움이되는 도구입니다. 요청을 제출 한 프로세스와 같은 많은 유용한 세부 사항으로 개별 I / O 요청의 진행 상황을 추적 할 수 있습니다. tmpfs
추적 스토리지 저장 처리가 자체 추적을 시작하지 않도록 출력을 설정하는 것이 좋습니다 .
그래도 지금까지 도움이되었으므로 더 많은 디버깅 기능을 갖춘 커널을 컴파일했습니다. 특히 ftrace
커널 공간 내에서 성능이 좋지 않은 프로세스를 추적하여 수행 한 작업과 차단 된 위치를 확인할 수 있었기 때문에 상당히 도움이되었습니다. 디버그 커널을 컴파일하면 작업 WCHAN
출력 도 제공 ps
되므로 프로세스가 커널 내부에서 수행되는 작업을보다 간단한 경우보다 쉽게 확인할 수 있습니다.
또한 LatencyTop 이 유용하기를 바랐 지만 매우 버그가 많았으며 불행히도 너무 "높은 수준"인 지연 시간 이유 만 표시했습니다.
또한 다음과 같이 매우 가까운 간격으로 iostat
내용을 보는 것보다 더 유용하다는 것을 알았 /sys/block/$DEVICE/stat
습니다.
while :; do cat /sys/block/sda/stat; sleep .1; done
파일 Documentation/iostats.txt
형식에 대해서는 커널 소스 트리를 참조하십시오 stat
. 가까운 간격으로 볼 때 I / O 버스트의 정확한 타이밍과 크기 등을 볼 수있었습니다.
결국, 커널 업그레이드 후 내가 겪었던 문제 는 Linux 3.0에 도입 된 기능인 안정된 페이지 로 인해 발생한다는 것을 알았습니다 . 필자의 경우 mmap'ed 페이지를 더럽힐 때 Berkeley DB가 오랫동안 정지되는 원인이되었습니다. 지역 파일. 이 기능을 패치 할 수 있고 Linux 3.9에서 발생하는 문제가 해결 될 수도 있지만 Berkeley DB 를 패치 하여 해당 지역 파일을 다른 디렉토리에 넣을 수있게 함으로써 지금까지 최악의 문제를 해결했습니다. (내 경우 /dev/shm
) 문제를 완전히 피할 수 있습니다.