内存 free buffers和cache

内核或者发行版本不同,输出内容不一样,注意一下,这里是centos7,如果你是centos6,输出可能不是下面的样子

[root@master1] ~$ free -h
              total        used        free      shared  buff/cache   available
Mem:           1.8G        686M         91M        9.0M        1.0G        870M
Swap:            0B          0B          0B


一共六列,含义:

1,total:物理内存实际总量,我机器是2G内存,这里显示1.8G,这是因为进制不同造成的

2,used:已使用的内存,包含了共享内存,不包括缓冲区/缓存

3,free:空闲的内存,还没有分配,谁都没有在使用的内存。

这不是说你现在只能有这么点内存可以使用了,实际上可以使用的内存应该看available的值。有人可能发现free的值很小。这主要是因为,在Linux系统中有这么一种思想,内存不用白不用,因此它尽可能的cache和buffer一些数据,以方便下次使用。但实际上这些缓存是可以立刻拿来使用的。

4,shared:共享内存,在linux里面有很多共享内存,比如一个libc库,很多程序调用,但在内存中实际只存一份,这个值一般不是很大。共享内存是通过 tmpfs 实现的,所以它的大小也就是 tmpfs 使用的内存大小。tmpfs 其实也是一种特殊的缓存。

5,buff/cache: 缓冲区/缓存,意味着这块内存是可以回收的,如果现在一个进程需要的内存值大于free的值,也就是说空闲内存快要耗尽的时候,就会触发缓存回收,以便释放出内存给急需内存的进程使用。

buffers和cached的区别

通过man free

  • Buffers 是内核缓冲区用到的内存,对应的是 /proc/meminfo 中的 Buffers 值。
  • Cache 是内核页缓存和 Slab 用到的内存,对应的是 /proc/meminfo 中的 Cached 与 SReclaimable 之和。

man proc定位到meninfo

  • Buffers 是对原始磁盘块的临时存储,也就是用来缓存磁盘的数据,通常不会特别大(20MB左右)。这样,内核就可以把分散的写集中起来,统-优化磁盘的写入,比如可以把多次小的写合并成单次大的写等等。
  • Cached是从磁盘读取文件的页缓存,也就是用来缓存从文件读取的数据。这样,下次访问这些文件数据时,就可以直接从内存中快速获取,而不需要再次访问缓慢的磁盘。
  • SReclaimable 是Slab的一部分。Slab 包括两部分,其中的可回收部分,用SReclaimable记录;而不可回收部分,用SUnreclaim记录。

缓存包括两部分,一部分是磁盘读取文件的页缓存,用来缓存从磁盘读取的数据,可以加快以后再次访问的速度。另一部分,则是 Slab 分配器中的可回收内存。

缓冲区是对原始磁盘块的临时存储,用来缓存将要写入磁盘的数据。这样,内核就可以把分散的写集中起来,统一优化磁盘写入。

--------------
cached和buffers都可以读写,它们唯一的区别就是一个以裸设备或分区为背景,一个以文件系统里的文件为背景。比如你cat /dev/sda1 > /dev/null,那/dev/sda1的内容进入buffers,如果你cat /opt/test.py > /dev/null,则/opt/test.py的内容进入cached。

通俗理解

cache 是为了弥补高速设备和低速设备的鸿沟而引入的中间层,最终起到加快访问速度的作用。而 buffer 的主要目的进行流量整形,把突发的大数量较小规模的 I/O 整理成平稳的小数量较大规模的 I/O,以减少响应次数(比如从网上下电影,你不能下一点点数据就写一下硬盘,而是积攒一定量的数据以后一整块一起写,不然硬盘都要被你玩坏了)。

1、Buffer(缓冲区)是系统两端处理速度平衡(从长时间尺度上看)时使用的。它的引入是为了减小短期内突发I/O的影响,起到流量整形的作用。比如生产者——消费者问题,他们产生和消耗资源的速度大体接近,加一个buffer可以抵消掉资源刚产生/消耗时的突然变化。

2、Cache(缓存)则是系统两端处理速度不匹配时的一种折衷策略。因为CPU和memory之间的速度差异越来越大,所以人们充分利用数据的局部性(locality)特征,通过使用存储系统分级(memory hierarchy)的策略来减小这种差异带来的影响。

3、假定以后存储器访问变得跟CPU做计算一样快,cache就可以消失,但是buffer依然存在。比如从网络上下载东西,瞬时速率可能会有较大变化,但从长期来看却是稳定的,这样就能通过引入一个buffer使得OS接收数据的速率更稳定,进一步减少对磁盘的伤害。

4、TLB(Translation Lookaside Buffer,翻译后备缓冲器)名字起错了,其实它是一个cache.

5 从磁盘读入的数据有可能被保持在内存的buffer中以便下次快速访问。

