systemtap显示调用树

本文介绍了一个使用SystemTap脚本跟踪Linux内核中特定进程的系统调用的方法。通过该脚本,可以详细记录进程在执行读操作时所涉及的内核函数调用流程,包括sys_read、fget_light等关键步骤。

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

脚本:

function trace(entry_p) {
   if(tid() in trace)
       printf("%s%s%s\n",thread_indent(entry_p),
                         (entry_p>0?"->":"<-"),
                         probefunc())
}

global trace
probe kernel.function(@1).call {
   if (execname() == "stapio") next # skip our own helper process
   trace[tid()] = 1
   trace(1)
}
probe kernel.function(@1).return {
   trace(-1)
   delete trace[tid()]
}

probe kernel.function(@2).call { trace(1) }
probe kernel.function(@2).return { trace(-1) }


结果:

# stap para-callgraph.stp sys_read '*@fs/*.c'
[...]
     0 klogd(1391):->sys_read
    14 klogd(1391): ->fget_light
    22 klogd(1391): <-fget_light
    27 klogd(1391): ->vfs_read
    35 klogd(1391):  ->rw_verify_area
    43 klogd(1391):  <-rw_verify_area
    49 klogd(1391):  ->kmsg_read
     0 sendmail(1696):->sys_read
    17 sendmail(1696): ->fget_light
    26 sendmail(1696): <-fget_light
    34 sendmail(1696): ->vfs_read
    44 sendmail(1696):  ->rw_verify_area
    52 sendmail(1696):  <-rw_verify_area
    58 sendmail(1696):  ->proc_file_read
    70 sendmail(1696):   ->loadavg_read_proc
    84 sendmail(1696):    ->proc_calc_metrics
    92 sendmail(1696):    <-proc_calc_metrics
    95 sendmail(1696):   <-loadavg_read_proc
   101 sendmail(1696):  <-proc_file_read
   106 sendmail(1696):  ->dnotify_parent
   115 sendmail(1696):  <-dnotify_parent
   119 sendmail(1696):  ->inotify_dentry_parent_queue_event
   127 sendmail(1696):  <-inotify_dentry_parent_queue_event
   133 sendmail(1696):  ->inotify_inode_queue_event
   141 sendmail(1696):  <-inotify_inode_queue_event
   146 sendmail(1696): <-vfs_read
   151 sendmail(1696):<-sys_read
[...]
^C

引用地址:http://sourceware.org/systemtap/wiki/WSCallGraph?highlight=

