linux 内核中一个全局变量引发的性能问题
为了调试一个功能,在一个内核模块中,增加了一个全局变量,用来统计自有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 内核中一个全局变量引发的性能问题相关推荐
- linux内核时间函数us,linux内核中一个有趣的函数calibrate_delay ZZ
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 34 loops_per_sec &=~loopbit; 35 } 36 /* finally,adjust loops per second ...
- 什么是Linux系统调用system call?(Linux内核中设置的一组用于实现各种系统功能的子程序)(区别于标准C库函数调用)核心态和用户态的概念、中断的概念、系统调用号、系统调用表
文章目录 什么是系统调用? 为什么要用系统调用? 系统调用是怎么工作的? 如何使用系统调用? _syscall*()是什么? errno是什么? 调用性能问题 Linux系统调用列表 进程控制 文件系 ...
- 大话Linux内核中锁机制之原子操作、自旋锁【转】
转自:http://blog.sina.com.cn/s/blog_6d7fa49b01014q7p.html 多人会问这样的问题,Linux内核中提供了各式各样的同步锁机制到底有何作用?追根到底其实 ...
- Linux内核中的同步原语:自旋锁,信号量,互斥锁,读写信号量,顺序锁
Linux内核中的同步原语 自旋锁,信号量,互斥锁,读写信号量,顺序锁 rtoax 2021年3月 在英文原文基础上,针对中文译文增加5.10.13内核源码相关内容. 1. Linux 内核中的同步原 ...
- 简单谈一点linux内核中套接字的bind机制--数据结构以及端口确定
众所周知,创建一个套接字可以bind到一个特定的ip地址和端口,实际上套接字这一概念代表了TCP/IP协议栈的应用层标识,协议栈中的应用层就是通过一个ip地址和一个端口号标识的,当然这仅仅是对于TCP ...
- Linux 内核中的 GCC 特性(zz)
from:http://www.ibm.com/developerworks/cn/linux/l-gcc-hacks/ GCC 和 Linux 是出色的组合.尽管它们是独立的软件,但是 Linux ...
- linux 信号量锁 内核,Linux内核中锁机制之信号量、读写信号量
在上一篇博文中笔者分析了关于内存屏障.读写自旋锁以及顺序锁的相关内容,本篇博文将着重讨论有关信号量.读写信号量的内容. 六.信号量 关于信号量的内容,实际上它是与自旋锁类似的概念,只有得到信号量的进程 ...
- Linux内核中常见内存分配函数
1. 原理说明 Linux内核中采用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系统中,用到了四级页表,如图2-1所示.四级页表分 ...
- Linux内核中内存分配函数
1.原理说明 Linux内核 中采 用了一种同时适用于32位和64位系统的内 存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系 统中,用到了四级页表,如图2-1所示.四级页表分别为 ...
最新文章
- Stormpath发布了简化移动和前端身份验证的客户端API
- OpenCASCADE绘制测试线束:数据交换命令之XDE 形状命令
- canal原理的一些学习-2(HA 模式搭建)
- Spark的Dataset操作
- 如何搭建SVN的服务器
- Intent Bundle页面跳转信息的传递
- 32位mysql安装包_MySQL安装指南(CPT103)
- P2839 [国家集训队]middle 二分 + 主席树 在值域上建区间
- iOS自定义从底部弹上来的View
- 模糊测试——强制发掘安全漏洞的利器(Jolt 大奖精选丛书)
- 倒计时的js实现 倒计时 js Jquery
- 最好用的十六进制编辑器010 Editor
- 微信小程序开发者工具获取不到坐标
- html 空格 正则表达式,正则表达式清除空格和html标签中的 空格
- 【UI设计No9】VI
- 矩阵计算在计算机科学中,开发者必读:计算机科学中的线性代数
- idea项目管理github无法登陆
- xpath 准确匹配 跟 模糊匹配属性
- 中国计算机科学发展,中国计算机的发展趋势
- 【转】windows环境下安装win8.1+Mac OS X 10.10双系统教程
热门文章
- tensorflow环境下的识别食物_Tensorflow object detection API 搭建属于自己的物体识别模型——环境搭建与测试...
- python xlsxwriter 画图_Python XlsxWriter模块Chart类用法实例分析
- 赋值后页面不渲染_第七节:框架搭建之页面静态化的剖析
- 【CV春季划】170分钟学习OpenCV与经典图像处理算法基础
- 全球及中国陶瓷脐轮行业投资份额及需求前景调研报告2021-2027年版
- 如何使用live writer客户端来发布CSDN的博客文章?
- java邮箱找回密码_Spring实现简单的邮箱找回密码功能
- openresty开发系列38--通过Lua+Redis 实现动态封禁IP
- Callable和Future、FutureTask的使用
- 常用的meta标签总结