free命令和内存

一 free

  free命令显示当前系统内存使用,默认按照k(b)的计数单位统计。
在这里插入图片描述
  参数total:总计物理内存的大小;used:已使用多少;free:可用内存多少;shared:多个进程共享的内存总额;buff/cache:表示磁盘缓存的大小;available:还可以被应用程序使用的物理内存大小。
  参数-b:以bytes为单位来显示内存的信息;-k:以kb为单位来显示内存的信息;-m:以m为单位来显示内存的信息;-g:以G为单位来显示内存的信息。
在这里插入图片描述
  关系:total = used + free。
  -/+ buffers/cache-buffers/cache的内存数:10636(等于第1行的used - buffers - cached);+buffers/cache的内存数:1005128(等于第1行的free + buffers + cached)。

total=Mem_used+Mem_free
Mem_used=Mem_buffers+Mem_cached+(-/+ buffers/cache)_used
Mem_free=(-/+ buffers/cache)_free-Mem_buffers-Mem_cached

  可见-buffers/cache反映的是被程序实实在在吃掉的内存,而+buffers/cache反映的是现在可以被用的内存总数。
  如果感兴趣可以进一步参考文件/proc/meminfo,free命令就是根据它的信息生成的。free命令的源码可从procps-xxx-.src.rpm获取,xxx为版本号,比如procps-3.2.3-5.3.src.rpm。

二 free 与 available 的区别

  free 是真正尚未被使用的物理内存数量;available 是应用程序认为可用内存数量,available = free + buffer + cache (注:只是大概的计算方法)。
  为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用(比如read,write,getdents)的时间。对于内核来说,buffer 和 cache 其实都属于已经被使用的内存。但当应用程序申请内存时,如果 free 内存不够,内核就会回收 buffer 和 cache 的内存来满足应用程序的请求。这就是稍后要说明的 buffer 和 cache。

三 buff 和 cache 的区别

以下内容来自buffer和cache怎么让你们解释的那么难理解?

  从字面上和语义来看,buffer名为缓冲,cache名为缓存。我们知道各种硬件存在制作工艺上的差别,所以当两种硬件需要交互的时候,肯定会存在速度上的差异,而且只有交互双方都完成才可以各自处理别的其他事务。假如现在有两个需要交互的设备A和B,A设备用来交互的接口速率为1000M/s,B设备用来交互的接口速率为500M/s,那他们彼此访问的时候都会出现以下两种情况:(以A来说)
  一、A从B取一个 1000M 的文件结果需要2s,本来需要1s就可以完成的工作,却还需要额外等待1s,B设备把剩余的 500M 找出来,在等待B取出剩下 500M 的空闲时间内(1s)其他的事务还干不了。
  二、A给B一个 1000M 的文件结果也需要2s,本来需要也就1s就可以完成的工作,却由于B在1s内只能拿500M,剩下的500M还得等下一个1sB来取,这等待下1s的时间还做不了其他事务。
  那有什么方法既可以让A在‘取’或‘给’B的时候既能完成目标任务又不浪费那1s空闲等待时间去处理其他事务呢?我们知道产生这种结果主要是因为B跟不上A的节奏,但即使这样A也得必须等B处理完本次事务才能干其他活(单核cpu来说),除非你有三头六臂。那有小伙伴可能会问了,能不能在A和B之间加一层区域比如说 ab,让 ab 既能跟上A的频率也会照顾B的感受,没错我们确实可以这样设计来磨合接口速率上的差异,你可以这样想象,在区域 ab 提供了两个交互接口一个是a接口另一个是b接口,a接口的速率接近A,b接口的速率最少等于B,然后我们把 ab 的 a 和 A 相连,ab 的 b 和 B 相连,ab 就像一座桥把 A 和 B 链接起来,并告知 A 和 B 通过他都能转发给对方,文件可以暂时存储,最终拓扑大概如下:
