Redis内存问题的学习之一


背景

  1. 前几天帮同事看redis的问题
  2. 发现info memory 显示 60GB
  3. 但是实际上 save出来的dump文件只有 800M
  4. 然后导入到其他的redis之后, info memory只有 2G左右的内存.
  5. 所以感觉比较奇怪. 认为 redis info memory 在某些特殊情况下可能存在误判.
  6. 所以想研究一下内存部分的使用.
  7. 第二天晚上发现PG的一个公众号正好讲解了 pmap -d 感觉正好对胃口 就一起学习和使用一下.
  8. 这里参考他的部分内容, 地址为:
  9. https://mp.weixin.qq.com/s/W8hy31GWFZ_5qCAFnvTyag

第一部分内存的分类

  1. 搞清 PSS/USS/RSS/VSS 这类指标的差异:
  2. VSS (reported as VSZ from ps) is the total accessible address space of a process.
  3. This size also includes memory that may not be resident in RAM like mallocs
  4. that have been allocated but not written to or mmap()ed files on disk, etc
  5. RSS is the total memory actually held in RAM for a process.
  6. RSS can be misleading, because it reports the total all of the shared libraries that the process uses,
  7. even though a shared library is only loaded into memory once regardless of how many processes use it. It also counts all other shared pages,
  8. such as the copy-onwrite pages still shared with the parent after fork(), an important usecase for current LHC multicore usage.
  9. PSS differs from RSS in that it reports the proportional size of its shared pages
  10. USS is the total private memory for a proces, i.e. that memory that is completely unique to that process.

关于pmap的理解

  1. pmap -h
  2. Usage:
  3. pmap [options] PID [PID ...]
  4. Options:
  5. -x, --extended show details
  6. -X show even more details
  7. WARNING: format changes according to /proc/PID/smaps
  8. -XX show everything the kernel provides
  9. -c, --read-rc read the default rc
  10. -C, --read-rc-from=<file> read the rc from file
  11. -n, --create-rc create new default rc
  12. -N, --create-rc-to=<file> create new rc to file
  13. NOTE: pid arguments are not allowed with -n, -N
  14. -d, --device show the device format
  15. -q, --quiet do not display header and footer
  16. -p, --show-path show path in the mapping
  17. -A, --range=<low>[,<high>] limit results to the given range
  18. -h, --help display this help and exit
  19. -V, --version output version information and exit

关于pmap -d

  1. -d, --device show the device format
  2. 可以查看类型. 我这边开一个redis ,里面加载了60万个key 进行显示:
  3. 127.0.0.1:26379> dbsize
  4. (integer) 648463
  5. 127.0.0.1:26379> info memory
  6. # Memory
  7. used_memory:2175437480
  8. used_memory_human:2.03G
  9. used_memory_rss:2255552512
  10. used_memory_rss_human:2.10G
  11. 看到内存显示其实是 2.03G左右
  12. pmap -d 636234
  13. mapped: 3643584K writeable/private: 3424448K shared: 0K
  14. 然后使用 top -Hp 636234
  15. top - 08:24:45 up 345 days, 17:50, 9 users, load average: 0.59, 1.03, 1.54
  16. Threads: 5 total, 0 running, 5 sleeping, 0 stopped, 0 zombie
  17. %Cpu(s): 0.2 us, 0.1 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
  18. MiB Mem : 1045898.+total, 464319.4 free, 287949.9 used, 293629.4 buff/cache
  19. MiB Swap: 0.0 total, 0.0 free, 0.0 used. 460899.2 avail Mem
  20. PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
  21. 636234 root 20 0 3643584 2.1g 3456 S 0.0 0.2 6:52.71 redis-server
  22. 636236 root 20 0 3643584 2.1g 3456 S 0.0 0.2 0:00.00 bio_close_file
  23. 636237 root 20 0 3643584 2.1g 3456 S 0.0 0.2 0:00.00 bio_aof_fsync
  24. 636238 root 20 0 3643584 2.1g 3456 S 0.0 0.2 0:00.00 bio_lazy_free
  25. 636239 root 20 0 3643584 2.1g 3456 S 0.0 0.2 0:00.01 jemalloc_bg_thd
  26. 发现 mapped 的内存与 VIRT的数值是可以完全对应的
  27. 但是RES writeable/private 的内存却不能对应.
  28. 这一块有点奇怪, 感觉需要后续继续排查一下.

