0

0

Redis在内存分配和使用统计的技巧有哪些

WBOY

WBOY

发布时间:2023-05-27 19:44:24

|

1011人浏览过

|

来源于亿速云

转载

  具体来说就是:

  若系统中存在Google的TC_MALLOC库,则使用tc_malloc一族函数代替原本的malloc一族函数。

  若当前系统是Mac系统,则使用中的内存分配函数。

  其他情况,在每一段分配好的空间前头,同时多分配一个定长的字段,用来记录分配的空间大小。

  源代码分别在 config.h 和 zmalloc.c 中:

  /* config.h */

  #if defined(USE_TCMALLOC)

  #include

  #if TC_VERSION_MAJOR >= 1 && TC_VERSION_MINOR >= 6

  #define HAVE_MALLOC_SIZE 1

  #define redis_malloc_size(p) tc_malloc_size(p)

  #endif

  #elif defined(__APPLE__)

  #include

  #define HAVE_MALLOC_SIZE 1

  #define redis_malloc_size(p) malloc_size(p)

  #endif

  /* zmalloc.c */

  #ifdef HAVE_MALLOC_SIZE

  #define PREFIX_SIZE (0)

  #else

  #if defined(__sun)

  #define PREFIX_SIZE (sizeof(long long))

  #else

  #define PREFIX_SIZE (sizeof(size_t))

  #endif

  #endif

  因为 tc_malloc 和 Mac平台下的 malloc 函数族提供了计算已分配空间大小的函数(分别是tc_malloc_size和malloc_size),所以就不需要单独分配一段空间记录大小了。而针对linux和sun平台则要记录分配空间大小。对于linux,使用sizeof(size_t)定长字段记录;对于sun os,使用sizeof(long long)定长字段记录。也就是上边源码中的 PREFIX_SIZE 宏。

重新表达这句话: 这个记录的作用在于计算当前进程占用了多少内存。在 zmalloc.c 中,有这样一个静态变量:

  static size_t used_memory = 0;

  它记录了进程当前占用的内存总数。每当要分配内存或是释放内存的时候,都要更新这个变量。因为分配内存的时候,可以明确知道要分配多少内存。但是释放内存的时候,(对于未提供malloc_size函数的平台)仅通过指向要释放内存的指针是不能知道释放的空间到底有多大的。在这种情况下,PREFIX_SIZE所规定的固定长度字段就有了作用,通过其中记录的信息可以得出空间的大小。zmalloc函数如下(去掉无关代码):

  void *zmalloc(size_t size) {

  void *ptr = malloc(size+PREFIX_SIZE);

  if (!ptr) zmalloc_oom(size);

  *((size_t*)ptr) = size;

  update_zmalloc_stat_alloc(size+PREFIX_SIZE,size);

MediPro网上书店系统
MediPro网上书店系统

基于PHP+MYSQL开发,除了网上书店必备的商品管理、配送支付管理、订单管理、会员分组、会员管理、查询统计和多项商品促销功能,还具有完整的文章、图文、下载、单页、广告发布等网站内容管理功能。系统具有静态HTML生成、UTF-8多语言支持、可视化模版引擎等技术特点,支持多频道调用不同模版和任意设置频道首页,适合建立各种规模的网上书店。系统具有以下主要功能模块: 网站参数设置 - 对网站的一些参数进

下载

  return (char*)ptr+PREFIX_SIZE;

  #endif

  }

  Redis在内存分配和使用统计方面有哪些技巧

当分配空间时,注意空间大小要加上PREFIX_SIZE。当运行在Mac系统或使用tc_malloc时,PREFIX_SIZE的值为零。接下来会将指针ptr所指向的内存块的前面size_t个字节用于记录该内存块的分配大小。最后返回的是越过记录区的指针。zfree函数类似(去掉无关代码):

  void zfree(void *ptr) {

  void *realptr;

  size_t oldsize;

  if (ptr == NULL) return;

  realptr = (char*)ptr-PREFIX_SIZE;

  oldsize = *((size_t*)realptr);

  update_zmalloc_stat_free(oldsize+PREFIX_SIZE);

  free(realptr);

  #endif

  }

  先将指针向前移动PREFIX_SIZE,然后取出分配空间时保存的空间长度。最后free整个空间。

  update_zmalloc_stat_alloc(__n,__size) 和 update_zmalloc_stat_free(__n) 这两个宏负责在分配内存或是释放内存的时候更新used_memory变量。定义成宏主要是出于效率上的考虑。将其还原为函数,就是下边这个样子:

  void update_zmalloc_stat_alloc(__n,__size)

  {

  do {

  size_t _n = (__n);

  size_t _stat_slot = (__size ZMALLOC_MAX_ALLOC_STAT) return 0;

  return zmalloc_allocations[size];

  }

  另一个对内存使用量的统计通过调用 zmalloc_used_memory 函数返回:

  size_t zmalloc_used_memory(void) {

  size_t um;

  if (zmalloc_thread_safe) pthread_mutex_lock(&used_memory_mutex);

  um = used_memory;

  if (zmalloc_thread_safe) pthread_mutex_unlock(&used_memory_mutex);

  return um;

  }

  另外 zmalloc.c 中,还针对不同的系统实现了 zmalloc_get_rss 函数,在linux系统中是通过读取/proc/$pid/stat文件获得系统统计的内存占用量。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

231

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

435

2024.03.01

typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

107

2023.09.26

define的用法
define的用法

define用法:1、定义常量;2、定义函数宏:3、定义条件编译;4、定义多行宏。更多关于define的用法的内容,大家可以阅读本专题下的文章。

327

2023.10.11

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

723

2023.08.22

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

83

2023.09.25

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

174

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

95

2025.11.27

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

3

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
进程与SOCKET
进程与SOCKET

共6课时 | 0.3万人学习

Redis+MySQL数据库面试教程
Redis+MySQL数据库面试教程

共72课时 | 6.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号