美文网首页
性能-内存频繁分配

性能-内存频繁分配

作者: GOGOYAO | 来源:发表于2020-05-30 00:16 被阅读0次

[TOC]

参考

本文主要摘抄自频繁分配释放内存导致的性能问题的分析

现象

  1. 压力测试过程中,发现被测对象性能不够理想,具体表现为:
    进程的系统态CPU消耗20,用户态CPU消耗10,系统idle大约70
  2. 用ps -o majflt,minflt -C program命令查看(pidstat也可以),发现majflt每秒增量为0,而minflt每秒增量大于10000。

此进程minflt如此之高,一秒10000多次,不得不怀疑它跟进程内核态cpu消耗大有很大关系。

分析

查看代码,发现是这么写的:一个请求来,用malloc分配2M内存,请求结束后free这块内存。看日志,发现分配内存语句耗时10us,平均一条请求处理耗时1000us 。 原因已找到!

虽然分配内存语句的耗时在一条处理请求中耗时比重不大,但是这条语句严重影响了性能。要解释清楚原因,需要先了解一下内存分配的原理。可见内存分配(malloc)的过程

了解完内存分配的原理,那么被测模块在内核态cpu消耗高的原因就很清楚了:每次请求来都malloc一块2M(大于128k)的内存,默认情况下,malloc调用mmap分配内存,请求结束的时候,调用munmap释放内存。假设每个请求需要6个物理页,那么每个请求就会产生6个缺页中断,

在2000的压力下,每秒就产生了10000多次缺页中断,这些缺页中断不需要读取磁盘解决,所以叫做minflt;缺页中断在内核态执行,因此进程的内核态cpu消耗很大。缺页中断分散在整个请求的处理过程中,所以表现为分配语句耗时(10us)相对于整条请求的处理时间(1000us)比重很小。

解决办法

  • 将动态内存改为静态分配,或者启动的时候,用malloc为每个线程分配,然后保存在threaddata里面。但是,由于这个模块的特殊性,静态分配,或者启动时候分配都不可行。另外,Linux下默认栈的大小限制是10M,如果在栈上分配几M的内存,有风险。
  • 禁止malloc调用mmap分配内存,禁止内存紧缩。
    在进程启动时候,加入以下两行代码:
    mallopt(M_MMAP_MAX, 0); // 禁止malloc调用mmap分配内存
    mallopt(M_TRIM_THRESHOLD, -1); // 禁止内存紧缩
    效果:加入这两行代码以后,用ps命令观察,压力稳定以后,majlt和minflt都为0。进程的系统态cpu从20降到10。
  • 使用现有的内存池,比如tcmalloc

相关文章

  • 性能-内存频繁分配

    [TOC] 参考 本文主要摘抄自频繁分配释放内存导致的性能问题的分析 现象 压力测试过程中,发现被测对象性能不够理...

  • 关于网络编程的思考

    考虑三个方面,高性能,高并发,大处理量, 内存池 或合理的内存预分配,减少内存频繁的分配释放,避免内存碎片,可存储...

  • iOS 性能优化 - Allocations分析内存分配

    iOS 性能优化 - Allocations分析内存分配 iOS 性能优化 - Allocations分析内存分配

  • malloc

    频繁分配释放内存导致的性能问题的分析 现象 1 压力测试过程中,发现被测对象性能不够理想,具体表现为: 进程的系统...

  • 吐血整理!究极深入Android内存优化(二)

    四、内存抖动 当 内存频繁分配和回收 导致内存 不稳定,就会出现内存抖动,它通常表现为 频繁GC、内存曲线呈锯齿状...

  • Android 内存抖动介绍及实例演示

    一、内存抖动介绍 定义:内存频繁分配和回收导致内存不稳定表现:频繁 GC、内存曲线呈锯齿状危害:导致卡顿、OOM ...

  • 三十天自制操作系统(4)

    第十天 内存管理中分配内存的函数虽然提供了以字节为单位进行内存分配的函数,但是也可能会造成频繁分配内存和释放内存造...

  • 第4篇:C++ 高效的string_view

    string对象的性能问题 了解string对象的内存分配行为后,接下来我们如何考虑使用什么方法来避免字符串频繁的...

  • go-内存机制(3)

    go的内存分配 Golang有一套自己的内存管理机制,自主的去完成内存分配、垃圾回收、内存管理等过程,从而避免频繁...

  • java程序的性能优化(一)

    程序性能分几个方面 执行速度 内存分配 启动时间 负载承受能力 性能的参考指标 执行时间 cpu时间 内存分配 磁...

网友评论

      本文标题:性能-内存频繁分配

      本文链接:https://www.haomeiwen.com/subject/pncuahtx.html