关于内存的进一步了解

  1. 之前总结了 java内存的使用情况, 其实算是宏观层次的理解, 并不微观
  2. 也总结过 pcacher工具. 可以看到 buffercache相关的内容.
  3. 之前对性能其实有误解.
  4. CPU是很快的. 但是内存比CPU慢了两个数量级.
  5. 比如一个 8通道 DDR4 4000 220核心 合计 四核心的2.5Ghz的服务器来说.
  6. 内存的延迟一般是 60ns左右. CPU的一般是 0.4nm, 实际上那个是差了 150
  7. 关于贷款. 理论上 40核心 2.5Ghz的带宽 不算MIMD 单指令也至少哟 100Ghz*64/8 也就是至少 800GB/S的能力.
  8. 其实实质上因为MIMD的原因, 还会更高.
  9. 内存来说 8*4*8 256G的贷款到顶. 而且还需要不停的充放电,
  10. 带宽层面CPU至少也是内存的三倍以上. 甚至更高.
  11. 所以内存相比CPU是很慢的, 尤其是申请和释放大量的内存, 如果夸numa节点访存,性能其实更差.

Redis内存使用情况

  1. 其实键值对 需要设置过期时间
  2. 并且增加内存的淘汰策略
  3. 并且设置最大使用内存才是redis使用的基本套路.
  4. 如果不设置最大内存, 可能会有比较严重的风险, 导致宕机
  5. 如果不设置过期的策略, 可能对过期键值对的处理存在风险.
  6. redis还是必须要监控起来. 不建议使用内存大于一半的内存数量.
  7. 另外强烈建议redis使用高主频的服务器. 核心数可以不多, 但是主频一定要高.