在这里插入图片描述
  现在我们再来看上述两种情况:
  对于第一种情况 A 要 B :当A从B取一个 1000M 的文件,他把需求告诉了 ab,接下来 ab 通过b和B进行文件传送,由于B本身的速率,传送第一次 ab 并没有什么卵用,对A来说不仅浪费了时间还浪费了感情,ab 这家伙很快感受到了A的不满,所以在第二次传送的时候,ab 背着 B 偷偷缓存了一个一模一样的文件,而且只要从B 取东西,ab 都会缓存一个拷贝下来放在自己的大本营,如果下次A或者其他C来取B的东西,ab 直接就给A或C一个货真价实的赝品,然后把它通过a接口给了A或C,由于a的速率相对接近A的接口速率,所以A觉得不错为他省了时间,最终和 ab 的 a 成了好基友,说白了此时的 ab 提供的就是一种缓存能力,即 cache,绝对的走私!因为C取的是A执行的结果。所以在这种工作模式下,怎么取得的东西是最新的也是我们需要考虑的,一般就是清cache。例如cpu读取内存数据,硬盘一般都提供一个内存作为缓存来增加系统的读取性能。
  对于第二种情况A给B:当A发给B一个1000M的文件,因为A知道通过 ab 的a接口就可以转交给B,而且通过a接口要比通过B接口传送文件需要等待的时间更短,所以1000M通过a接口给了 ab,站在A视图上他认为已经把1000M的文件给了B,但对于 ab 并不立即交给B,而是先缓存下来,除非B执行sync命令,即使B马上要,但由于b的接口速率最少大于B接口速率,所以也不会存在漏洞时间,但最终的结果是A节约了时间就可以干其他的事务,说白了就是推卸责任,哈哈而 ab 此时提供的就是一种缓冲的能力,即buffer,它存在的目的适用于当速度快的往速度慢的输出东西。例如内存的数据要写到磁盘,cpu寄存器里的数据写到内存。
  看了上面这个例子,那我们现在看一下在计算机领域,在处理磁盘IO读写的时候,cpu,memory,disk基于这种模型给出的一个实例。我们先来一幅图:(我从别家当来的,我觉得,看N篇文档不如瞄此一图)在这里插入图片描述
  page cache:文件系统层级的缓存,从磁盘里读取的内容是存储到这里,这样程序读取磁盘内容就会非常快,比如使用 grep 和 find 等命令查找内容和文件时,第一次会慢很多,再次执行就快好多倍,几乎是瞬间。但如上所说,如果对文件的更新不关心,就没必要清cache,否则如果要实施同步,必须要把内存空间中的cache clean下。
  buffer cache:磁盘等块设备的缓冲,内存的这一部分是要写入到磁盘里的。这种情况需要注意,位于内存buffer中的数据不是即时写入磁盘,而是系统空闲或者buffer达到一定大小统一写到磁盘中,所以断电易失,为了防止数据丢失所以我们最好正常关机或者多执行几次 sync 命令,让位于buffer上的数据立刻写到磁盘里。
  Linux上怎么查看buffer/cache,怎么flush…cache ?答案就是:free命令。
  通过以上,我们可以知道:
  1、buffers和cache也是RAM划分出来的一部分地址空间;
  2、buffers和cache的地址空间也可作为空闲内存的组成部分,这意味着我们可以通过向内核传参释放一部分内存给其他进程;
  3、由于buffers/cache 是一种动态的内存地址空间,所以已用空间和空余空间有绝对使用,绝对空余空间,算上buffers/cache的相对已用空间和相对空余空间四个概念。
  如何释放缓存吗?我们知道Linux的一个重要思想是一切皆文件,比如各种输入输出设备:键盘,鼠标,网卡,显示器,打印机,U盘,console口,在linux的国度里都可为其创建一个文件作为访问设备的入口,而内核的各种参数也被映射成了文件,不过内核参数这种文件比较特殊,在linux上有两个伪文件系统:/proc,/sys。
  /proc:内核状态和统计信息的输出接口,同时还提供一个配置接口,/proc/sys/ 一些文件可接受用户指定一个新的value来实现对内核某功能或特性的配置:切记不能用文本编辑器去打开,我们可以通过以下三种方式可以去修改:
1、sysctl [options] [var=[value]]
  var格式 x.x.x… 命令默认的根目录是:/proc/sys
  sysctl -a :查看所有根目录下的内核参数(可以送给grep来检索需要的内核参数)
  sysctl var: 查看指定内核参数的值(如果你很熟悉这个目录你可以直接指所要改的内核选项)
  sysctl -w var=value:设定内核参数var等于value的值
2、cat /proc/sys/Path/var_file
  echo "value" > /proc/sys/Path/var_file(通过重定向)
  注意!以上两种方式的设定仅即时生效,内核重新加载就会失效,如果想让永久生效需要修改其配置文件。
3、配置文件:/etc/sysctl.conf,/etc/sysctl.d/*.conf
  这个可以vim,比如我们通过vim 打开并让其有数据包转发功能,我们可以修改以下这个参数。

 # Controls IP packet forwardin
 net.ipv4.ip_forward = 1

  修改完我们可以通过sysctl -p [/etc/sysctl.conf] 让其内核重读配置文件使其修改的value立即生效。
  知道了怎么修改内核参数,接下来我们清理下buffers/cache:

[root@localhost ~]# echo 1 > /proc/sys/vm/drop_caches 
[root@localhost ~]# free -m
                  total   used   free   shared   buffers     cached
Mem:          727    177     549      0         0             27
-/+ buffers/cache: 150     577
Swap:        2047    0     2047

  我们看到命令执行后buffers为0,cached也只有27M。
  总结:
  1、buffer和cache都是为了解决互访的两种设备存在速率差异,使磁盘的IO的读写性能或cpu更加高效,减少进程间通信等待的时间
  2、buffer:缓冲区-用于存储速度不同步的设备或优先级不同的设备之间传输数据,通过buffer可以减少进程间通信需要等待的时间,当存储速度快的设备与存储速度慢的设备进行通信时,存储快的设备先把数据缓存到buffer上,等到系统统一把buffer上的数据写到速度慢的设备上。常见的有把内存的数据往磁盘进行写操作,这时你可以查看一下buffers
  3、cache:缓存区-用于对读取速度比较严格,却因为设备间因为存储设备存在速度差异,而不能立刻获取数据,这时cache就会为了加速缓存一部分数据。常见的是CPU和内存之间的数据通信,因为CPU的速度远远高于主内存的速度,CPU从内存中读取数据需等待很长的时间,而Cache保存着CPU刚用过的数据或循环使用的部分数据,这时Cache中读取数据会更快,减少了CPU等待的时间,提高了系统的性能。
  问题:
  1、buffers和cache是必须的吗?
  2、 怎么清除buffers和cache?
  3、 当buffers值一段时间增长很快说明什么?cache一段时间增长很快说明什么?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值