而当我们使用free命令查看Linux系统内存使用情况时,会发现内存使用一直处于较高的水平,即使此时系统并没有运行多少软件。这正是Windows和Linux在内存管理上的区别,乍一看,Linux系统吃掉我们的内存(Linux ate my ram),但其实这也正是其内存管理的特点。

free命令

下面为使用free命令查看我们实验室文件服务器内存得到的结果,-m选项表示使用MB为单位:
输出的第二行表示系统内存的使用情况:
Mem: total(总量)= 31405MB,used(已使用)= 30254MB,free(空闲)= 1150MB,shared(共享内存)= 12514MB,buffers = 1122MB,cached = 25424MB
注:前面四项都比较好理解,buffer 和 cache的区别在于:
A buffer is something that has yet to be “written” to disk.
A cache is something that has been “read” from the disk and stored for later use.
即buffer用于存放要输出到磁盘的数据,而cache是从磁盘读出存放到内存中待今后使用的数据。它们的引入均是为了提供IO的性能。
输出的第三行表示在第二行的基础上-/+ buffers/cache得到的:
– buffers/cache used = Mem used – buffers – cached = 30524MB – 1122MB –
25424MB = 3708MB+ buffers/cache free = Mem free + buffers + cached =
1150MB + 1122MB + 25424MB = 27696MB
输出的第三行表示交换分区使用的情况:
Swap:total(总量)= 15775MBused(使用)= 596MBfree(空闲)= 4095MB

内存的分类

这里把内存分为三类,从用户和操作系统的角度对其使用情况有不同的称呼:

上表中something代表的正是free命令中”buffers/cached”的内存,由于这块内存从操作系统的角度确实被使用,但如果用户要使用,这块内存是可以很快被回收被用户程序使用,因此从用户角度这块内存应划为空闲状态。
再次回到free命令输出的结果,第三行输出的结果应该就能理解了,这行的数字表示从用户角度看系统内存的使用情况。因此,如果你用top或者free命令查看系统的内存还剩多少,其实你应该将空闲内存加上buffer/cached的内存,那才是实际系统空闲的内存。

buffers/cached好处

Linux内存管理做了很多精心的设计,除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换),还采取了两种主要Cache方式:Buffer
Cache和Page
Cache,目的就是为了提升磁盘IO的性能。从低速的块设备上读取数据会暂时保存在内存中,即使数据在当时已经不再需要了,但在应用程序下一次访问该数据时,它可以从内存中直接读取,从而绕开低速的块设备,从而提高系统的整体性能。
而Linux会充分利用这些空闲的内存,设计思想是内存空闲还不如拿来多缓存一些数据,等下次程序再次访问这些数据速度就快了,而如果程序要使用内存而系统中内存又不足时,这时不是使用交换分区,而是快速回收部分缓存,将它们留给用户程序使用。
因此,可以看出,buffers/cached真是百益而无一害,真正的坏处可能让用户产生一种错觉——Linux耗内存!其实不然,Linux并没有吃掉你的内存,只要还未使用到交换分区。

实验测试:先后读入一个大文件,比较两次读入的时间
1.首先生成一个1G的大文件


dd if=/dev/zero of=bigfile bs=1M count=1000

2.清空缓存


这里改为3后一定要改回0,要不下面测试结果就不准确了。

3.读入这个文件,测试消耗的时间

耗时24秒

4.再次读入该文件,测试消耗的时间

耗时17秒

从上面看出,第一次读这个1G的文件大约耗时24s,而第二次再次读的时候,只耗时17s,有所下降。

原文来自:http://www.360kuai.com/pc/96d710a562bab2bb9?cota=3&kuai_so=1&sign=360_e39369d1&refer_scene=so_3

本文地址:https://www.linuxprobe.com/linux-eatsup-memory.html编辑:坑人小妖精,审核员:张文祥

Linux命令大全:https://www.linuxcool.com/

导读 在Windows下资源管理器查看内存使用的情况,如果使用率达到80%以上,再运行大程序就能感觉到系统不流畅了,因为在内存紧缺的情况下使用交换分区,频繁地从磁盘上换入换出页会极大地影响系统的性能。

