[译] Linux吃掉了我的内存

英文原文: https://www.linuxatemyram.com/
作者: Vidar Holen
译者: thinkam
发生了什么?
Linux正借用你未使用的内存来做磁盘缓存。这使你的计算机看起来可用内存很少,但事实不是这样!一切都很正常!
为什么这么做?
磁盘缓存使你的系统运行更快更流畅!除了使新手感到困惑,这没什么缺点。它从来没有以任何方式从你的应用拿走内存。
如果我想运行更多的应用该怎么办?
如果你的应用想要获取更多的内存,系统会从磁盘缓存中拿走一块被借用的内存。磁盘缓存会立即还给应用!你的计算机可用内存的并不少!
我需要更多的交换分区(swap)吗?
不需要,磁盘缓存仅会借用应用目前不需要的内存。它不会使用交换分区。如果应用需要更多的内存,系统会从磁盘缓存中拿回来。系统不会使用交换分区。
我如何让Linux停止这样做?
你不能禁用磁盘缓存。任何人想要禁用磁盘缓存的唯一理由是他认为这从他的应用中拿走了内存,但事实不是这样!磁盘缓存可以让应用加载更快并且运行更加流畅,但它却从来没有拿走内存!因此,没有任何理由去禁用它!
如果不是这样,为什么top和free命令说我所有的内存已被使用?
这仅仅是用辞的差异。你和Linux系统一致认为被应用占用的内存称为used,而没有被任何程序使用的部分称为free。
但是,你认为目前被占用但仍然可以被应用使用的内存称作什么呢?
你可能认为这部分内存是free或available。而Linux系统称它used或available:
| 内存 | 你称它 | Linux称它 |
|---|---|---|
| 被应用使用 | used |
used |
| 被占用,但可以使用 | free(或available) |
used(或available) |
| 没有用来做任何事 | free |
free |
译注:老版
free命令中被占用但可以使用的内存称为used(used中的一部分,即buffers+cached), 而新版的free命令中称之为available。
不严格来讲,top和free命令称这部分内存为buffers和cached。因为你和Linux用辞的差异,你可能认为你的计算机可用内存很少,不过事实并非如此。
译注:这部分内存准确来说是新版本
free命令中的available或者是新版本top命令中的avail Mem。
我怎么看我真正还有多少可用内存?
为了弄明白除了交换分区外你的应用可以使用多少内存,执行free -m命令,然后查看available那一列:
$ free -m
total used free shared buff/cache available
Mem: 1504 1491 13 0 855 792
Swap: 2047 6 2041
(2016年之前的Linux安装版本,在-/+ buffers/cache那排查看free列)
这是你以MB为单位的答案。如果你天真地查看used和free,你会认为你的内存几乎快占满达到99%,然而实际仅仅只有47%!
如果想查看更详细、更专业的关于Linux统计available内存大小的描述,请看the commit that added the field.
什么时候我该开始担心?
一个拥有足够内存的、运行良好的Linux系统在运行一段时间后会表现出以下预期的无害特征:
free内存接近于0used内存接近总共内存available内存(或者是free + buffers/cache)有足够空间(比如说:总内存的20%以上)swap used没有发生变化
真正的内存不够、你也许想调查原因的情形,警告标志如下:
available内存(或者是free + buffers/cache)接近于0swap used在增加或者波动dmesg | grep oom-killer命令显示OutOfMemory-killer程序正在运行
我如何验证这些?
如果想了解更多细节和做实验测试磁盘缓存的影响,请看这个页面。我做了少量的工作只是想让你感激磁盘缓存,而不是让你测试你的硬件速度提升了几个数量级。
[译] Linux吃掉了我的内存的更多相关文章
- linux下对进程按照内存使用情况进行排序
linux下对进程按照内存使用情况进行排序的命令为:ps aux --sort -rss 详细解说参见 http://alvinalexander.com/linux/unix-linux-proce ...
- 浅析Linux下进程间通信:共享内存
浅析Linux下进程间通信:共享内存 共享内存允许两个或多个进程共享一给定的存储区.因为数据不需要在客户进程和服务器进程之间复制,所以它是最快的一种IPC.使用共享内存要注意的是,多个进程之间对一给定 ...
- 在 linux x86-32 模式下分析内存映射流程
前言 虚拟内存机制已经成为了现代操作系统所不可缺少的一部分, 不仅可以为每个程序提供独立的地址空间保证安全性,更可以通过和磁盘的内存交换来提高内存的使用效率.虚拟内存管理作为linux 上的重要组成部 ...
- Linux Kernel 释放后重用内存损坏漏洞
漏洞名称: Linux Kernel 释放后重用内存损坏漏洞 CNNVD编号: CNNVD-201307-305 发布时间: 2013-07-18 更新时间: 2013-07-18 危害等级: ...
- 编程获取linux的CPU使用的内存使用情况
Linux可用下top.ps命令检查当前的cpu.mem用法.下面简单的例子: 一.采用ps查看资源消耗的过程 ps -aux 当您查看进程信息,第三列是CPU入住. [root@localhost ...
- Linux 上 C 程序的内存布局
在仔细研究这个问题之前,我认为 C 程序在内存中只有代码段,堆和栈三部分构成.前几天面试被问到了这个问题,才发现自己的印象是不完全的. 在本文中通过解析析一个 C 程序中变量和函数的地址来分析 C 程 ...
- linux下的CPU、内存、IO、网络的压力测试
linux下的CPU.内存.IO.网络的压力测试 要远程测试其实很简单了,把结果放到一个微服务里直接在web里查看就可以了,或者同步到其他服务器上 一.对CPU进行简单测试: 1.通过bc命令计算特 ...
- Linux 查看物理 CPU、内存信息
可以通过本文如下方法查看云服务器 Linux 系统的 CPU.内存相关信息: 说明: 总核数 = 物理CPU个数 × 每颗物理CPU的核数 总逻辑CPU数 = 物理CPU个数 × 每颗物理CPU的核数 ...
- [转帖]linux下的CPU、内存、IO、网络的压力测试
linux下的CPU.内存.IO.网络的压力测试 https://www.cnblogs.com/zhuochong/p/10185881.html 一.对CPU进行简单测试: 1.通过bc命令计算特 ...
随机推荐
- JavaScript对于switch语句中的case后键入值的带不带引号
一.用switch选择星期几 这时case为 例:case="星期一" 二.用switch选择单纯的数字 这时case为 例:case='1' 三.用switch选择一个应用了 ...
- 认识Java中的字符串
Java 中 String 类的常用方法 Ⅰ String 类提供了许多用来处理字符串的方法,例如,获取字符串长度.对字符串进行截取.将字符串转换为大写或小写.字符串分割等,下面我们就来领略它的强大之 ...
- Gym 101667I Slot Machines
原题传送门 题意:给定n(n≤106)个数,要求将它化为混偱环小数的形式,即前k个数不参与循环,之后所有数以p为循环节长度进行循环.求k和p,要求k+p尽量小,k+p相等时要求p尽量小. 样例1 输入 ...
- 给“file”类型的input框赋值的问题
开发"新闻编辑"功能时,会遇到给"file"类型的input框赋值的问题,用来展示之前上传的文件,但由于file类型的input框受到安全限制,所以不能被赋值, ...
- PE 001~010
题意: 001(Multiples of 3 and 5):对小于1000的被3或5整除的数字求和. 002(Even Fibonacci numbers):斐波那契数列中小于等于4 000 000的 ...
- 51Nod 1182 完美字符串(字符串处理 贪心 Facebook Hacker Cup选拔)
1182 完美字符串 题目来源: Facebook Hacker Cup选拔 基准时间限制:1 秒 空间限制:1 ...
- HDU 2546 饭卡(01背包裸题)
饭卡 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
- Spring配置集群定时任务
正常配置定时任务的时候配置定时任务调度工厂的代码如下 <bean id="" class="org.springframework.scheduling.quart ...
- ImportError: No module named 'BaseHTTPServer':解决方案
利用python写了一小段代码,里面使用到了Python标准库的BaseHTTPServer来构建一个基础HTTP服务器: 1 #-*- coding:utf-8 -*- 2 import http. ...
- 获取Object对象的length
所有JS程序猿(甚至不止JS)都知道,数组(Array)是有length的,通过length属性,可以很方便的获取数组的长度.可以说,只要使用到了数组,就必会使用到其length属性. 而Object ...