为了调试一个功能,在一个内核模块中,增加了一个全局变量,用来统计自有skb池的申请情况。

因为是临时增加,所以没有考虑性能,一开始只是一个fail的统计,数量不多,也不太考虑是否有计数丢失的情况,毕竟那个卖火车票的例子已经让很多人知道了并发导致的计数丢失。

因为只是一个简单统计,这样做无可厚非。

后来有人维护的时候,增加了一个success的统计,结果发现增加该变量前后cpu占用增加了一个点。为了排除是伪共享的行为,我将两个变量中间增加了一些reserve的空间,结果还是如此。去掉success统计,立刻恢复。一个简单的计数居然导致如此的性能变化,只能祭出倚天剑了,perf上马。

根据perf stat 的统计,我发现 cache-misses这一行有明显的增长,

最后排查的原因就是,由于是一个多核的设备,每个cpu都会对这个变量进行++,也就是这个变量是一个热点,当A cpu对其++的时候,根据mesi协议,显然会发送让其他cpu对这个变量进行读缓存失效,并且还需要等待其他cpu的回复的最新的缓存值。虽然这个过程是由硬件实现的,但对性能的影响却是显而易见的。

所以将这个统计改成percpu变量,然后需要show的时候,将各个cpu相加起来就ok。牺牲了部分准确性,但提高了性能,因为性能这个词,本来就是一种权衡,不管是用时间换空间还是空间换时间。

所以多核并发,针对统计类的实现,最好实现成percpu的。这个就是经典的并行拆分思路。

ps:

推荐对并发编程感兴趣的童鞋,可以参考老谢和鲁阳翻译的《深入理解并行编程》。

转载于:https://www.cnblogs.com/10087622blog/p/9453412.html

linux 内核中一个全局变量引发的性能问题相关推荐

  1. linux内核时间函数us,linux内核中一个有趣的函数calibrate_delay ZZ

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 34  loops_per_sec &=~loopbit; 35  } 36 /* finally,adjust loops per second ...

  2. 什么是Linux系统调用system call?(Linux内核中设置的一组用于实现各种系统功能的子程序)(区别于标准C库函数调用)核心态和用户态的概念、中断的概念、系统调用号、系统调用表

    文章目录 什么是系统调用? 为什么要用系统调用? 系统调用是怎么工作的? 如何使用系统调用? _syscall*()是什么? errno是什么? 调用性能问题 Linux系统调用列表 进程控制 文件系 ...

  3. 大话Linux内核中锁机制之原子操作、自旋锁【转】

    转自:http://blog.sina.com.cn/s/blog_6d7fa49b01014q7p.html 多人会问这样的问题,Linux内核中提供了各式各样的同步锁机制到底有何作用?追根到底其实 ...

  4. Linux内核中的同步原语:自旋锁,信号量,互斥锁,读写信号量,顺序锁

    Linux内核中的同步原语 自旋锁,信号量,互斥锁,读写信号量,顺序锁 rtoax 2021年3月 在英文原文基础上,针对中文译文增加5.10.13内核源码相关内容. 1. Linux 内核中的同步原 ...

  5. 简单谈一点linux内核中套接字的bind机制--数据结构以及端口确定

    众所周知,创建一个套接字可以bind到一个特定的ip地址和端口,实际上套接字这一概念代表了TCP/IP协议栈的应用层标识,协议栈中的应用层就是通过一个ip地址和一个端口号标识的,当然这仅仅是对于TCP ...

  6. Linux 内核中的 GCC 特性(zz)

    from:http://www.ibm.com/developerworks/cn/linux/l-gcc-hacks/ GCC 和 Linux 是出色的组合.尽管它们是独立的软件,但是 Linux ...

  7. linux 信号量锁 内核,Linux内核中锁机制之信号量、读写信号量

    在上一篇博文中笔者分析了关于内存屏障.读写自旋锁以及顺序锁的相关内容,本篇博文将着重讨论有关信号量.读写信号量的内容. 六.信号量 关于信号量的内容,实际上它是与自旋锁类似的概念,只有得到信号量的进程 ...

  8. Linux内核中常见内存分配函数

    1.      原理说明 Linux内核中采用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系统中,用到了四级页表,如图2-1所示.四级页表分 ...

  9. Linux内核中内存分配函数

    1.原理说明 Linux内核 中采 用了一种同时适用于32位和64位系统的内 存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系 统中,用到了四级页表,如图2-1所示.四级页表分别为 ...

最新文章

  1. Stormpath发布了简化移动和前端身份验证的客户端API
  2. OpenCASCADE绘制测试线束:数据交换命令之XDE 形状命令
  3. canal原理的一些学习-2(HA 模式搭建)
  4. Spark的Dataset操作
  5. 如何搭建SVN的服务器
  6. Intent Bundle页面跳转信息的传递
  7. 32位mysql安装包_MySQL安装指南(CPT103)
  8. P2839 [国家集训队]middle 二分 + 主席树 在值域上建区间
  9. iOS自定义从底部弹上来的View
  10. 模糊测试——强制发掘安全漏洞的利器(Jolt 大奖精选丛书)
  11. 倒计时的js实现 倒计时 js Jquery
  12. 最好用的十六进制编辑器010 Editor
  13. 微信小程序开发者工具获取不到坐标
  14. html 空格 正则表达式,正则表达式清除空格和html标签中的 空格
  15. 【UI设计No9】VI
  16. 矩阵计算在计算机科学中,开发者必读:计算机科学中的线性代数
  17. idea项目管理github无法登陆
  18. xpath 准确匹配 跟 模糊匹配属性
  19. 中国计算机科学发展,中国计算机的发展趋势
  20. 【转】windows环境下安装win8.1+Mac OS X 10.10双系统教程

热门文章

  1. tensorflow环境下的识别食物_Tensorflow object detection API 搭建属于自己的物体识别模型——环境搭建与测试...
  2. python xlsxwriter 画图_Python XlsxWriter模块Chart类用法实例分析
  3. 赋值后页面不渲染_第七节:框架搭建之页面静态化的剖析
  4. 【CV春季划】170分钟学习OpenCV与经典图像处理算法基础
  5. 全球及中国陶瓷脐轮行业投资份额及需求前景调研报告2021-2027年版
  6. 如何使用live writer客户端来发布CSDN的博客文章?
  7. java邮箱找回密码_Spring实现简单的邮箱找回密码功能
  8. openresty开发系列38--通过Lua+Redis 实现动态封禁IP
  9. Callable和Future、FutureTask的使用
  10. 常用的meta标签总结