您的位置首页>企业动态>

Linux吃掉我的内存

导读大家好,我是极客范的本期栏目编辑小友,现在为大家讲解Linux吃掉我的内存问题。在Windows下,资源管理器查看内存使用情况。如果使用率达到

大家好,我是极客范的本期栏目编辑小友,现在为大家讲解Linux吃掉我的内存问题。

在Windows下,资源管理器查看内存使用情况。如果使用率达到80%以上,运行大程序后系统会感觉不流畅。因为交换分区是在内存不足时使用的,所以频繁地从磁盘换入和换出页面会极大地影响系统的性能。当我们使用free命令检查Linux系统的内存使用情况时,我们会发现内存使用情况总是处于较高的水平,即使此时系统并没有运行多少软件。这就是Windows和Linux在内存管理上的区别。乍一看,Linux吃了我的ram,但实际上这也是它内存管理的特点。

free命令介绍以下是使用free命令检查我们实验室文件服务器内存的结果。-m选项意味着使用MB作为单位:

[root @ archlab-server 2 ~]# Free-m total已用空闲共享缓冲区cache DMEM : 3920 1938 1982 0 497 1235-/buffers/cache : 205 3714 swap 3360 4095 0 409512345[root @ archlab-server 2 ~]# Free-m total已用空闲共享缓冲区cache mem : 3920 1938 1982 0 497 1197

Mem:总计=3920MB,

使用=1938MB,

免费=1982MB,

共享内存=0MB,

缓冲器=497MB,

缓存=1235MB

注意:前四项很容易理解。缓冲区和缓存找不到合适的单词进行翻译。它们的区别如下:

缓冲区是尚未“写入”磁盘的东西。缓存是从磁盘上“读取”并存储起来供以后使用的东西。也就是说,缓冲区用于存储要输出到磁盘的数据,而缓存用于从磁盘读取存储在内存中的数据以备将来使用。它们都是为了提供IO的性能而引入的。

输出的第三行表示基于第二行/缓冲区/高速缓存获得的内容:

使用的缓冲区/缓存=使用的Mem缓冲区缓存=1938 MB497 MB1235 MB=205 MB

缓冲区/缓存空闲=Mem空闲缓存的缓冲区=1982MB 497MB 1235MB=3714MB

输出的第三行指示交换分区的使用:

交换:总计=4095MB。

已用=0MB。

免费=4095MB。

因为系统目前有足够的内存,所以没有使用交换分区。

上面的输出结果可能是难以理解的第三行。我们为什么要向用户显示这一行数据?内存使用减去系统缓冲区/缓存中的内存意味着什么?系统空闲内存加上缓冲区/缓存内存意味着什么?

内存分类我们将内存分为三类,从用户和操作系统的角度来看,这三类内存的用法有不同的名称:

你称之为itLinux调用它由applicaTIons used used available for applicaTIons使用,用于一些空闲的东西,不用于任何空闲的东西,上表中的一些内容代表了free命令中“缓冲区/缓存”的内存。由于这个内存实际上是从操作系统的角度来使用的,如果用户想使用它,这个内存可以快速回收并被用户程序使用,所以从用户的角度来看这个内存应该归类为空闲。

再次回到free命令的输出结果,应该理解第三行的输出结果,从用户的角度来看,这一行的数字表示系统内存的使用情况。因此,如果使用top或free命令查看系统中还剩多少内存,实际上应该将空闲内存添加到缓冲区/缓存内存中,这就是实际系统的空闲内存。

缓冲区/缓存Linux内存管理的优势已经过精心设计。除了缓存dentry(在VFS用于加快从文件路径名到inode的转换),它还采用了两种主要的缓存模式:Buffer Cache和Page Cache,旨在提高磁盘io的性能。从低速块设备读取数据将暂时存储在内存中。即使当时不再需要数据,也可以在应用程序下次访问数据时直接从内存中读取,从而绕过低速块设备,提高整个系统。