Linux系统吃“内存”现象的更多相关文章

  1. 极客时间-左耳听风-程序员攻略-Linux系统、内存和网络

    程序员练级攻略:Linux系统.内存和网络 Linux 系统相关 Red Hat Enterprise Linux 文档 . Linux Insides ,GitHub 上的一个开源电子书,其中讲述了 ...

  2. linux系统CPU,内存,磁盘,网络流量监控脚本

    前序 1,#cat /proc/stat/ 信息包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累积到当前时刻 2,#vmstat –s 或者#vmstat 虚拟内存统计 3, #cat ...

  3. linux系统预留内存和磁盘大小

    默认情况下, Linux 会最多使用 40% 的可用内存作为文件系统缓存.当超过这个阈值后,文件系统会把将缓存中的内存全部写入磁盘, 导致后续的 IO 请求都是同步的. 将缓存写入磁盘时,有一个默认1 ...

  4. linux系统判断内存是否达到瓶颈的小技巧

    1.linux下最常用的系统状态监控工具top 工具,可以使用top -c 来进行查看当前内存的占用情况 free 为内存的剩余状态,当前为3.8G的空闲内存,总的物理内存是8G,按键 shift+m ...

  5. linux系统中内存爆满之后会如何?

    在使用python写程序的时候,发现一个可以无限迭代的迭代器,从而可以直接将系统中的内存占满,那么占满之后会发生什么呢? 1. 创建无限迭代,生成列表,如下: [root@python ~]# pyt ...

  6. Shell 脚本来自动监控 Linux 系统的内存

    # vim /scripts/swap-warning.sh #!/bin/bash #提取本服务器的IP地址信息 IP=`ifconfig eth0 | grep "inet addr&q ...

  7. [Linux系统]查看内存的几种方式

    1. cat /proc/meminfo 2.free -m3.vmstat -s4.ps命令可以实时的显示各个进程的内存使用情况.Reported memory usage information ...

  8. linux系统CPU内存磁盘监控发送邮件脚本

    #!/bin/bashexport PATHexport LANG=zh_CN.UTF-8###top之后输入数字1,可以查看每颗CPU的情况.###先配置好mailx邮箱账号密码:#cat>/ ...

  9. linux概念之内存分析

    linux内存总结 分析样本[root@-comecs ~]# free total used free shared buffers cached Mem: -/+ buffers/cache: S ...

随机推荐

  1. c#根据配置文件反射

    由于项目中用到了反射,准备把各个类库都先写在配置文件中,然后读取配置文件,再对配置文件中配置的类库进行反射. 这样做的好处是各个类库保持独立,其中一个类库出现问题不会影响其他类库,更新项目时,只要更新 ...

  2. JavaScript日常学习3

    JavaScript函数  函数就是包裹在花括号中的代码块,前面使用了关键词 function: function functionname()     {执行代码} function myFunct ...

  3. koa-session 持久化

    一.使用mongoose链接数据库 'use strict'; const mongoose = require('mongoose'); const config = require('config ...

  4. Client Dimensions , offsetHeight , scrollTop 属性详解

    http://stackoverflow.com/questions/22675126/what-is-offsetheight-clientheight-scrollheight http://ww ...

  5. 嵌入式【杂记--手机芯片与pc】

    手机.身边的移动设备大多数是嵌入式计算机,pc也是计算机,只是功耗上很大. 手机所采用的大多数芯片是英国ARM公司的架构coretom A系列 core, Intel公司采用自己的架构设计的芯片适用于 ...

  6. 例子 使用sqlite3 数据库建立数据方式

    #!/usr/bin/env python#coding:utf-8import sqlite3#建立一个数据库cx = sqlite3.connect("E:/test.db") ...

  7. ES5与ES6常用语法教程之 ②解构语法糖、声明变量异同

    js常用语法系列教程如下 es5与es6常用语法教程(1) es5与es6常用语法教程(2) es5与es6常用语法教程(3) es5与es6常用语法教程(4) es5与es6常用语法教程(5) es ...

  8. C++学习笔记-new与delete

    C++新增了new和delete关键字,用来开辟内存,对应的就是C语言的malloc和free 对比new/delete和malloc/free malloc和free是库函数,以字节为单位申请堆内存 ...

  9. 非常好的一个JS代码(RelativePosition.js)

    var RelativePosition = function(){ function getLeft( align, rect, rel ){ var iLeft = 0; switch (alig ...

  10. jenkins pipline 和 jenkinsfile

    Jenkins Pipeline(或简称为 "Pipeline")是一套插件,将持续交付的实现和实施集成到 Jenkins 中.Jenkins Pipeline 提供了一套可扩展的 ...