Ftrace使用’tracepoint’
1 确认跟踪点信息
[root@JeffXie tracing]# cat available_events | grep mm_page_free
[root@JeffXie tracing]# cat available_events | grep mm_page_alloc
2 查看事件属性
[root@JeffXie tracing]# cat ./events/kmem/mm_page_free/format
[root@JeffXie tracing]# cat ./events/kmem/mm_page_alloc/format
3 添加过滤条件
根据tracepoint和format信息添加filter条件
#!/bin/bash
CURRENT_DIR=$(pwd)
SCRIPT_DIR=$(cd $(dirname ${BASH_SOURCE[0]}); pwd)
TRACE_DIR='/sys/kernel/debug/tracing/'
cd ${TRACE_DIR}
echo 0 > ./tracing_on && echo > ./trace
echo $$ > ./set_event_pid # event pid filter
echo 1 > ./options/event-fork
echo 'order == 1' > ./events/kmem/mm_page_free/filter
echo 'order == 1' > ./events/kmem/mm_page_alloc/filter
echo 1 > ./events/kmem/mm_page_free/enable
echo 1 > ./events/kmem/mm_page_alloc/enable
echo 1 > ./tracing_on
${SCRIPT_DIR}/run_test.sh && cp ./trace ${SCRIPT_DIR}/trace_test.log
echo 0 > ./tracing_on
echo 0 > ./events/kmem/mm_page_alloc/enable
echo 0 > ./events/kmem/mm_page_free/enable
echo 0 > ./events/kmem/mm_page_alloc/filter
echo 0 > ./events/kmem/mm_page_free/filter
echo > ./set_event_pid
echo 0 > ./options/event-fork
cat ${SCRIPT_DIR}/trace_test.log
cd ${CURRENT_DIR}
exec "$@"
4 查看输出日志
# tracer: nop
#
# entries-in-buffer/entries-written: 8/8 #P:4
#
# _-----=> irqs-off
# / _----=> need-resched
# | / _---=> hardirq/softirq
# || / _--=> preempt-depth
# ||| / delay
# TASK-PID CPU# |||| TIMESTAMP FUNCTION
# | | | |||| | |
sh-81 [002] .... 46198.822729: mm_page_alloc: page=00000000d0f1b0b9 pfn=12132 order=O
ls-138 [001] .... 46198.823167: mm_page_free: page=00000000ef7e228a pfn=122486 order=1
ls-138 [001] .... 46198.824303: mm_page_alloc: page=00000000ef7e228a pfn=122486 orderO
ls-138 [001] .... 46198.824707: mm_page_free: page=00000000d0f1b0b9 pfn=12132 order=1
sh-81 [002] .... 46198.830463: mm_page_alloc: page=00000000d0f1b0b9 pfn=12132 order=O
cp-139 [001] .... 46198.830742: mm_page_free: page=00000000ef7e228a pfn=122486 order=1
cp-139 [001] .... 46198.831789: mm_page_alloc: page=00000000ef7e228a pfn=122486 orderO
cp-139 [001] .... 46198.832180: mm_page_free: page=00000000d0f1b0b9 pfn=12132 order=1
5 拓展: 添加跟踪点
0)使用 TRACE_EVENT 定义 tracepoint
TRACE_EVENT(block_bio_queue,
TP_PROTO(struct request_queue *q, struct bio *bio),
TP_ARGS(q, bio),
TP_STRUCT__entry(
__field( dev_t, dev )
__field( sector_t, sector )
__field( unsigned int, nr_sector )
__array( char, rwbs, RWBS_LEN )
__array( char, comm, TASK_COMM_LEN )
),
TP_fast_assign(
__entry->dev = bio_dev(bio);
__entry->sector = bio->bi_iter.bi_sector;
__entry->nr_sector = bio_sectors(bio);
blk_fill_rwbs(__entry->rwbs, bio->bi_opf, bio->bi_iter.bi_size);
memcpy(__entry->comm, current->comm, TASK_COMM_LEN);
),
TP_printk("%d,%d %s %llu + %u [%s]",
MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs,
(unsigned long long)__entry->sector,
__entry->nr_sector, __entry->comm)
);
1)将跟踪点插入源码的指定位置
generic_make_request_checks(struct bio *bio)
{
....
trace_block_bio_queue(q, bio);
....
}
2)查看系统中的跟踪点所属模块
root@loongson-pc:/sys/kernel/debug/tracing# cd
root@loongson-pc:~# cd /sys/kernel/debug/tracing
root@loongson-pc:/sys/kernel/debug/tracing# cat available_events | grep block_bio_queue
block:block_bio_queue
3)使用跟踪节点
#!/bin/bash
CURRENT_DIR=$(pwd)
SCRIPT_DIR=$(cd $(dirname ${BASH_SOURCE[0]}); pwd)
TRACE_DIR='/sys/kernel/debug/tracing/'
cd ${TRACE_DIR}
echo 0 > ./tracing_on && echo > ./trace
echo nop > ./current_tracer
echo 1 > ./events/block/block_bio_queue/enable
echo 1 > ./tracing_on
${SCRIPT_DIR}/run_test.sh && cp ./trace ${SCRIPT_DIR}/trace_test.log
echo 0 > ./tracing_on
echo 0 > ./events/block/block_bio_queue/enable
cat ${SCRIPT_DIR}/trace_test.log
cd ${CURRENT_DIR}
exec "$@"
4)输出日志
root@loongson-pc:/sys/kernel/debug/tracing# cat /test.log
# tracer: nop
#
# entries-in-buffer/entries-written: 3/3 #P:4
#
# _-----=> irqs-off
# / _----=> need-resched
# | / _---=> hardirq/softirq
# || / _--=> preempt-depth
# ||| / delay
# TASK-PID CPU# |||| TIMESTAMP FUNCTION
# | | | |||| | |
sync-9297 [001] .... 156635.768754: block_bio_queue: 8,0 FWFSM 107174883 + 16 [sync]
sync-9297 [001] .... 156635.769711: block_bio_queue: 8,0 FWS 0 + 0 [sync]
sync-9298 [003] .... 156635.770507: block_bio_queue: 8,0 FWS 0 + 0 [sync]
6 参考资料
- 谢欢, ftrace公开课
- 379903