Linux 内存机制

转载链接:http://blog.csdn.net/tianlesoftware/article/details/5463790


. 内存使用说明

Free 命令相对于top 提供了更简洁的查看系统内存使用情况:

[root@rac1 ~]# free 

             total       used       free     shared    buffers     cached

Mem:       1035108   1008984      26124      0     124212     413000

-/+ buffers/cache:        471772      563336

Swap:       2096472   842320     1254152

 

这里显示的单位是KB

 

       在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于开启过的程序、或是读取刚存取过得数据会比较快。

 

Mem:表示物理内存统计。
-/+ buffers/cached:表示物理内存的缓存统计
Swap:表示硬盘上交换分区的使用情况。只有mem被当前进程实际占用完,即没有了buffers和cache时,才会使用到swap。

 

Mem 行(第一行)数据说明:

       Total:1035108KB。表示物理内存总大小。

       Used:1008984KB。表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用。

       Free:26124KB。表示未被分配的内存。

       Shared:0kb。共享内存,一般系统不会用到。

       Buffers:124212KB。系统分配但未被使用的buffers 数量。

       Cached:413000KB。系统分配但未被使用的cache 数量。

 

-/+ buffers/cache 行(第二行)数据说明:

       Used:471772kb,实际使用的buffers 与cache 总量,也是实际使用的内存总量。

       Free: 563336kb, 未被使用的buffers 与cache 和未被分配的内存之和,这就是系统当前实际可用内存。

 

根据以上分析,可以得出一下结论:

1.  实际可用内存大小:

       Free(-/+ buffers/cache行)= Free(Mem)+buffers(Mem)+Cached(Mem);

                                   563336 = 26124 + 124212+ 413000

 

2.  已经分配的内存大小:

       Used(Mem) = Used(-/+ buffers/cache)+ buffers(Mem) + Cached(Mem)

              1008984kb = 471772 + 124212 +413000

 

3.  物理内存总大小

       total(Mem) = used(-/+ buffers/cache) + free(-/+ buffers/cache)

                     1035108 = 471772 + 563336

 

 

二. Swap配置对性能的影响

       分配太多的Swap空间会浪费磁盘空间,而Swap空间太少,则系统会发生错误。 如果系统的物理内存用光了,系统就会跑得很慢,但仍能运行;如果Swap空间用光了,那么系统就会发生错误。例如,Web服务器能根据不同的请求数量衍生出多个服务进程(或线程),如果Swap空间用完,则服务进程无法启动,通常会出现“application is out of memory”的错误,严重时会造成服务进程的死锁。因此Swap空间的分配是很重要的。


       通常情况下,Swap空间应大于或等于物理内存的大小,最小不应小于64M,通常Swap空间的大小应是物理内存的2-2.5倍。但根据不同的应用,应有不同的配置:如果是小的桌面系统,则只需要较小的Swap空间,而大的服务器系统则视情况不同需要不同大小的Swap空间。特别是数据库服务器和Web服务器,随着访问量的增加,对Swap空间的要求也会增加,一般来说对于4G以下的物理内存,配置2倍的swap4G以上配置1倍。

另外,Swap分区的数量对性能也有很大的影响。因为Swap交换的操作是磁盘IO的操作,如果有多个Swap交换区,Swap空间的分配会以轮流的方式操作于所有的Swap,这样会大大均衡IO的负载,加快Swap交换的速度。如果只有一个交换区,所有的交换操作会使交换区变得很忙,使系统大多数时间处于等待状态,效率很低。用性能监视工具就会发现,此时的CPU并不很忙,而系统却慢。这说明,瓶颈在IO上,依靠提高CPU的速度是解决不了问题的。

 

Linux 内存机制

Linux支持虚拟内存(Virtual Mmemory),虚拟内存是指使用磁盘当作RAM的扩展,这样可用的内存的大小就相应地增大了。内核会将暂时不用的内存块的内容写到硬盘上,这样一来,这块内存就可用于其它目的。当需要用到原始的内容时,它们被重新读入内存。这些操作对用户来说是完全透明的;Linux下运行的程序只是看到有大量的内存可供使用而并没有注意到时不时它们的一部分是驻留在硬盘上的。当然,读写硬盘要比直接使用真实内存慢得多(要慢数千倍),所以程序就不会象一直在内存中运行的那样快。用作虚拟内存的硬盘部分被称为交换空间(Swap Space)。

 

