一文了解Memcache内存分配机制及stats参数

一、Memcache内存分配机制

了解memcached必须了解的三个单位:page、slabs、chunk。

1.1、Page

     Page为内存分配的最小单位,Memcached的内存分配以page为单位,默认情况下一个page是1M,可以通过-I参数在启动时指定。如果需要申请内存 时,memcached会划分出一个新的page并分配给需要的slab区域。page一旦被分配在重启前不会被回收或者重新分配

1.2、Slabs

Memcached并不是将所有大小的数据都放在一起的,而是预先将数据空间划分为一系列slabs,既按照不同的大小,每个slab只负责一定范围内的数据存储。如 下图,每个slab只存储大于其上一个slab的size并小于或者等于自己最大size的数据。例如:slab 3只存储大小介于137 到 224 bytes的数据。如果一个数据大小为230byte将被分配到slab 4中。从下图可以看出,每个slab负责的空间其实是不等的,memcached默认情况下下一个slab的最大值为前一个的1.25倍,这个可以通过修 改-f参数来修改增长比例。 

1.3、Chunk

Chunk才是存放缓存数据的单位Chunk是一系列固定的内存空间,这个大小就是管理它的slab的最大存放大小。例如:slab 1的所有chunk都是104byte,而slab 4的所有chunk都是280byte。chunk是memcached实际存放缓存数据的地方,因为chunk的大小固定为slab能够存放的最大值, 所以所有分配给当前slab的数据都可以被chunk存下。如果存储数据大小小于chunk的大小,空余的空间将会被闲置,这个是为了防止内存碎片而设 计的。例如下图,chunk size是224byte,而存储的数据只有200byte,剩下的24byte将被闲置。 

1.4、了解Slab的内存分配策略

Memcached在启动时通过-m指定最大使用内存,但是这个不会一启动就占用,是随着需要逐步分配给各slab的。如果一个新的缓存数据要被存放,memcached首先选择一个合适的slab,然后查看该slab是否还有空闲的chunk,如果有则直接存放进去;如 果没有则要进行申请。slab申请内存时以page为单位,所以在放入第一个数据,无论大小为多少,都会有1M大小的page被分配给该slab。申请到 page后,slab会将这个page的内存按chunk的大小进行切分,这样就变成了一个chunk的数组,在从这个chunk数组中选择一个用于存储 数据。如下图,slab 1和slab 2都分配了一个page,并按各自的大小切分成chunk数组。 

综合上面的介绍memcached的内存分配策略就是:按slab需求分配page,各slab按需使用chunk存储。Memcached分配出去的page不会被回收或者重新分配Memcached申请的内存不会被释放slab空闲的chunk不会借给任何其他slab使用。理解memcached的分别策略以后就可以理解为什么总内存没有被全部占用的情况下,memcached却出现了丢失缓存数据的问题了。

二、memcached命令及参数解释

2.1、stats

Name

Meaning

pid

memcached 服务器的进程 id 号

uptime

memcached 自启动至今的时长(按秒计算)

time

服务器当前的 UNIX 时间戳

version

memcached 的版本号字符串

pointer_size

默认的服务器操作系统指针尺寸(一般为 32 或 64)

rusage_user

mcached 进程用户态的累计时长(秒:毫秒)

rusage_system

memcached 进程内核态的累计时长(秒:毫秒)

curr_items

memcached 当前存储的对象数量

total_items

memcached 自启动至今存储过的对象数量

bytes

emcached 当前用来存储数据所消耗的内存量(字节)

curr_connections

memcached 当前打开的连接

total_connections

memcached 自启动至今打开过的连接数

connection_structures

memcached 分配的连接结构的数量

cmd_get

get 命令的总次数

cmd_set

set 命令的总次数

get_hits

get 命令命中的总次数

get_misses

get 命令未命中的总次数

delete_misses

delete 命令未命中的总次数

delete_hits

delete 命令命中的总次数

incr_misses

incr 命令未命中的总次数

incr_hits

incr 命令命中的总次数

decr_misses

decr 命令未命中的总次数

decr_hits

decr 命令命中的总次数

cas_misses

cas 命令未命中的总次数

cas_hits

cas 命令命中的总次数

cas_badval

cas 命令命中却更新失败的总次数

auth_cmds

memcached 接受到所有的授权命令,无论成功失败

auth_errors

memcached 接受到的所有失败的授权命令

evictions

