年初在维护一个http server程序的时候,发现5u下性能比4u下降了一倍不止。最后通过程序埋点的方法确认,问题出在calloc调用上。程序上有一段逻辑,每来一个链接,通过calloc申请一块2M的空间,在5u下calloc性能下降厉害。当时通过malloc+字段实例化的方式替换了calloc,解决了这个问题,没有太往下纠结。

今天收到封邮件,也是程序从4u升级到5u下,性能下降严重,最后定位到也是calloc的问题;但他们更进一步,分析了为啥calloc性能会下降,很不错,这里分享下。

大致的意思是:calloc性能下降是由于glibc版本不同引起的,在5u下内存分配的策略和4u不同。内存分配有两种方式:brk调用,或mmap调用;对于小空间一般在brk中分配,大空间通过mmap分配。在4u中,大小空间的阀值是定死的128K,在5u下这个阀值是动态调整的,最大可以到32M。由于分配的都是大空间,由于这个策略调整,在4u下calloc空间是通过mmap获得的,5u下是通过brk获得的。mmap分配的空间有一个特点:不发生读写操作是不会分配实际物理内存的;加载内存时,系统会把page全部清零。所以在4u下,calloc分配大内存的效率跟malloc效率差不多;而在5u下,由于在brk中分配,必须要做一次清零操作;这就是问题了。

从应用上,建议不要使用calloc函数,而改用malloc+实例化。

先简要总结一下速度降低的原因:

1.        4u和5u的glibc版本不同,分别是2.3.4和2.5.

2.        glibc中内存分配使用的是ptmalloc,ptmalloc在2006年有一个改动,体现到了glibc2.5中,以前(glibc2.3.4)触发mmap的阈值是固定的,是128K,超过128K的内存申请都是通过mmap申请的,小于128k的内存申请使用brk;这次改动(glibc2.5)对于mmap的使用是动态调整阈值的,默认是128K,但是如果有超过128K的内存通过mmap申请、释放,那么触发mmap的阈值会被调整,有可能会变大。 这个调整的原因是因为mmap的开销比较大,而且现在内存也越 来越便宜,频繁分配临时内存也比以前大,所以系统更倾向于使用brk来降低开销。如果用户申请了大内 存又释放了,那么系统认为,可能这个程序对大内存的申请和释放是平常的事情,所以会把mmap的阈值调大,减小mmap的调用次数,改用开销更小的brk。

3.        malloc不负责将申请的内存区域清零,但calloc负责。

4.        内核在分配匿名页时为了保证安全,不会被这个进程读到其他进程已经释放的空间,会做清零的工作。但如果分配的不是匿名页,比如是由mmap文件导致的分配页,不会清零。对 于mmap申请的匿名页内存的清零,是发生 在缺页时,由操作系统保证。brk分配的内存,需要calloc自己清零。

5.        如果没有写内存,只是mmap申请了一块虚拟内存,不会发生缺 页,没有分配物理内存,也不会引起清零的操作。一般操作系统中4k为1页。

6.        pidmatch由于逻辑调整,以前每次调用需要 申请一块超过128k的内存,且通过calloc调用。但现在实际上不需要那么大 内存,申请了也没有写那么多页。所以在glibc2.3.4下,通过mmap申请内存,但没有触发很多缺页, 所以其实很多清零的操作也没有做,而在glibc2.5下 面,触发mmap的阈值会自动变大,通过brk来分配内存,无论是否写了内存, 都会做清零操作,所以导致模块变大,性能下降。本来是ptmalloc一个改进的设计,但由于程序使用 不当,优点倒成了缺点。

7.        改进方法:由于模块实际不需要那么多内存,且现在也不需要清零,所以将申请内存改小,从使用calloc改为使用malloc,性能恢复到4u的状态。

