현재 테스트중인 PostgreSQL 빌드에서 팬텀 입/출력을 추적하려고합니다. 다중 프로세스 서버이므로 디스크 입출력을 특정 백엔드 및 쿼리와 다시 연관시키는 것은 간단하지 않습니다.perf에서 사용자 공간 스택 정보 가져 오기
Linux의 perf
도구가 이상적이라고 생각했지만 I/O 성능 카운터 메트릭을 캡처하여 사용자 공간 작업과 연결하는 데 어려움을 겪고 있습니다.
이 기록 블록 I/O 요청과와 완료, 예를 쉽게 :
sudo perf record -g -T -u postgres -e 'block:block_rq_*'
과 사용자 공간 PID가 기록되어 있지만 커널 또는 사용자 공간 캡처 스택, 또는 스냅 샷을 할 수있는 능력이 없다 비트, 사용자 공간 프로세스의 힙 (예 : 쿼리 텍스트) 등. 그래서 당신이 PID를 가지고있는 동안, 당신은 그 시점에서 프로세스가 무엇을했는지 모릅니다. 같은 단지 perf script
출력 : 나는 perf record
에 -g
플래그를 추가하는 경우
postgres 7462 [002] 301125.113632: block:block_rq_issue: 8,0 W 0() 208078848 + 1024 [postgres]
IT는 커널 스택의 스냅 샷을 찍 겠지만, 커널에서 캡처 반환 한 이벤트를 사용자 공간의 상태를 캡처하지 않습니다. 사용자 공간 스택은 LWLockRelease
, LWLockAcquire
, memcpy
등 __GI___libc_write
(IO를 확실히 mmap) 겠어요 - 같이, 사용자 공간에서 항목 점까지 간다 어떤 팁? 사용자 공간 커널 이벤트에 대한 응답으로 사용자 공간의 스냅 샷을 캡처하는 것이 이상적입니다.
성능 버전 3.10.9-200.fc19.x86_64 인 Fedora 19, 3.11.3-201.fc19.x86_64, Schrödinger 's Cat입니다. 이 몇 가지 부분이있는 것처럼
이렇게 되 돌리면 frace/systemtap/uprobes/...를 대신 사용할 수 있습니다. 2014 년 linux.conf.au에서 systemtap이이 시점에서보다 쉽게 이것을 할 수 있다고 제안했습니다. –