第3章 Linux内核调试手段之三
之前的内核调试,我觉得应该再加上下面的东西,只有好好把下面的几个问题研究透了,你可能才是一个真正的内核高手,或者说,你还不是一个高手,就是一个内核的普通工程师,这个是我和Z总聊天说的,我当时问他,你对Linux内核熟悉吗?Z总给我说了一句,还可以吧。然后,这些内容都是他给我总结的,这些内容,我觉得,没有经过多年的项目捶打,光靠看书看报,百度搜狗出来是没有用的,现在总结出来,希望给正在一线的同学们一些帮助和建议。
性能优化方式总结:
多核多队列并行处理
将多个任务分发绑定在不同核上,减少任务调度切换上下文的开销,提升了cache命中率,并行处理提升性能
将不同任务间的资源分离,不要共享,比如每个核有单独的首发队列,避免竞争
负载均衡,设备端处理后的数据散列到不同的CPU收发队列中,均衡各core的负载
DMA
使用设备的DMA引擎,降低CPU占用率,提升性能
负载均衡,CPU给不同的DMA引擎收发队列散列差不多的数据,保证各个DMA引擎负载均衡
中断聚合
保证时延的情况下将设备的多个中断汇聚成1个中断,在一次中断函数中处理,减少中断抢占带来的开销
中断中处理读写BD时,尽量按照cache lin对齐的方式,比如一个BD是16字节,cacheline是 64字节,那就一次处理4个BD,提升cache命中率
设置中断亲和性,是中断处理绑定在指定的core上,可以通过cat /proc/interrupts命令查看中断在各个CPU上的分布
降低TLB miss
可以采用huge page,采用huge page的虚拟地址和物理地址的转换映射条目就比较少,而且TLB中有专门的条目保存huge page映射,保证在huge page的命中率,减少了进程页表的频繁读取,提升了性能
减少内存拷贝
用户态驱动用mmap将物理地址映射到用户态虚拟地址,减少内核态与用户态数据的拷贝
提升cache命中率
代码中少用静态变量和全局变量,因为他们保存在数据段和BSS段,不在栈内(栈使用频繁,一般都会cache命中),频繁的访问静态变量和全局变量就需要多次对cache换入换出,影响性能。
cache line
数据结构cache line对齐,因为CPU每次按照cache line大小从内存取数据,不对齐就需要取2次,对齐就只要取1次
多核共享的数据,尽量将只读数据和可写数据分开,因为某个core写数据后与其他core的cache中数据不一致了,就需要将数据刷入内存,其他core从内存读,才能保证数据一致性
分支预测
代码中if else分支用likely/unlikely这样的宏,这样编译时就把likely分支和前面的代码靠近,提升指令cache的命中率同时减少跳转指令的开销。
第3章 Linux内核调试手段之三相关推荐
- 第3章 Linux内核调试手段之内核打印
开始 前面说的话 在我写代码的生涯里,我看到过很多大神炫耀自己的调试手段,也看到很多大神写过非常厉害的代码,我认为,相比于写代码,调试更加重要,而那些能在写代码的时候就加入了自己的调试信息的,就更加厉 ...
- 第3章 Linux内核调试手段之二
=================== gdb 和 addr2line 调试内核模块 内核模块插入内核链表的时候,会调用 init 里面的程序,我们上面给的那个例程的程序因为是经过多年风吹雨打的,但是 ...
- 常用Linux内核调试手段介绍 02——— 内核笔记
活动地址:CSDN21天学习挑战赛 调试 1.printk 调试 2.动态打印 (一)要使用动态打印,必须在内核配置时打开CONFIG_DYNAMIC_DEBUG宏. 示例: 这里rv112 ...
- 开源项目-基于Intel VT技术的Linux内核调试器
本开源项目将硬件虚拟化技术应用在内核调试器上,使内核调试器成为VMM,将操作系统置于虚拟机中运行,即操作系统成为GuestOS,以这样的一种形式进行调试,最主要的好处就是调试器对操作系统完全透明.如下 ...
- Linux 内核调试器 调试指南
Linux 内核调试器内幕 KDB 入门指南 Hariprasad Nellitheertha (nharipra@in.ibm.com), 软件工程师, IBM 简介: 调试内核问题时,能够跟踪内核 ...
- Linux内核调试debugfs
DebugFS,顾名思义,是一种用于内核调试的虚拟文件系统,内核开发者通过debugfs和用户空间交换数据.类似的虚拟文件系统还有procfs和sysfs等,这几种虚拟文件系统都并不实际存储在硬盘上, ...
- Linux内核调试技术指南
前两天,完成了ucos在2440上的移植,以及boot的修改.今天突然想到,我在linux下,该如何来编写,调试比较复杂的驱动.我想这个问题应该从如何调试内核入手,先转载两个文字,待西西看来. 系统搭 ...
- 【正点原子Linux连载】第三十七章 Linux内核移植 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...
- linux内核调试指南
Hunnad的专栏 * 条新通知 * 登录 * 注册 * 欢迎 * 退出 * 我的博客 * 配置 * 写文章 * 文章管理 * 博客首页 * * * * 空间 * 博客 * 好友 * 相册 * 留言 ...
最新文章
- 《研磨设计模式》chap22 装饰模式Decorator(4)AOP+总结
- EF--Code First配置问题
- linux下shell脚本论文,Linux下Shell脚本编程
- 思维导图iMindMap如何制定时间计划
- mysql+hive+建表语句,在Oracle、MySQL中执行sql脚本生成hive建表语句
- linux设置ipsan_linux 配置SAN存储-IPSAN
- 副词记忆(II):ly后缀的常用词
- 小程序根据国外经纬度显示地图
- 有的人呀,他真的是带不动。。。
- Win10系统任务栏图标显示白色方块的解决方法
- FPGA 视频处理中外部SDRAM的作用
- kubernetes 日志收集
- 微信扫码登陆在chrome浏览器被拦截
- About Variables
- 金仓数据库 KingbaseES 客户端编程接口指南 - ODBC 驱动使用
- Spring简化Java开发_java开发如何用spring简化?详细图解
- delphi多线程例子 采用createThread创建多线程
- Java IDE推荐
- 思维导图MindManager的文件格式与例图
- 理解长短期记忆(LSTM) 神经网络
热门文章
- 属性动画基础之ValueAnimator
- 我的Android进阶之旅------Android利用温度传感器实现带动画效果的电子温度计
- ViewBag 找不到编译动态表达式所需的一种或多种类型,是否缺少引用?
- mlecms v2.2版权
- 我喜欢这样的老大[10-24]
- 36--斐波那契数列
- cef js返回c++的代码_CEF3开发者系列之外篇——IE中JS与C++交互
- Flask werkzeug 源码解析
- bat 发送post请求_get post 请求
- 【机器学习】feature_importances_ 参数源码解析