[转帖]性能-内存频繁分配

性能,内存,频繁,分配 · 浏览次数 : 0

小编点评

**问题分析:** * 进程的系统态CPU消耗20,用户态CPU消耗10,系统idle大约70用ps -o majflt,minflt -C program命令查看。 * majflt每秒增量为0,而minflt每秒增量大于10000。 **原因分析:** * minflt如此之高,一秒10000多次,不得不怀疑它跟进程内核态cpu消耗大有很大关系。 * malloc调用mmap分配内存,默认情况下,malloc调用mmap分配内存,请求结束的时候,调用munmap释放内存。 * 缺页中断分散在整个请求的处理过程中,所以表现为分配语句耗时(10us)相对于整条请求的处理时间(1000us)比重很小。 **解决办法:** * 将动态内存改为静态分配,或者启动的时候,用malloc为每个线程分配,然后保存在threaddata里面。 * 使用现有的内存池,比如tcmalloc。 **其他建议:** * 避免使用malloc调用mmap分配内存。 * 禁止内存紧缩。 * 加入以下两行代码:`mallopt(M_MMAP_MAX, 0); // 禁止malloc调用mmap分配内存`和`mallopt(M_TRIM_THRESHOLD, -1); // 禁止内存紧缩效果:加入这两行代码以后,用ps命令观察,压力稳定以后,majlt和minflt都为0。

正文

https://www.jianshu.com/p/599f132192f7

 

参考

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

现象

  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

与[转帖]性能-内存频繁分配相似的内容:

[转帖]性能-内存频繁分配

https://www.jianshu.com/p/599f132192f7 参考 本文主要摘抄自频繁分配释放内存导致的性能问题的分析 现象 压力测试过程中,发现被测对象性能不够理想,具体表现为:进程的系统态CPU消耗20,用户态CPU消耗10,系统idle大约70 用ps -o majflt,mi

[转帖]性能-内存频繁分配

https://www.jianshu.com/p/599f132192f7 参考 本文主要摘抄自频繁分配释放内存导致的性能问题的分析 现象 压力测试过程中,发现被测对象性能不够理想,具体表现为:进程的系统态CPU消耗20,用户态CPU消耗10,系统idle大约70 用ps -o majflt,mi

[转帖]性能优化:频繁分配和释放内存导致的问题

https://zhuanlan.zhihu.com/p/596366375 现象 1 压力测试过程中,发现被测对象性能不够理想,具体表现为: 进程的系统态CPU消耗20,用户态CPU消耗10,系统idle大约70。 2 用ps -o majflt,minflt -C program命令查看,发现m

[转帖]频繁分配释放内存导致的性能问题的分析

https://cloud.tencent.com/developer/article/1420726 现象 1 压力测试过程中,发现被测对象性能不够理想,具体表现为: 进程的系统态CPU消耗20,用户态CPU消耗10,系统idle大约70 2 用ps -o majflt,minflt -C pro

[转帖]043、TiDB特性_缓存表和分区表

针对于优化器在索引存在时依然使⽤全表扫描的情况下,使⽤缓存表和分区表是提升查询性能的有效⼿段。 缓存表 缓存表是将表的内容完全缓存到 TiDB Server 的内存中表的数据量不⼤,⼏乎不更改读取很频繁缓存控制: ALTER TABLE table_name CACHE|NOCACHE; # 使用t

[转帖]Linux中的Page cache和Buffer cache详解

1、内存情况 在讲解Linux内存管理时已经提到,当你在Linux下频繁存取文件后,即使系统上没有运行许多程序,也会占用大量的物理内存。这是因为当你读写文件的时候,Linux内核为了提高读写的性能和速度,会将文件在内存中进行缓存,这部分内存就是Cache Memory(缓存内存)。即使你的程序运行结

【转帖】linux 调优篇 :硬件调优(BIOS配置)* 壹

一. 设置内存刷新频率为Auto二. 开启NUMA三. 设置Stream Write Mode四. 开启CPU预取配置五. 开启SRIOV六. 开启SMMU 通过在BIOS中设置一些高级选项,可以有效提升虚拟化平台性能。表1列出了TaiShan服务器和性能相关的BIOS推荐配置项。 表1 BIOS性

[转帖]linux 调优篇 :硬件调优(BIOS配置)* 壹

https://blog.csdn.net/tony_vip?type=blog 一. 设置内存刷新频率为Auto二. 开启NUMA三. 设置Stream Write Mode四. 开启CPU预取配置五. 开启SRIOV六. 开启SMMU 通过在BIOS中设置一些高级选项,可以有效提升虚拟化平台性能

[转帖]INTEL MLC(Memory Latency Checker)介绍

https://zhuanlan.zhihu.com/p/359823092 在定位机器性能问题的时候,有时会觉得机器莫名其妙地跑的慢,怎么也看不出来问题。CPU频率也正常,程序热点也没问题,可就是慢。这时候可以检查一下内存的访问速度,看看是不是机器的内存存在什么问题。Intel Memory La

[转帖](二)固态硬盘有哪几种接口?

https://zhuanlan.zhihu.com/p/411707070 固态硬盘的强悍性能以及价格不断走低的亲民化趋向,使得越来越多的用户开始考虑为新老PC进行硬盘更新。然而,作为新兴产业线,固态硬盘不同于内存和CPU等接口频率等标准早已完善的成熟规范的行业,固态硬盘在接口等标准上,根据不同大