因 LRU 机制而被主动覆盖(删除)的对象数目

reclaimed

memcached 启动至今有多少次在存储数据的时候使用了过期数据的空间

bytes_read

memcached 从网络中读取的总数据字节数

bytes_written

memcached服务器发送到网络的总的字节数

limit_maxbytes

memcached 向网络中写入的总数据字节数

threads

worker 线程数量(具体请查看 doc/threads.txt)

conn_yields

memcached 启动至今有多少次打开的连接因为内部请求数达到 -R 参数指定的限值, 一个连接的操作主动放弃让给另一个连接(不是很明白什么意思,具体可以参考 -R 参数的含义)

2.2、stats settings

Name

Meaning

maxbytes

memcached 可分配的最大缓存内存字节数

maxconns

memcached 允许的连接数最大数值

tcpport

TCP 监听端口

udpport

UDP 监听端口

inter

监听的 host 地址

verbosity

memcached 运行信息输出级别:0 = none, 1 = some, 2 = lots

oldest

memcached 当前存储的对象中最长的存活时长

evictions

当设成 off 的时候,LRU 机制将不会启用

domain_socket

Unix socket 的文件路径(如果存在的话)

umask

创建 Unix socket 的 umask

growth_factor

Chunk 尺寸增长因子数值

chunk_size

最小的 chunk 尺寸(key+value+flags)

num_threads

线程数量(包括 dispatch 的)

stat_key_prefix

Stats 命令分隔符

detail_enabled

如果 yes 的话,stats 的详细信息将被开启

reqs_per_event

一个事件(event)中允许的最大 IO 操作数

cas_enabled

如果 no 的话,CAS 不会被启用

tcp_backlog

CP 监听队列(backlog)等待长度的最大值

auth_enabled_sasl

是否启用 SASL 授权请求

2.3、stats items

Name

Meaning

number

当前 slab 中存储的对象数量,过期的对象不会主动被排除出去

age

LRU 中存活时间最长的对象的存活时长

evicted

根据 LRU 原则不得不在过期之前就被删除的对象的个数

evicted_nonzero

根据 LRU 原则不得不在过期之间就被删除,且有被设过过期时间的对象个数

evicted_time

根据 LRU 原则不得不在过期之间就被删除,且有被设过过期时间的对象个数,用这个来做 LRU 的频率监控

outofmemory

该 slab 无法为新对象分配内存空间的次数,出现这个数值意味着memcached 在运行的时候带上了-M参数或者存在 LRU 删除失败

tailrepairs

这个数值表示了我们自己解决的 slab 引用泄露的次数,如果这个数值增长很多,请联系开发人员

reclaimed

memcached 使用一个过期数据的空间来存储数据的次数

2.4、stats sizes


    这个stats命令将会返回存储在缓存内所有对象的尺寸和个数信息。 
    警告:这个命令将会锁死你的缓存!它会遍历缓存内存储的每个对象,并获取他们的尺寸。虽然这个命令速度很快,但是如果你的缓存里存储了很多对象的话,这个命令还是有可能会使你的缓存在几秒钟内无法进行任何缓存服务。 
    命令返回的格式为: STAT <size> <count> 
    这个命令会显示出,对于所有存储在你缓存中的对象,是否每32个字节就存在一个slab。你可以通过这个命令来查看,是否调整slab增长因子会节约你的内存开销。 
举例来说:如果你大部分的存储对象的尺寸是小于200字节的话,创建更多小尺寸的slab会使得存储对象找到更适合它们尺寸的slab。 

2.5、stats slabs

Name

Meaning

chunk_size

每个 chunk 占用的内存空间,一个存储对象将会寻找适合它尺寸的 chunk 来存储

chunks_per_page

当前数字说明了每个 page 可以划分成多少个 chunk,一个 page 默认大小小于等于1M,Slabs 申请的内存是按 page 分配的,接着按大小划分为 chunk

total_pages

当前 slab 所分配到的 page 总数

total_chunks

当前 slab 所分配到的 chunk 总数

get_hits

当前 slab 中命中的 get 请求数

cmd_set

当前 slab 接受的所有 set 命令请求数

delete_hits

当前 slab 中命中的 delete 请求数

incr_hits

当前 slab 中命中的 incr 请求数

decr_hits

当前 slab 中命中的 decr 请求数

cas_hits

当前 slab 中命中的 cas 请求数

cas_badval