calloc在4u和5u上性能差异的分析相关推荐

  1. R语言使用caretEnsemble包的caretList函数一次性构建多个机器学习模型、使用lattice包的bwplot函数使用箱图对比多个模型在多个指标上的性能差异

    R语言使用caretEnsemble包的caretList函数一次性构建多个机器学习模型.并使用caret包的resamples函数比较在同一数据集上多个机器学习模型的比较结果.使用lattice包的 ...

  2. 固态硬盘和机械硬盘的比较和SQLSERVER在两种硬盘上的性能差异

    固态硬盘和机械硬盘的比较和SQLSERVER在两种硬盘上的性能差异 在看这篇文章之前可以先看一下下面的文章: SSD小白用户收货!SSD的误区如何解决 这样配会损失性能?实测6种特殊装机方式 听说固态 ...

  3. mysql固态硬盘和机械硬盘的区别_固态硬盘和机械硬盘的比较和SQLSERVER在两种硬盘上的性能差异...

    固态硬盘和机械硬盘的比较和SQLSERVER在两种硬盘上的性能差异 在看这篇文章之前可以先看一下下面的文章: SSD小白用户收货!SSD的误区如何解决 这样配会损失性能?实测6种特殊装机方式 听说固态 ...

  4. Mysql之count(*),count(1),count(field)区别、性能差异

    目录 前言 COUNT(*)与 COUNT(1) MyISAM引擎中的COUNT(*)与 COUNT(1) Innodb引擎中的COUNT(*)与 COUNT(1) 实验 原理 结论 Count(1) ...

  5. MySQL数据库az排序_RDS Mysql Single-AZ和Multi-AZ性能差异

    RDS Mysql Single-AZ和Multi-AZ性能差异 发布时间:2020-07-14 22:56:21 来源:51CTO 阅读:4401 作者:hsbxxl 高可用性,是很多数据库工程师/ ...

  6. DL之DNN优化技术:自定义MultiLayerNet【5*100+ReLU】对MNIST数据集训练进而比较三种权重初始值(Xavier参数初始化、He参数初始化)性能差异

    DL之DNN优化技术:自定义MultiLayerNet[5*100+ReLU]对MNIST数据集训练进而比较三种权重初始值(Xavier参数初始化.He参数初始化)性能差异 导读 #思路:观察不同的权 ...

  7. Java语言与C++语言在作用域上的差异

    Java语言与C++语言是目前最流行的编程语言.两者的编程思想虽然有一定的共同性,但是在很多方面仍然存在着比较大的差异.如两者在作用域上仍然存在着很大的差异.下面笔者就分析一下这两门语言在作用域上的差 ...

  8. sql in转换为join_同一个SQL语句,为啥性能差异咋就这么大呢?(1分钟系列)

    <数据库允许空值,往往是悲剧的开始>一文通过explain来分析SQL的执行计划,来分析null对索引命中情况的影响,有不少朋友留言,问explain结果中的type字段,ref,ALL等 ...

  9. 比较一下以“反射”和“表达式”执行方法的性能差异【转】

    由于频繁地使用反射会影响性能,所以ASP.NET MVC采用了表达式树的方式来执行目标Action方法.具体来说,ASP.NET MVC会构建一个表达式来体现针对目标Action方法的执行,并且将该表 ...

最新文章

  1. 【斗医】【18】Web应用开发20天
  2. 运行错误5无效的过程调用或参数_FANUC系统常用参数汇总
  3. linux多台主机对比文件大小,Linux主机df和du出来的文件和磁盘大小不相同
  4. 中国电信完成雷神山1672部固话装机任务
  5. 2019年终总结-如果这是一场电影
  6. 多屏互动电脑版_手机、电脑屏幕太小怎么办?这4招秒变大屏
  7. 解决body设置height:100%无效问题
  8. 开发类似vs的界面_C#会不会成为移动开发最便捷的语言?
  9. 2021SC@SDUSC Zxing开源代码(十六)PDF417二维码(二)
  10. 两矩阵相乘的秩的性质_浅析数学中的行列式与矩阵
  11. 如何导出久其报表所有数据_久其报表不能传输怎么办?
  12. Android Jetpack系列--8. DataStore使用详解
  13. IERS EOP 文件的解读
  14. “鲁班”画海报、“小蜜”当客服,“菜鸟”管物流……,双十一阿里黑科技知多少...
  15. 跟着猫哥学Golang[8] - 函数
  16. Docker从入门到放弃------docker的安装与初始化配置
  17. 文件或目录损坏且无法读取 删除不了 错误0x80070091:目录不是空的 解决方案
  18. linux超级管理员名字修改,linux添加超级管理员用户,修改,删除用户
  19. php resque demo,php-resque 极简php消息队列
  20. Java线程状态详解

热门文章

  1. 联想G50-75M 拆解(含视频链接),加内存加硬盘CPU加硅脂
  2. GDAL:创建栅格图像
  3. WRF应用:天气预报、模拟分析观测气温、降水、风场、水汽和湿度、土地利用变化、土壤及近地层能量水分通量、土壤、水体、植被等相关气象变量
  4. 简易电子琴设计(琴键、预设、录制、回放)
  5. (指针处理)有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。
  6. Unity之手机重力感应(Input.acceleration)
  7. excel数据库_条码打印软件如何批量打印Excel中的指定数据
  8. spring 事务应用误区总结:那些导致事务不回滚的坑
  9. 计算机操作员职业资格证书考试,国家职业资格计算机操作员考试指引.DOC
  10. iqooneo3 如何不用vivo账号下载外部应用_vivo遭大量家长投诉背后:利益凌驾责任之上...