В настоящее время я пытаюсь отслеживать некоторые операции ввода/вывода phantom в построенной PostgreSQL, которую я тестирую. Это многопроцессорный сервер, и не просто связать дисковый ввод-вывод с конкретным контентом и запросом.
Я думал, что инструмент Linux perf
был бы идеальным для этого, но я изо всех сил стараюсь захватить метрики производительности производительности ввода-вывода блоков и связать их с деятельностью пользовательского пространства.
Легко записывать запросы ввода-вывода блоков и их завершения, например:
sudo perf record -g -T -u postgres -e 'block:block_rq_*'
и записывается pid пользовательского пространства, но нет никакого стека ядра или пользовательского пространства или способности к моментальным снимкам кучи процесса пространства пользователя (скажем, текста запроса) и т.д. Поэтому, пока у вас есть pid, вы не знаете, что этот процесс делал в этот момент. Просто perf script
вывод:
postgres 7462 [002] 301125.113632: block:block_rq_issue: 8,0 W 0 () 208078848 + 1024 [postgres]
Если я добавлю флаг -g
в perf record
, он будет делать снимки ядра, но не фиксирует состояние пространства пользователя для перфорированных событий, зафиксированных в ядре. Стек пользовательского пространства только поднимается до точки входа из пользовательского пространства, например LWLockRelease
, LWLockAcquire
, memcpy
(mmap'd IO), __GI___libc_write
и т.д.
Итак. Какие-нибудь советы? Возможность захвата моментального снимка стека пользовательского пространства в ответ на события ядра была бы идеальной.
Я на Fedora 19, 3.11.3-201.fc19.x86_64, Schrödingers Cat, с первичным вариантом 3.10.9-200.fc19.x86_64.