当前 slab 中命中但是更新失败的 cas 请求数

used_chunks

已经被分配给存储对象的 chunk 数

free_chunks

还未被分配给存储对象,或通过 delete 操作释放出来的 chunk

free_chunks_end

最近分配的 Page 尾部空闲 chunk 数

mem_requested

当前 slab 中被请求用来存储对象数据的内存空间字节总数(注 1

active_slabs

memcached 分配的 slab 的总数

total_malloced

emcached 分配给所有 slab 的 pages 的内存总量


1:存储对象是被存储在尺寸等于或者大于对象尺寸的slab里的。mem_requested显示了当前slab里所有存储对象总占用的内存空间。 
(total_chunks * chunk_size) – mem_requested 的结果显示了有多少内存在这个slab里是被闲置的。如果你看到闲置的内存量很大, 考虑使用slab增长因子来调节slab大小,其中(used_chunks + free_chunks) * chunk_size就是用掉的chunks被分配到的内存空间,mem_requested是实际被占用掉的内存空间,两者的差值就是没有用掉的(闲置的)内存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/607233.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NeRF算法

目录 算法介绍 基本原理 1. 体渲染 2. 多层感知机&#xff08;MLP&#xff09; 3. 位置编码 4. 两阶段层次化体采样 实验展示 代码解析 算法介绍 NeRF&#xff08;Neural Radiance Fields&#xff09;是一种用于从2D图像中重建3D场景的神经网络模型。它通过训练一个深度…

sourceTree push失败

新电脑选择commit and push&#xff0c;报错了&#xff0c;不过commit成功&#xff0c;只不过push失败了。 原因是这个&#xff0c;PuTTYs cache and carry on connecting. 这里的ssh选择的是 PuTTY/Plink&#xff0c;本地没有这个ssh密钥&#xff0c;改换成openSSH&#xff…

SRM系统供应链库存协同提升企业服务水平

SRM系统供应链库存协同是一种以提高供应链整体效率和竞争力为目标的管理方法。它涉及到企业与供应商之间的紧密合作&#xff0c;以实现库存优化、成本降低、风险分担和灵活响应市场变化等目标。 一、SRM供应链库存协同的概念和特点 SRM供应链库存协同是指企业与供应商之间通过…

音转文工具,9.8k star! 【送源码】

我们经常会遇到将音频转为文字的情况&#xff0c;比如在开会时录音的会议纪要、上课时录下的老师讲课内容。虽然网上也有一些在线的工具可以将音频转为文字&#xff0c;但是考虑到数据安全和费用问题&#xff0c;使用起来也不是很方便。 今天了不起给大家介绍一款开源工具——…

毕业论文应该怎么写?推荐几款ai写论文工具

时间过的好快&#xff0c;马上又到了一年一度的毕业季了&#xff0c;对于即将毕业的学生来说毕业论文是一道难过的坎&#xff0c;想到自己为了毕业论文熬的夜&#xff0c;掉的头发&#xff0c;真的深有感触。 不过虽然翟博士给大家的毕业论文设了高门槛&#xff0c;但是随着时…

python之装饰器,模块和文件操作和面向对象

1.装饰器详解(重点) 1_1 装饰器 程序运行的时候的记录 -- 日志 在实际工作中&#xff0c;python这样的东西&#xff0c;是放在服务器上运行的 日志其实就是记录下来当前程序的运行&#xff0c;协助我们定位问题 确定问题的方式&#xff08;通过日志、报错信…

宏的优缺点?C++有哪些技术替代宏?(const)权限的平移、缩小

宏的优缺点&#xff1f; 优点&#xff1a; 1.增强代码的复用性。【减少冗余代码】 2.提高性能&#xff0c;提升代码运行效率。 缺点&#xff1a; 1.不方便调试宏。&#xff08;因为预编译阶段进行了替换&#xff09; 2.导致代码可读性差&#xff0c;可维护性差&#xff0…

Java线程池(更新中)

1.线程池介绍 顾名思义&#xff0c;线程池就是管理一系列线程的资源池&#xff0c;其提供了一种限制和管理线程资源的方式。每个线程池还维护一些基本统计信息&#xff0c;例如已完成任务的数量。 总结一下使用线程池的好处&#xff1a; 降低资源消耗。通过重复利用已创建的…

猎头告诉你正确的“离职流程”

往期热门文章&#xff1a; 1&#xff0c;史上最全猎头技能资料&#xff0c;独家最新放送 2&#xff0c;互联网大厂java面试题知识库&#xff08;100万字&#xff09; 3&#xff0c;一线互联网大数据面试题知识库&#xff08;100万字&#xff09; 4&#xff0c;中国猎头公司排行…

SQL优化详解

目录 插入数据 insert的优化&#xff08;少量数据&#xff09; 批量插入 手动事务提交 主键顺序插入 插入大量数据 主键优化 数据组织方式&#xff1a; 页分裂&#xff1a; 主键顺序插入的方式&#xff1a; 主键乱序插入&#xff1a; 页合并&#xff1a; 主键设计…

HTML5/CSS3粒子效果进度条 超炫酷进度条动画源码

特效介绍 之前我已经分享了几款效果很不错的CSS3进度条插件&#xff0c;比如CSS3 Loading进度条加载动画特效、CSS3 3D进度条按钮 18款精美样式。今天我再来分享一款很有特色的HTML5/CSS3进度条应用。这款进度条插件在播放进度过程中出现粒子效果&#xff0c;就像一些小颗粒从…

二本生如何从大一准备考研!?保姆级全攻略

如果是二本大学&#xff0c;那考研确实是一个很好的机会 如果大家就有考研的打算&#xff0c;那就好好学习&#xff0c;好好学习英语&#xff0c;数学&#xff08;理工科&#xff09;和专业课&#xff0c;这些课程在考研的时候是肯定会考的 特别是英语和数学&#xff08;理工…

每日Attention学习5——Multi-Scale Channel Attention Module

模块出处 [link] [code] [WACV 21] Attentional Feature Fusion 模块名称 Multi-Scale Channel Attention Module (MS-CAM) 模块作用 通道注意力 模块结构 模块代码 import torch import torch.nn as nnclass MS_CAM(nn.Module):def __init__(self, channels64, r4):super(…

五一开始内卷前端,如何迅速的一个月内找到工作!

写在前面 五一过了代表新的一年不知不觉过了半年了&#xff0c;各位工作找到怎么样&#xff0c;有没有在工作中遇到解决不了的问题&#xff0c;这些问题后面怎么处理了呢&#xff1f; hello大家好&#xff0c;我又又又来了&#xff0c;今天纯干货&#xff0c;上班的朋友适当摸…

【SAP ME 39】SAP ME WebService超时时间设置

禁止废话&#xff0c;直接上图&#xff01;&#xff01;&#xff01; SAP技术官方说明

Dark Reader:夜间模式,启动!

名人说&#xff1a;一点浩然气&#xff0c;千里快哉风。 ——苏轼 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、介绍二、下载安装1、Chrome应用商店&#xff08;需科学&#xff09;2、第三方直链下载 三、使…

深入探索数据链路层:网络通信的基石

⭐小白苦学IT的博客主页⭐ ⭐初学者必看&#xff1a;Linux操作系统入门⭐ ⭐代码仓库&#xff1a;Linux代码仓库⭐ ❤关注我一起讨论和学习Linux系统❤ 前言 在网络通信的宏伟世界中&#xff0c;数据链路层扮演着至关重要的角色。它位于物理层和网络层之间&#xff0c;不仅直接…

HuggingFace烧钱做了一大批实验,揭示多模态大模型哪些trick真正有效

构建多模态大模型时有很多有效的trick&#xff0c;如采用交叉注意力机制融合图像信息到语言模型中&#xff0c;或直接将图像隐藏状态序列与文本嵌入序列结合输入至语言模型。 但是这些trick为什么有效&#xff0c;其计算效率如何&#xff0c;往往解释得很粗略或者或者缺乏充分…

C++ Builder XE EnumWindowsProc遍历所有窗口的名称

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) { // 这里可以添加你的处理逻辑 // 例如&#xff0c;将句柄添加到列表中或者其他操作 // 这里我们仅仅输出到调试窗口 OutputDebugString(L"枚举窗口句柄: "); char windowHandle[10];…

ROS 2边学边练(45)-- 构建一个能动的机器人模型

前言 在上篇中我们搭建了一个机器人模型(其由各个关节&#xff08;joint&#xff09;和连杆&#xff08;link&#xff09;组成)&#xff0c;此篇我们会通过设置关节类型来实现机器人的活动。 在ROS中&#xff0c;关节一般有无限旋转&#xff08;continuous&#xff09;,有限旋转…
最新文章