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

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

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

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

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

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

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

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

ps:

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

linux 内核中一个全局变量引发的性能问题的更多相关文章

  1. Linux内核中的信号机制--一个简单的例子【转】

    本文转载自:http://blog.csdn.net/ce123_zhouwei/article/details/8562958 Linux内核中的信号机制--一个简单的例子 Author:ce123 ...

  2. Linux内核中锁机制之原子操作、自旋锁

    很多人会问这样的问题,Linux内核中提供了各式各样的同步锁机制到底有何作用?追根到底其实是由于操作系统中存在多进程对共享资源的并发访问,从而引起了进程间的竞态.这其中包括了我们所熟知的SMP系统,多 ...

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

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

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

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

  5. Linux内核中的fastcall和asmlinkage宏

    代码中看见:#define _fastcall 所以了解下fastcall -------------------------------------------------------------- ...

  6. Linux内核中链表实现

    关于双链表实现,一般教科书上定义一个双向链表节点的方法如下: struct list_node{ stuct list_node *pre; stuct list_node *next; ElemTy ...

  7. Linux内核中常见内存分配函数【转】

    转自:http://blog.csdn.net/wzhwho/article/details/4996510 1.      原理说明 Linux内核中采用了一种同时适用于32位和64位系统的内存分页 ...

  8. Linux内核中锁机制之RCU、大内核锁

    在上篇博文中笔者分析了关于完成量和互斥量的使用以及一些经典的问题,下面笔者将在本篇博文中重点分析有关RCU机制的相关内容以及介绍目前已被淘汰出内核的大内核锁(BKL).文章的最后对<大话Linu ...

  9. Linux内核中锁机制之内存屏障、读写自旋锁及顺序锁

    在上一篇博文中笔者讨论了关于原子操作和自旋锁的相关内容,本篇博文将继续锁机制的讨论,包括内存屏障.读写自旋锁以及顺序锁的相关内容.下面首先讨论内存屏障的相关内容. 三.内存屏障 不知读者是是否记得在笔 ...

随机推荐

  1. [UE4]基于物理的材质

    基于物理的材质可以产生更准确并且通常更加自然的外观,在所有照明环境中都可以同样完美地工作! 官方说明

  2. T-SQL 事务2

    启用事务完成转账存储过程 use StudentManager go if exists(select * from sysobjects where name='usp_TransferAccoun ...

  3. Java基础知识_毕向东_Java基础视频教程笔记(22-25 GUI 网络编程 正则)

    22天-01-GUIGUI:Graphical User Interface 图形用户接口 Java为GUI提供的对象都存在java.Awt和javax.Swing两个包中CLI:Common lin ...

  4. make install 时指定安装路径

    The  make install target dir is representationed by var :  DESTDIR, if we set this var to the locati ...

  5. json - 内容中需处理的特殊字符(转)

    转 http://blog.csdn.net/icewizardry/article/details/17265267 protected string RemoveIllegalCharacterF ...

  6. 学习js第三天小结

    1.冒泡排序分析: 例:将数组[9,8,7,6,5,4,3,2,1,0]按照从小打大的顺序进行冒泡排序. 演变过程: 第一趟: 8,7,6,5,4,3,2,1,0,9    比较了9次: 第二趟: 7 ...

  7. python连接RabbitMQ

    安装PIP wget "https://pypi.python.org/packages/source/p/pip/pip-1.5.4.tar.gz tar -xzvf pip-.tar.g ...

  8. 导入sql文件报错:1071 Specified key was too long; max key length is 767 bytes

    ref: https://stackoverflow.com/questions/1814532/1071-specified-key-was-too-long-max-key-length-is-7 ...

  9. redis下操作hash对象

    redis下操作hash对象 hash用于存储对象,对象的格式为键值对 命令 设置 设置单个属性 HSET key field value 设置多个属性 HMSET key field value [ ...

  10. 一个全栈Web/移动App开发学习路径

    HTML.CSS 和 JavaScript 网页开发的基本元素,包括HTML.CSS个JavaScript.本课程完全适合零基础的同学,当然如果你有相关开发经验更好.在课程开始呢,我们先探索与讨论HT ...