一般,在交换空间中的页面首先被换入内存;如果此时没有足够的物理内存来容纳它们又将被交换出来(到其他的交换空间中)。如果没有足够的虚拟内存来容纳所有这些页面,Linux就会波动而不正常;但经过一段较长的时间Linux会恢复,但此时系统已不可用了。
       有时,尽管有许多的空闲内存,仍然会有许多的交换空间正被使用。这种情况是有可能发生的,例如如果在某一时刻有进行交换的必要,但后来一个占用很多物理内存的大进程结束并释放内存时。被交换出的数据并不会自动地交换进内存,除非有这个需要时。此时物理内存会在一段时间内保持空闲状态。对此并没有什么可担心的,但是知道了是怎么一回事,也就无所谓了。
       许多操作系统使用了虚拟内存的方法。因为它们仅在运行时才需要交换空间,以解决不会在同一时间使用交换空间,因此,除了当前正在运行的操作系统的交换空间,其它的就是一种浪费。所以让它们共享一个交换空间将会更有效率。

 

注意:如果会有几个人同时使用这个系统,他们都将消耗内存。然而,如果两个人同时运行一个程序,内存消耗的总量并不是翻倍,因为代码页以及共享的库只存在一份。


       Linux系统常常动不动就使用交换空间,以保持尽可能多的空闲物理内存。即使并没有什么事情需要内存,Linux也会交换出暂时不用的内存页面。这可以避免等待交换所需的时间:当磁盘闲着,就可以提前做好交换。可以将交换空间分散在几个硬盘之上。针对相关磁盘的速度以及对磁盘的访问模式,这样做可以提高性能。


       与访问物理内存相比,磁盘的读写是很慢的。另外,在相应较短的时间内多次读磁盘同样的部分也是常有的事。例如,某人也许首先阅读了一段E-mail消息,然后为了答复又将这段消息读入编辑器中,然后又在将这个消息拷贝到文件夹中时,使得邮件程序又一次读入它。或者考虑一下在一个有着许多用户的系统中 ls命令会被使用多少次。通过将信息从磁盘上仅读入一次并将其存于内存中,除了第一次读以外,可以加快所有其它读的速度。这叫作磁盘缓冲(Disk Buffering),被用作此目的的内存称为高速缓冲(Buffer Cache)。但是,由于内存是一种有限而又不充足的资源,高速缓冲不可能做的很大(它不可能包容要用到的所有数据)。当缓冲充满了数据时,其中最长时间不用的数据将被舍弃以腾出内存空间用于新的数据。


       对写磁盘操作来说磁盘缓冲技术同样有效。一方面,被写入磁盘的数据常常会很快地又被读出(例如,原代码文件被保存到一个文件中,又被编译器读入),所以将要被写的数据放入缓冲中是个好主意。另一方面,通过将数据放入缓冲中,而不是将其立刻写入磁盘,程序可以加快运行的速度。以后,写的操作可以在后台完成,而不会拖延程序的执行。

大多数操作系统都有高速缓冲(尽管可能称呼不同),但是并不是都遵守上面的原理。有些是直接写(Write-Through)数据将被立刻写入磁盘(当然,数据也被放入缓存中)。如果写操作是在以后做的,那么该缓存被称为后台写(Write-Back)后台写比直接写更有效,但也容易出错:如果机器崩溃,或者突然掉电,缓冲中改变过的数据就被丢失了。如果仍未被写入的数据含有重要的薄记信息,这甚至可能意味着文件系统(如果有的话)已不完整。


       针对以上的原因,出现了很多的日志文件系统,数据在缓冲区修改后,同时会被文件系统记录修改信息,这样即使此时系统掉电,系统重启后会首先从日志记录中恢复数据,保证数据不丢失。当然这些问题不再本文的叙述范围。


       由于上述原因,在使用适当的关闭过程之前,绝对不要关掉电源,Sync命令倾空(Flushes)缓冲,也即,强迫所有未被写的数据写入磁盘,可用以确定所有的写操作都已完成。在传统的UNIX系统中,有一个叫做update的程序运行于后台,每隔30秒做一次sync操作,因此通常无需手工使用sync命令了。Linux另外有一个后台程序,Bdflush,这个程序执行更频繁的但不是全面的同步操作,以避免有时sync的大量磁盘I/O操作所带来的磁盘的突然冻结。


       在Linux中,Bdflush是由update启动的。通常没有理由来担心此事,但如果由于某些原因bdflush进程死掉了,内核会对此作出警告,此时你就要手工地启动它了(/sbin/update)。