Redis内存问题的学习之一的更多相关文章

  1. 深入学习Redis(1):Redis内存模型

    前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分. 我们使用Redis时,会接触Redis的5种对象类型(字符串 ...

  2. 深入学习Redis:Redis内存模型

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 一.Redis内存统计 工欲善其事必先利其器,在说明Redis内存之前首先说明如何统计 ...

  3. Redis深入学习笔记(六)Redis内存分配

    Redis的高效可以说是轻量级的epoll模型和基于内存的读写共同组成的,关于epoll对于以前的select或者poll的性能优势这里不做介绍,本篇主要介绍领一个重点,Redis的内存分配原理. 获 ...

  4. 【转】深入学习Redis(1):Redis内存模型

    原文:https://www.cnblogs.com/kismetv/p/8654978.html 前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Red ...

  5. redis六种内存淘汰策略学习

    当客户端会发起需要更多内存的申请,Redis检查内存使用情况,如果实际使用内存已经超出maxmemory,Redis就会根据用户配置的淘汰策略选出无用的key; 当前Redis3.0版本支持的淘汰策略 ...

  6. 【深入学习Redis】Redis内存模型

    前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分. 我们使用Redis时,会接触Redis的5种对象类型(字符串 ...

  7. 降低Redis内存占用

    1.降低redis内存占用的优点 1.有助于减少创建快照和加载快照所用的时间 2.提升载入AOF文件和重写AOF文件时的效率 3.缩短从服务器进行同步所需的时间 4.无需添加额外的硬件就可以让redi ...

  8. 美团在Redis上踩过的一些坑-3.redis内存占用飙升(转载)

     一.现象:     redis-cluster某个分片内存飙升,明显比其他分片高很多,而且持续增长.并且主从的内存使用量并不一致.   二.分析可能原因:  1.  redis-cluster的bu ...

  9. [转帖]美团在Redis上踩过的一些坑-3.redis内存占用飙升

    美团在Redis上踩过的一些坑-3.redis内存占用飙升 博客分类: 运维 redis redismonitor内存突增client listinfo     转载请注明出处哈:http://car ...

  10. Redis内存——内存消耗(内存都去哪了?)

    最新:Redis内存--三个重要的缓冲区 最新:Redis内存--内存消耗(内存都去哪了?) 最新:Redis持久化--如何选择合适的持久化方式 最新:Redis持久化--AOF日志 更多文章... ...

随机推荐

  1. 微软真是活菩萨,面向初学者的机器学习、数据科学、AI、LLM课程统统免费

    微软真是活菩萨,面向初学者的机器学习.数据科学.AI.LLM课程统统免费 大家好,我是老章 推荐几个质量上乘且完全免费的微软开源课程 面向初学者的机器学习课程 地址:https://microsoft ...

  2. Java 集合(三)ConcurrentHashMap

    一般来讲,通常使用的 HashMap 不是线程安全的,因为没有任何机制来保证每个操作的原子性.在 ConcurrentHashMap 出现之前,可以通过给 HashMap 的每个操作加上唯一的互斥锁来 ...

  3. JavaScript 常见错误与异常处理

    一.为什么要了解常见JS错误 1.调试和故障排除: 了解常见的JavaScript错误可以帮助你更好地调试和故障排除代码.当你遇到错误时,能够快速识别错误类型并找到解决方法,可以节省大量的时间和精力. ...

  4. Mybatis源码1JDBC->mybatis主要流程->mybatis Excutor简介

    === 一丶mybatis概述 MyBatis 是一款优秀的持久层框架,它支持自定义 SQL.存储过程以及高级映射.MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作.My ...

  5. 手把手教你使用ModelArts的自动学习识别毒蘑菇分类

    摘要:本文介绍了ModelArts如何通过自动学习进行毒蘑菇的识别. 想当年,白雪公主吃了毒蘑菇,换来了白马王子的一吻.如果白雪公主没有吃毒蘑菇,还会遇到白马王子吗?张小白觉得不见得--说不定她会遇到 ...

  6. 华为云数据库GaussDB(for openGauss):初次见面,认识一下

    摘要:本文从总体架构.主打场景.关键技术特性等方面进行介绍GaussDB(for openGauss). 1.背景介绍 3月16日,在华为云主办的GaussDB(for openGauss)系列技术第 ...

  7. GaussDB(DWS)发生数据倾斜不要慌,一文教你轻松获取表倾斜率

    摘要:GaussDB(DWS)是MPP并行架构,若表的数据存在倾斜情况,会引起一系列性能问题,影响用户体验,严重时可能会引起系统故障.因此能快速获取倾斜的表并整改是GaussDB(DWS)运维管理人员 ...

  8. DevSecOps: CI/CD 流水线安全的最佳实践

    上一篇文章我们了解了 IAST 及其优势.工具类型以及重要性. 本期文章将为你介绍 CI/CD 流水线安全的最佳实践. ✦ ✦ CI/CD 流水线是指由持续集成(Continuous Integrat ...

  9. Spring解决泛型擦除的思路不错,现在它是我的了。

    你好呀,我是歪歪. Spring 的事件监听机制,不知道你有没有用过,实际开发过程中用来进行代码解耦简直不要太爽. 但是我最近碰到了一个涉及到泛型的场景,常规套路下,在这个场景中使用该机制看起来会很傻 ...

  10. Filebeat的安装和使用(Linux)

    安装 filebeat-7.9.3(与Elasticsearch版本一致) 考虑到Elasticsearch 比较费硬盘空间,所以目前项目中只上传error的日志.详细日志还是去具体服务器查看(没有专 ...