1、eBPF-交流研讨第三届 eBPF开发者大会w w w.e b p f t r a v e l.c o m中 国 西 安eBPF技术在滴滴自动驾驶场景下的相关实践第三届 eBPF开发者大会w w w.e b p f t r a v e l.c o m中 国 西 安陈 涛 滴 滴第三届 eBPF开发者大会w w w.e b p f t r a v e l.c o m 项目整体概况 如何做到低频问题的定位/定界 问题案例 未来展望1234第三届 eBPF开发者大会w w w.e b p f t r a v e l.c o m项目整体概况1第 三 届 e B P F 开 发 者 大 会1.eBPF使
2、用场景以调度场景为列perffto 用户态函数trace,能看到时延不知道底层原因eBPF 内核级trace,善于定位根因 安全、高效、随时可上可下,不需要修改内核代码第 三 届 e B P F 开 发 者 大 会2.覆盖的子系统第 三 届 e B P F 开 发 者 大 会3.车端工具部署抓捕偶现问题常态化部署 不同问题配置不同工具 抓捕对应节点云端配置eBFP日志结合perffto数据日志分析第 三 届 e B P F 开 发 者 大 会如何做到低频问题的定位/定界2第 三 届 e B P F 开 发 者 大 会工具常态化部署遇到的挑战 常态化部署工具,实时追踪应对车端毫秒级低频问题 业务
3、节点对时延非常敏感(ms)热点路径工具自身资源消耗较大遇到的挑战 优化自身代码 增加部署策略、过滤条件(黑名单)等工具优化eBPF编程范式用户态项目框架libbpf-bootstrap 增加静态编译libbpf 增加自定义help func bpf_preempt_cnount等bazelsym 栈解析库 cpu消耗较大替换成bcc库内核程序 1.hook目标函数 2.将数据存在map 3.抓取栈信息(root cause)4.数据输出栈解析的重要性通过栈信息分析用户态程序等锁唤醒 直观呈现问题第一现场,利于问题分析利 在bpf_prog中耗时占大头弊第 三 届 e B P F 开 发 者 大
4、 会1.采栈优化-栈解析封装栈解析API,使用BCC解析库 cpu使用降低70%栈更直观无需后处理blazesym 解析库存在的问题 C+栈信息需要符号后处理 cpu消耗较大,读取符号信息会频繁持有mmap_sem锁第 三 届 e B P F 开 发 者 大 会1.采栈优化-采栈时机1.内核线程上下文不采集用户态栈2.中断上下文不采集用户态栈30%占比!id hash conflictbpf_get_stack_id vs bpf_get_stackUSER_STACK vs KERNEL_STACK第 三 届 e B P F 开 发 者 大 会2.函数hook方式优化kprobetracep
5、ointraw_tracepointfentry1.787M/s1.873M/s3.217M/s3.795M/stest enviroment以实际内核版本实测为准3.引入trigger机制只在监控指标burst的情况下触发工具使用节省CPU资源消耗节省存储资源消耗由频繁系统调用引起的sys打高第 三 届 e B P F 开 发 者 大 会案例分享3第 三 届 e B P F 开 发 者 大 会内核中睡眠锁争抢引起时延(mmap_sem、rtnl_lock)CFS公平调度引起的调度时延高优先级任务抢占低优先级任务(网络包)内存直接回收(同步等待)用户程序逻辑问题(老大难!)实际问题分享1.mm
6、ap_sem锁争抢/proc/pidxx/maps/proc/pidxx/schedstateBPF 工具Libc系统调用进入业务节点 pidxx监控进程static const struct seq_operations proc_pid_maps_op=.start =m_start,.next =m_next,.stop =m_stop,.show =show_map;down_read_killable(&mm-mmap_sem);sys_mprotectdo_mpr