缓存(Cache)实际并不是缓冲文件的,而是缓冲块的,块是磁盘I/O操作的最小单元(在Linux中,它们通常是1KB)。这样,目录、超级块、其它文件系统的薄记数据以及非文件系统的磁盘数据都可以被缓冲了。缓冲的效力主要是由它的大小决定的。缓冲太小的话等于没用。它只能容纳一点数据,因此在被重用时,所有缓冲的数据都将被倾空。实际的大小依赖于数据读写的频次、相同数据被访问的频率。只有用实验的方法才能知道。
       如果缓存有固定的大小,那么缓存太大了也不好,因为这会使得空闲的内存太小而导致进行交换操作(这同样是慢的)。为了最有效地使用实际内存,Linux自动地使用所有空闲的内存作为高速缓冲,当程序需要更多的内存时,它也会自动地减小缓冲的大小。


       这就是一般情况下Linux内存的一般机制,真正的Linux内存的运行机制远远比这个复杂。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/276507.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

network中的请求信息,headers中的每一项分别是什么意义?

这里是修真院前端小课堂,每篇分享文从 【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】 八个方面深度解析前端知识/技能,本篇分享的是: 【network中的请求信息,headers中的每…

学习 sentry 源码整体架构,打造属于自己的前端异常监控SDK

前言这是学习源码整体架构第四篇。整体架构这词语好像有点大,姑且就算是源码整体结构吧,主要就是学习是代码整体结构,不深究其他不是主线的具体函数的实现。文章学习的是打包整合后的代码,不是实际仓库中的拆分的代码。其余三篇分…

巴西龟吃什么

1、活虾,哈哈,巴西龟最喜欢的食物,超市很多鸡尾虾买的,就那种,要活的,锻炼它们的天性,一次一只可以吃一、两天; 2、蚶子,贝壳类,活的,整个扔进去&…

绑定dictionary 给定关键字不再字典中_VBA代码集锦-利用字典做两列数据的对比并对齐...

