linux下,一个运行中的程序,究竟占用了多少linux 内存占用高

对一个程序在内存中的分析_Linux教程_Linux公社-Linux系统门户网站
你好,游客
对一个程序在内存中的分析
来源:Linux社区&
作者:bullbat
内存管理是操作系统的核心;它对于程序员和系统管理员都很关键。在接下来的几篇文章里面我将对内存的关键技术做谈论,但是不会远离其本质。然而概念很普通,例子多半来自32位X86系统的LINUX和Window操作系统。这第一篇文章谈论程序在内存中如何存放。
在多任务操作系统中的每一个进程运行在他自己的内存地址空间中。这个地址空间就是虚拟地址空间,虚拟地址空间在32位模式下总是4GB大小的内存地址。这些虚拟地址用页表方式映射物理内存,页表由操作系统内核维护,由处理器访问。每个进程有自己的页表集合,但这里有个难以理解的地方。一旦虚拟地址(作者的意思也就是分页机制)开启,它应用与所有正在运行与机器上的软件,包括内核自身。这样一部分虚拟地址空间必须保留用于内核:
这并不意味着内核使用那么多物理内存,只是他运用那部分可用的地址空间去映射他实际希望的物理内存大小。内核空间在页表中标志为特权级代码(等级小于等于2),这样当用户模式程序访问他时就会触发一个访页错误。在LINUX中,内核空间一直处于当前状态并且在所有进程中映射到相同的物理内存。内核代码和数据在任何时候总是为中断服务和系统调用做好寻址的准备。相反,用于映射用户模式的地址空间部分将会在进程切换的时候发生改变。
蓝色区域代表已经映射物理内存的虚拟地址,白色区域为没映射部分。在上面的例子中,Firefox由于他的巨大的内存需求,已经使用了他的大部分虚拟地址空间。地址空间中不同的带对应内存段如堆、栈等等。需要注意的是这些段就是简单的内存地址范围,他和Intel汇编中的”段”不相干。下面是在LINUX进程中标准的段视图:
当计算安全时,如上面的段所示,对于机器中的几乎每一个进程的开始虚拟地址都相同。这使得很容易远程利用安全漏洞。一个漏洞,往往需要引用绝对内存位置:栈上的地址,库函数的地址,等等。远程攻击必须盲目地选择这个内存位置,正指望这所有的地址空间都是一样的。如果真是这样,那么太容易被攻击了。故而地址空间的随机化就变得通用了。LINUX以在栈、内存映射段和堆的起始地址加上偏移的方式随机化他们。不幸的是,32位地址空间很紧缺,留下很少的空间用来做随机化从而牵制了他的有效性。
进程地址空间中最上面的段为栈,很多语言中栈用于存储本地变量和函数参数。调用一个方法或函数时压入栈一个新的栈帧。当函数返回时,这个压入的栈帧被释放。这个简单的设个,可能是因为数据遵循严格的FIFO次序,这意味着再复杂的数据结构都无需跟踪栈内容——一个简单的栈顶指针将会做跟踪作用。这样入栈和出栈非常快速和准确。进一步,堆栈地区不断重用,往往在CPU缓存中持有活跃的栈内存,加快存取。进程中的每个线程获得他自己的栈。
相关资讯 & & &
& (07/28/:23)
& (11/03/:38)
& (06/06/:40)
& (01/28/:00)
& (10/07/:52)
& (05/15/:55)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款linux下怎么查看mongodb的内存占用情况? - 开源中国社区
当前访客身份:游客 [
当前位置:
对linux了解不是很深入,只能说是能用的状态,对内存概念什么的了解不是很彻底。mongodb也是最近才上手的,现在疑惑的是在centos下怎么去看到底mongodb用了多少内存?也算是linux下内存管理的一个子集吧。
下面是TOP显示的内容:
这里的%MEM貌似是物理内存使用百分比,那就应该是&.9%=k ≈ 13.8G
下面是free -g显示的内容:
这里显示不是应该只有2G实际被使用的物理内存吗?
那到底mongodb的实际内存占用应该怎么看?
共有10个答案
<span class="a_vote_num" id="a_vote_num_
引用来自“如惈”的评论mongodb没有自己的管理命令么? - - 不了解~ 只用过redis memcache 有,mongostat
这问题,其实主要是问linux下的程序内存占用的查看。只是以mongodb为例了。
<span class="a_vote_num" id="a_vote_num_
mongodb没有自己的管理命令么? - - 不了解~ 只用过redis memcache
<span class="a_vote_num" id="a_vote_num_
RSS(resident set size)也就是每个进程用了具体的多少页的内存。由于Linux系统采用的是虚拟内存,进程的代码、库、堆和栈使用的内存都会消耗内存,但是申请出来的内存,只要没真正touch过,是不算的,因为没有真正为之分配物理页面。 我们实际进程使用的物理页面应该用resident set size来算的,遍历所有的进程,就可以知道所有的所有的进程使用的内存。
而buffers/cache是可以释放的:
sync && echo 3 & /proc/sys/vm/drop_caches 你可以尝试释放掉buffers/cache,你会发现RSS值并不会减少,由此可见,RSS并不包含buffers/cache内容.
eechen@ubuntu:~$ free -m && ps axu | awk -F & & '{ sum += $6 } END { printf &程序RSS总内存占用: %d MB\n&, sum/1024 }'
-/+ buffers/cache:
程序RSS总内存占用: 1097 MB RSS(resident set size)还包括程序使用的各种库和so等共享的模块,多出的317MB(1097MB-780MB)是共享库重复计算的部分.但是由于每个进程共享的东西都不一样,我们也没法知道每个进程是如何共享的,没法做到准确的区分.
--- 共有 1 条评论 ---
还是不是特别理解,得慢慢琢磨。
毕竟一些基础知识都不知道的。
(3年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
引用来自“eechen”的评论
引用来自“eechen”的评论
RES表示进程占用的物理内存值,你上面显示的是13GB。
free -g 可见系统实际使用的内存为22GB,包括磁盘缓存buffers/cache占用的20GB。
磁盘缓存buffers/cache是为了减少CPU透过I/O读取磁盘的次数,提升磁盘I/O的效率,用一块内存来储存存取较频繁的磁盘内容;因为内存的存取是电子动作,而磁盘的存取是I/O动作,感觉上磁盘I/O变得较为快速(比如程序热启动)。相同的技巧可用在写入动作,我们先将欲写入的内容放入内存中,等到系统有其它空闲的时间,再将这块内存的资料写入磁盘中。
引用来自“怪才”的评论
实际上来说,程序占用的真正内存就是:- buffers/cache 的数值。 所以看系统,真正已经用的内存数:used-(buffers+cached)的值。
那这里说的又是怎么个意思?怎么感觉结果“有冲突”
引用来自“eechen”的评论
不矛盾。程序占用的内存的确是used-(buffers+cached),而磁盘缓存buffers+cached由Linux自己维护,但却是真实占用物理内存的。
引用来自“怪才”的评论
也就是说RES里显示的mongodb占用了13G的内存,实际上是包含了buffers+cached的数据。
而系统所有程序总共实际使用的内存只有2G。
那什么情况下,swap就会开始被用到?是当used&=total的情况就马上使用呢?由linux的一定机制进行判断。我大概记得如果程序需要内存的时候,buffers和cached会清理掉一些内容,然后让出部分空间的。
RES值是程序占用的物理内存值,不包括磁盘缓存buffers/cached。
什么时候使用swap也是由Linux系统进行控制的,比如在物理内存即将耗尽时Linux会把内存中不常用的数据交换到swap空间,避免在内存耗尽时出现频繁的磁盘I/O,总之swap空间能够改善Linux内存管理,是很有必要的。
那为什么mongodb用了13G内存,而系统总共程序使用内存只有2G,其他不都是buffers+cached的吗?
就这点不理解了。
<span class="a_vote_num" id="a_vote_num_
引用来自“eechen”的评论
RES表示进程占用的物理内存值,你上面显示的是13GB。
free -g 可见系统实际使用的内存为22GB,包括磁盘缓存buffers/cache占用的20GB。
磁盘缓存buffers/cache是为了减少CPU透过I/O读取磁盘的次数,提升磁盘I/O的效率,用一块内存来储存存取较频繁的磁盘内容;因为内存的存取是电子动作,而磁盘的存取是I/O动作,感觉上磁盘I/O变得较为快速(比如程序热启动)。相同的技巧可用在写入动作,我们先将欲写入的内容放入内存中,等到系统有其它空闲的时间,再将这块内存的资料写入磁盘中。
引用来自“怪才”的评论
实际上来说,程序占用的真正内存就是:- buffers/cache 的数值。 所以看系统,真正已经用的内存数:used-(buffers+cached)的值。
那这里说的又是怎么个意思?怎么感觉结果“有冲突”
引用来自“eechen”的评论
不矛盾。程序占用的内存的确是used-(buffers+cached),而磁盘缓存buffers+cached由Linux自己维护,但却是真实占用物理内存的。
引用来自“怪才”的评论
也就是说RES里显示的mongodb占用了13G的内存,实际上是包含了buffers+cached的数据。
而系统所有程序总共实际使用的内存只有2G。
那什么情况下,swap就会开始被用到?是当used&=total的情况就马上使用呢?由linux的一定机制进行判断。我大概记得如果程序需要内存的时候,buffers和cached会清理掉一些内容,然后让出部分空间的。
RES值是程序占用的物理内存值,不包括磁盘缓存buffers/cached。
什么时候使用swap也是由Linux系统进行控制的(不一定在内存耗尽时),比如在物理内存即将耗尽时Linux会把内存中不常用的数据交换到swap空间,避免在内存耗尽时出现频繁的磁盘I/O,总之swap空间能够改善Linux内存管理,是很有必要的。
<span class="a_vote_num" id="a_vote_num_
引用来自“eechen”的评论 RES表示进程占用的物理内存值,你上面显示的是13GB。
free -g 可见系统实际使用的内存为22GB,包括磁盘缓存buffers/cache占用的20GB。
磁盘缓存buffers/cache是为了减少CPU透过I/O读取磁盘的次数,提升磁盘I/O的效率,用一块内存来储存存取较频繁的磁盘内容;因为内存的存取是电子动作,而磁盘的存取是I/O动作,感觉上磁盘I/O变得较为快速(比如程序热启动)。相同的技巧可用在写入动作,我们先将欲写入的内容放入内存中,等到系统有其它空闲的时间,再将这块内存的资料写入磁盘中。
引用来自“怪才”的评论
实际上来说,程序占用的真正内存就是:- buffers/cache 的数值。 所以看系统,真正已经用的内存数:used-(buffers+cached)的值。
那这里说的又是怎么个意思?怎么感觉结果“有冲突” 引用来自“eechen”的评论不矛盾。程序占用的内存的确是used-(buffers+cached),而磁盘缓存buffers+cached由Linux自己维护,但却是真实占用物理内存的。 也就是说RES里显示的mongodb占用了13G的内存,实际上是包含了buffers+cached的数据。
而系统所有程序总共实际使用的内存只有2G。
那什么情况下,swap就会开始被用到?是当used&=total的情况就马上使用呢?由linux的一定机制进行判断。我大概记得如果程序需要内存的时候,buffers和cached会清理掉一些内容,然后让出部分空间的。
<span class="a_vote_num" id="a_vote_num_
引用来自“eechen”的评论 RES表示进程占用的物理内存值,你上面显示的是13GB。
free -g 可见系统实际使用的内存为22GB,包括磁盘缓存buffers/cache占用的20GB。
磁盘缓存buffers/cache是为了减少CPU透过I/O读取磁盘的次数,提升磁盘I/O的效率,用一块内存来储存存取较频繁的磁盘内容;因为内存的存取是电子动作,而磁盘的存取是I/O动作,感觉上磁盘I/O变得较为快速(比如程序热启动)。相同的技巧可用在写入动作,我们先将欲写入的内容放入内存中,等到系统有其它空闲的时间,再将这块内存的资料写入磁盘中。
引用来自“怪才”的评论
实际上来说,程序占用的真正内存就是:- buffers/cache 的数值。 所以看系统,真正已经用的内存数:used-(buffers+cached)的值。
那这里说的又是怎么个意思?怎么感觉结果“有冲突” 不矛盾。程序占用的内存的确是used-(buffers+cached),而磁盘缓存buffers+cached由Linux自己维护,但却是真实占用物理内存的。
<span class="a_vote_num" id="a_vote_num_
引用来自“eechen”的评论 RES表示进程占用的物理内存值,你上面显示的是13GB。
free -g 可见系统实际使用的内存为22GB,包括磁盘缓存buffers/cache占用的20GB。
磁盘缓存buffers/cache是为了减少CPU透过I/O读取磁盘的次数,提升磁盘I/O的效率,用一块内存来储存存取较频繁的磁盘内容;因为内存的存取是电子动作,而磁盘的存取是I/O动作,感觉上磁盘I/O变得较为快速(比如程序热启动)。相同的技巧可用在写入动作,我们先将欲写入的内容放入内存中,等到系统有其它空闲的时间,再将这块内存的资料写入磁盘中。
实际上来说,程序占用的真正内存就是:- buffers/cache 的数值。 所以看系统,真正已经用的内存数:used-(buffers+cached)的值。
那这里说的又是怎么个意思?怎么感觉结果“有冲突”
<span class="a_vote_num" id="a_vote_num_
13G,shr是共享资源的内存大小
<span class="a_vote_num" id="a_vote_num_
RES表示进程占用的物理内存值,你上面显示的是13GB。
free -g 可见系统实际使用的内存为22GB,包括磁盘缓存buffers/cache占用的20GB。
磁盘缓存buffers/cache是为了减少CPU透过I/O读取磁盘的次数,提升磁盘I/O的效率,用一块内存来储存存取较频繁的磁盘内容;因为内存的存取是电子动作,而磁盘的存取是I/O动作,感觉上磁盘I/O变得较为快速(比如程序热启动)。相同的技巧可用在写入动作,我们先将欲写入的内容放入内存中,等到系统有其它空闲的时间,再将这块内存的资料写入磁盘中。
更多开发者职位上
有什么技术问题吗?
怪才的其它问题
类似的话题

我要回帖

更多关于 linux 内存占用排序 的文章

 

随机推荐