Ftrace使用‘tracepoint‘

本文介绍了如何利用Ftrace的tracepoint功能来跟踪和分析Linux内核的mm_page_free和mm_page_alloc事件,包括查看可用事件、事件属性、设置过滤条件以及查看输出日志。此外,还展示了如何添加新的跟踪点到内核源码中,并启用它们进行系统性能监控。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 参考资料

  1. 谢欢, ftrace公开课
  2. 379903
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hinzer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值