源数据:代码:Sub 对比()Dim arr, brr, crrDim i, j, n, lastrowA, lastrowB As Integer建立字典对象Set d CreateObject("scripting.dictionary")获取数据区域最后一行的行数lastrowA Sheets("对比对齐两列数据").Cells(Rows.Coun…

linux启动时挂载rootfs的几种方式 .

转载链接:http://blog.csdn.net/zuokong/article/details/9022707 根文件系统(在样例错误消息中名为 rootfs)是 Linux 的最基本的组件。根文件系统包含支持完整的 Linux 系统所需的所有内容。它包含所有应用程序、配置、设备、数据等 Linux 中…

PHP 手册

by:Mehdi AchourFriedhelm BetzAntony DovgalNuno LopesHannes MagnussonGeorg RichterDamien SeguyJakub Vrana其他贡献者2018-06-19Edited By: Peter Cowburn中文翻译人员:肖盛文洪建家穆少磊宋琪黄啸宇王远之肖理达乔楚戴劼褚兆玮周梦康袁玉强段小强© 1997-…

前端使用puppeteer 爬虫生成《React.js 小书》PDF并合并

前端也可以爬虫,写于2018年08月29日,现在发布到微信公众号申明原创。掘金若川 本文章链接:https://juejin.im/post/5b86732451882542af1c80821、 puppeteer 是什么?puppeteer: Google 官方出品的 headless Chrome node 库puppetee…

蜘蛛与佛的故事

最近闭关,空面四壁,窗外层峦叠嶂,窗台上只有一盆花每日陪着我,朋友们都说我要成佛了,想想也是! 于是在闭关即将结束的时候找了一篇佛的故事送给自己,希望自己能够顿悟一些"禅"机。 从前,有一座圆音寺,每天都…

信息安全管理与评估_计算机工程学院教师参加“信息安全管理与评估赛项”说明会...

看了就要关注我,喵呜~2019年3月15日下午,2019年陕西省高等职业院校技能大赛“信息安全管理与评估赛项说明会”在咸阳职业技术学院举行。出席本次会仪的有咸阳职业技术学院教务处长杨新宇、神州数码范永强经理、神州数码信息安全工程师高峰和各院校指导教…

haproxy概念和负载均衡

https://pan.baidu.com/s/1Sq2aJ35zrW2Xn7Th9j7oOA //软件百度网盘连接 在80.100虚拟机上 systemctl stop firewalld //关闭防火墙 setenforce 0 //关闭监控 yum install lrz* -y //安装上传软件 tar xf haproxy-1.5.15.tar.gz -C /opt/ //解压压缩包到/opt/ cd /op…

PHP用户注册邮箱验证激活帐号

转载链接:http://www.helloweba.com/view-blog-228.html 本文将结合实例,讲解如何使用PHPMysql完成注册帐号、发送激活邮件、验证激活帐号、处理URL链接过期的功能。 业务流程 1、用户提交注册信息。 2、写入数据库,此时帐号状态未激活。 …

知乎问答:一年内的前端看不懂前端框架源码怎么办?

知乎问答:一年内的前端看不懂前端框架源码怎么办?以下是我的回答,阅读量 1000。现在转载到微信公众号中。链接:https://www.zhihu.com/question/350289336/answer/910970733其他回答的已经很好了。刚好最近在写学习源码整体架构系…

帮自己发个求职简历

帮自己发个求职简历 发个求职信息。本人擅长Web开发,尤其擅长Flex,愿从事Web开发,最好是Web前端开发,下面是我的详细个人简历: 个人信息: 姓名:伍国耀 年龄:23 性别:男 专…

python函数 global_**Python的函数参数传递 和 global

函数的参数到底是传递的一份复制的值,还是对内存的引用?我们看下面一段代码:a []def fun(x):x.append(1)fun(a)print(a)想想一下:如果传递的是一份复制的值,那么列表a应该是不会变化的,还是空列表&#xf…

冷启动问题:如何构建你的机器学习组合?

作为即将告别大学的机器学习毕业狗的你,会不会有种迷茫的感觉?你知道 HR 最看重的是什么吗?在求职季到来之前,毕业狗要怎么做,才能受到 HR 的青睐、拿到心仪的 Offer 呢?负责帮助应届生找到机器学习工作的 …

JavaScript 对象所有API解析【2020版】

写于 2017年08月20日,虽然是2017年写的文章,但现在即将2020年依旧不过时,现在补充了2019年新增的ES10 Object.fromEntries()。发到公众号申明原创。若川顺便在此提前祝大家:2020年更上一层楼。近日发现有挺多人对对象基础API不熟悉…

javascript操作符之new 也疯狂 (2)

JavaScript本是一种基于原形的(prototypal)语言,但它的“new”操作符看起来有点像经典语言。这迷惑了广大程序员们,并导致了很多使用上的问题。 在JavaScript中,不要用到new Object()这种操作,该用{ }来代替…

python中if语句缺省else_9_【Python学习分享文章】_if(条件语句)

【Python学习分享文章】_if(条件语句)_logicalJudgement介绍及基本操作综述计算机的“条件语句”和生活中的“条件成立”是不一样的。一个生活中的例子如果被计算机执行则是如下段子:老婆让程序员老公去买苹果,说:“去水果店买5个苹果&#x…

PHP生成各种验证码和Ajax验证

转载链接:http://www.helloweba.com/view-blog-191.html 验证码在WEB应用中非常重要,通常用来防止用户恶意提交表单,如恶意注册和登录、论坛恶意灌水等。本文将通过实例讲解使用PHP生成各种常见的验证码包括数字验证码、数字字母验证码、中文…

若川的2019年度总结,波澜不惊

从2014年开始写年度总结至今已经六个年头了。正如孔子所说:逝者如斯夫,不舍昼夜。2019年的年度总结写得比较晚,都快农历新年了,此刻在家里继续写完这篇文章。往年基本是元旦之后几天就写完了。我的年度总结尽量写得非技术人员也能…