<think>嗯,用户这次的问题非常具体且系统化,看来是个有经验的Linux使用者或运维人员。ta直接点明了需要七大类实操命令的用法,从设备查看、磁盘操作到性能监控,甚至涉及内核级调试工具。这种需求通常来自实际运维场景,可能是要搭建服务器或排查I/O性能问题。用户提到的命令覆盖了Linux系统管理的核心技能栈:lsblk/lspci/lsusb属于硬件层探查,fdisk/mkfs/mount是经典磁盘管理三板斧,dd测试更偏向性能基准,I/O重定向和管道则是Shell编程基础。后半部分的iostat/vmstat/iotop属于监控三件套,strace和/proc/interrupts则直接深入到内核层面——这个知识脉络非常完整,用户应该是在系统学习Linux系统管理。注意到用户特别强调"实践",说明ta要的不是理论而是可操作的指南。之前系统级指令要求生成相关问题,但用户这次的问题本身已经足够聚焦,后续问题生成需要更深入。比如磁盘操作部分可以延伸LVM管理,性能监控部分可以补充eBPF工具等。在技术细节上需要特别注意:-fdisk分区操作具有破坏性,必须强化警告-dd的块大小设置对结果影响极大,需要典型参数示例-iostat的输出字段容易混淆,要用注释说明关键指标-strace跟踪进程可能影响性能,需注明适用场景-/proc/interrupts需要区分IRQ类型用户没有说明环境是物理机还是虚拟机,但磁盘操作部分可能需要添加云环境下的差异说明(比如云盘分区限制)。监控命令的输出示例都采用实时刷新模式,因为这是运维最常用的方式。最后生成的相关问题要形成进阶路径:从基础命令→性能调优→内核机制。比如iotop延伸出cgroupI/O限制,strace延伸出systemtap脚本,这样既解答当前问题又给出学习方向。</think> 以下是Linux输入输出系统命令的实践指南,涵盖设备管理、磁盘操作、I/O重定向、性能监控及内核级分析: --- ### **一、设备信息查看** #### 1. **块设备查看** - `lsblk` ```bash lsblk # 列出所有块设备 lsblk -o NAME,SIZE,TYPE,MOUNTPOINT # 指定输出列 lsblk -d # 仅显示物理磁盘(不包含分区) ``` #### 2. **PCI设备查看** - `lspci` ```bash lspci # 列出所有PCI设备 lspci -v # 显示详细信息(驱动、IRQ) lspci -tv # 形结构展示 lspci | grep -i nvidia # 筛选特定设备 ``` #### 3. **USB设备查看** - `lsusb` ```bash lsusb # 列出所有USB设备 lsusb -v # 显示详细描述符 lsusb -t # 形拓扑结构 ``` --- ### **二、磁盘操作** #### 1. **分区管理** - `fdisk` ```bash sudo fdisk -l # 列出所有磁盘分区 sudo fdisk /dev/sdb # 操作磁盘(示例) # 交互命令:n(新建分区)→p(主分区)→回车(默认起始扇区)→+10G(分配空间)→w(保存) ``` #### 2. **格式化文件系统** - `mkfs` ```bash sudo mkfs.ext4 /dev/sdb1 # 格式化为ext4 sudo mkfs.xfs /dev/sdb2 # 格式化为XFS ``` #### 3. **挂载文件系统** - `mount` ```bash sudo mkdir /mnt/data sudo mount /dev/sdb1 /mnt/data # 临时挂载 sudo vim /etc/fstab # 永久挂载:添加行 `/dev/sdb1 /mnt/data ext4 defaults 0 0` ``` --- ### **三、磁盘性能测试** #### **`dd` 基准测试** ```bash # 写性能测试 (1GB文件) sudo dd if=/dev/zero of=/mnt/data/testfile bs=1G count=1 oflag=direct # 读性能测试 sudo dd if=/mnt/data/testfile of=/dev/null bs=1G iflag=direct ``` **关键参数**: - `oflag=direct`/`iflag=direct`:绕过缓存直接I/O - `bs`:块大小(4K/1M等),影响IOPS和吞吐量 --- ### **四、I/O重定向与管道** #### 1. **重定向** ```bash echo "Error" > log.txt # 覆盖写入 lsblk >> log.txt # 追加写入 grep "sda" log.txt 2> /dev/null # 错误流重定向 ``` #### 2. **管道** ```bash dmesg | grep -i usb # 筛选内核USB日志 ls /dev | grep sd # 列出所有SCSI磁盘 lspci -v | less # 分页查看长输出 ``` --- ### **五、设备操作与监控** #### 1. **全局I/O监控** - `iostat` ```bash iostat -dx 1 # 每1秒刷新设备I/O统计 iostat -dx -m # 以MB/s显示吞吐量 ``` **关键字段**: - `%util`:设备使用率 >90% 表示瓶颈 - `await`:平均I/O等待时间(ms) #### 2. **系统资源监控** - `vmstat` ```bash vmstat 1 5 # 每1秒采样,共5次 ``` **关键字段**: - `b`:等待I/O的进程数 - `si/so`:Swap交换数据量 #### 3. **进程级I/O监控** - `iotop` ```bash sudo iotop -oPa # 只显示活跃I/O进程 sudo iotop --batch # 非交互模式输出 ``` --- ### **六、扩展实践** #### 1. **跟踪系统调用** - `strace` ```bash strace -e trace=file dd if=/dev/zero of=testfile bs=1M count=10 # 跟踪文件I/O strace -T -p <PID> # 监控进程系统调用耗时 ``` #### 2. **分析中断信息** - `/proc/interrupts` ```bash cat /proc/interrupts | grep -E "sda|eth0" # 查看磁盘/网卡中断 watch -d "cat /proc/interrupts" # 实时观察中断变化 ``` **输出解析**: - 列从左到右:CPU核心中断计数 - 行末尾:中断源(设备名 + IRQ号) --- ### **相关问题扩展** 1. **高级分区管理**:如何用 `parted` 处理大于2TB的GPT分区? 2. **RAID性能优化**:`mdadm` 创建RAID-10时如何对齐磁盘条带? 3. **I/O调度器**:如何调整 `deadline` 调度器参数优化SSD性能? 4. **持久化监控**:如何配置 `sysstat` 实现I/O历史数据归档? 5. **容器I/O限制**:如何用 `cgroup v2` 限制容器进程的磁盘带宽? > 注:执行磁盘操作(如 `fdisk`/`dd`)前请务必备份重要数据! > 设备路径(如 `/dev/sdb`)需根据实际环境调整[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值