性能。

而Linux会充分利用这些空闲的内存,设计思想是内存空闲还不如拿来多缓存一些数据,等下次程序再次访问这些数据速度就快了,而如果程序要使用内存而系统中内存又不足时,这时不是使用交换分区,而是快速回收部分缓存,将它们留给用户程序使用。

因此,可以看出,buffers/cached真是百益而无一害,真正的坏处可能让用户产生一种错觉——Linux耗内存!其实不然,Linux并没有吃掉你的内存,只要还未使用到交换分区,你的内存所剩无几时,你应该感到庆幸,因为Linux 缓存了大量的数据,也许下一次你就从中受益!

实验证明

下面通过实验来验证上面的结论:

我们先后读入一个大文件,比较两次读入的实践:

首先生成一个1G的大文件       [root@archlab-server2 ~]# dd if=/dev/zero of=bigfile bs=1M count=10001000+0 records in1000+0 records out1048576000 bytes (1.0 GB) copied, 15.8598 s, 66.1 MB/s[root@archlab-server2 ~]# du -h bigfile1001M bigfile123456[root@archlab-server2 ~]# dd if=/dev/zero of=bigfile bs=1M count=10001000+0 records in1000+0 records out1048576000 bytes (1.0 GB) copied, 15.8598 s, 66.1 MB/s[root@archlab-server2 ~]# du -h bigfile1001M bigfile清空缓存       [root@archlab-server2 ~]# echo 3 | tee /proc/sys/vm/drop_caches3[root@archlab-server2 ~]# free -m    total used free shared buffers cachedMem:    3920 154 3766 0 0 33-/+ buffers/cache: 120 3800Swap: 4095 0 40951234567[root@archlab-server2 ~]# echo 3 | tee /proc/sys/vm/drop_caches3[root@archlab-server2 ~]# free -m         total     used     free     shared    buffers    cachedMem:     3920       154     3766      0         0          33-/+ buffers/cache:   120     3800Swap:      4095      0       4095读入这个文件,测试消耗的时间       [root@archlab-server2 ~]# TIme cat bigfile > /dev/nullreal 0m18.449suser 0m0.013ssys 0m0.617s[root@archlab-server2 ~]# free -m total used free shared buffers cachedMem: 3920 1159 2761 0 3 1035-/+ buffers/cache: 120 3800Swap: 4095 0 4095123456789[root@archlab-server2 ~]# TIme cat bigfile > /dev/nullreal 0m18.449suser 0m0.013ssys 0m0.617s[root@archlab-server2 ~]# free -m          total      used     free     shared    buffers     cachedMem:      3920       1159     2761     0         3           1035-/+ buffers/cache:   120      3800Swap:      4095      0        4095再次读入该文件,测试消耗的时间       [root@archlab-server2 ~]# time cat bigfile > /dev/nullreal 0m0.310suser 0m0.005ssys 0m0.304s1234[root@archlab-server2 ~]# time cat bigfile > /dev/nullreal 0m0.310suser 0m0.005ssys 0m0.304s

从上面看出,第一次读这个1G的文件大约耗时18s,而第二次再次读的时候,只耗时0.3s,足足提升60倍!

参考资料:

https://groups.google.com/forum/#!topic/shlug/Dvc-ciKGt7s/discussion实验室师兄以前提出”cp命令占用双倍内存问题”,在SLUG上的讨论,正是这个疑惑一直在我心中

http://www.linuxatemyram.com/前两天在Hacker News看到”Linux ate my ram”这个网页,写的通俗易懂,也顺藤摸瓜解决心中很多疑惑

http://www.linuxatemyram.com/play.html作者给出了其他的实验来分别验证磁盘cache对程序分配、交换分区、程序加载时间等的影响

http://www.cnblogs.com/coldplayerest/archive/2010/02/20/1669949.html一篇对free命令介绍的博客

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。