准备从内存中写入磁盘的数据将首先被放到 内存中的cache中,然后由磁盘中断程序写入磁盘

6、available:新进程可用内存的大小。如果你想查看可用内存,直接看available即可,不要看free。

注意一下,available 不仅包含未使用内存,还包括了可回收的缓存,所以一般会比未使用内存更大。不过,并不是所有缓存都可以回收,因为有些缓存可能正在使用中。公式如下:

available = free + (buff/cache通过一个算法后产生的值)

7,swap:交换分区,在生产环境中swap一般是禁用的。

 

  • 虚拟内存,包括了进程代码段、数据段、共享内存、已经申请的堆内存和已经换出的内存等。这里要注意,已经申请的内存,即使还没有分配物理内存,也算作虚拟内存。

  • 常驻内存是进程实际使用的物理内存,不过,它不包括 Swap 和共享内存。

  • 共享内存,既包括与其他进程共同使用的真实的共享内存,还包括了加载的动态链接库以及程序的代码段等。

  • Swap 内存,是指通过 Swap 换出到磁盘的内存。

当然,这些指标中,常驻内存一般会换算成占系统总内存的百分比,也就是进程的内存使用率。

除了这些很容易想到的指标外,我还想再强调一下,缺页异常。

在内存分配的原理中,我曾经讲到过,系统调用内存分配请求后,并不会立刻为其分配物理内存,而是在请求首次访问时,通过缺页异常来分配。缺页异常又分为下面两种场景。

  • 可以直接从物理内存中分配时,被称为次缺页异常。

  • 需要磁盘 I/O 介入(比如 Swap)时,被称为主缺页异常。

显然,主缺页异常升高,就意味着需要磁盘 I/O,那么内存访问也会慢很多。

除了系统内存和进程内存,第三类重要指标就是 Swap 的使用情况,比如 Swap 的已用空间、剩余空间、换入速度和换出速度等。

  • 已用空间和剩余空间很好理解,就是字面上的意思,已经使用和没有使用的内存空间。

  • 换入和换出速度,则表示每秒钟换入和换出内存的大小。

虽然内存的性能指标和性能工具都挺多,但理解了内存管理的基本原理后,你会发现它们其实都有一定的关联。梳理出它们的关系,掌握内存分析的套路并不难。

找到内存问题的来源后,下一步就是相应的优化工作了。在我看来,内存调优最重要的就是,保证应用程序的热点数据放到内存中,并尽量减少换页和交换。

常见的优化思路有这么几种。

  1. 最好禁止 Swap。如果必须开启 Swap,降低 swappiness 的值,减少内存回收时 Swap 的使用倾向。

  2. 减少内存的动态分配。比如,可以使用内存池、大页(HugePage)等。

  3. 尽量使用缓存和缓冲区来访问数据。比如,可以使用堆栈明确声明内存空间,来存储需要缓存的数据;或者用 Redis 这类的外部缓存组件,优化数据的访问。

  4. 使用 cgroups 等方式限制进程的内存使用情况。这样,可以确保系统内存不会被异常进程耗尽。

  5. 通过 /proc/pid/oom_adj ,调整核心应用的 oom_score。这样,可以保证即使内存紧张,核心应用也不会被 OOM 杀死。

关于cpu cache的总结


https://blog.csdn.net/fanren224/article/details/87859216

查看占用cpu最高的进程

ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head

或者top (然后按下M,注意这里是大写)

查看占用内存最高的进程

ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head

或者top (然后按下P,注意这里是大写)

记一次Linux系统内存占用较高得排查

原文:https://yq.aliyun.com/articles/161186?spm=a2c4e.11153959.0.0.385027eea1TvRe

背景:收到报警,系统的内存使用率触发阈值(部分图是后补的)
mem1
1,登陆系统,使用命令查看内存分配

top 按M

mem2

free -m

mem3

atop

看下内存分配(cat /proc/meminfo 也可以看到一些细化的内存使用信息)
mem4
2,发现cache才1.7g,slab非常高,4.4g ,slab内存简单理解为是系统占用的
使用slabtop继续分析
mem5
3,看到proc_inode_cache使用的最多,这个代表是proc文件系统的inode的占用的。
4,查进程,但是进程不多,再查线程,可以通过如下命令进行检查。

ps -eLf

得到如下的结果:(没有原图了,这里补得图,用云盾做介绍)
mem6
计算socket

ll /proc/22360/task/*/fd/ |grep socket |wc -l

mem8

ll /proc/22360/task/*/fd/  |wc -l

计算一下有多少fd
mem7
5,每个socket的inode也不一样
mem9
当时看到的现场有几万个fd,基本全是socket,每个inode都是占用空间的,且proc文件系统是全内存的。 所以我们才会看到slab中proc_inode_cache内存占用高

后续:
优化相关的server端~

猜你喜欢

转载自blog.csdn.net/fanren224/article/details/89455109