128m内存的linux 服务器内存哪个linux运行最流畅稳定

Linux服务器内存讲解,与手动释放
在Linux服务器上手工释放内存
总有很多朋友对于Linux的内存管理有疑问,之前一篇linux下的内存管理方式似乎也没能清除大家的疑虑。而在新版核心中,似乎对这个问题提供了新的解决方法,特转出来给大家参考一下。最后,还附上我对这方法的意见,欢迎各位一同讨论。
当在Linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching。这个问题,貌似有不少人在问,不过都没有看到有什么很好解决的办法。那么我来谈谈这个问题。
一、通常情况
先来说说free命令:
[root@server ~]# free -m
total used free shared buffers cached
Mem: 249 163 86 0 10 94
-/+ buffers/cache: 58 191
Swap: 511 0 511
total 内存总数
used 已经使用的内存数
free 空闲的内存数
shared 多个进程共享的内存总额
buffers Buffer Cache和cached Page Cache 磁盘缓存的大小
-buffers/cache (已用)的内存数:used - buffers - cached&
+buffers/cache(可用)的内存数:free
+ buffers + cached
可用的memory=free
memory+buffers+cached 如上面的列子为 86+10+94=192
(已用的memory=used memory - buffers - cached&&163-10-94=59约等于 58&)
有了这个基础后,可以得知,我现在used为163MB,free为86MB,buffer和cached分别为10MB,94MB。
那么我们来看看,如果我执行复制文件,内存会发生什么变化.
[root@server ~]# cp -r /etc ~/test/
[root@server ~]# free -m
total used free shared buffers cached
Mem: 249 244 4 0 8 174
-/+ buffers/cache: 62 187
Swap: 511 0 511
在我命令执行结束后,used为244MB,free为4MB,buffers为8MB,cached为174MB,天呐,都被cached吃掉了。别紧张,这是为了提高文件读取效率的做法。
为了提高磁盘存取效率,Linux做了一些精心的设计,除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换),还采取了两种主要
Cache方式:Buffer Cache和Page
Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了
I/O系统调用(比如read,write,getdents)的时间。
那么有人说过段时间,linux会自动释放掉所用的内存。等待一段时间后,我们使用free再来试试,看看是否有释放?
[root@server test]# free -m
total used free shared buffers cached
Mem: 249 244 5 0 8 174
-/+ buffers/cache: 61 188
Swap: 511 0 511
似乎没有任何变化。(实际情况下,内存的管理还与Swap有关)
那么我能否手动释放掉这些内存呢?回答是可以的!
二、手动释放缓存
/proc是一个虚拟文件系统,我们可以通过对它的读写操作做为与kernel实体间进行通信的一种手段。也就是说可以通过修改/proc中的文件,来对
当前kernel的行为做出调整。那么我们可以通过调整/proc/sys/vm/drop_caches来释放内存。操作如下:
[root@server test]# cat /proc/sys/vm/drop_caches
首先,/proc/sys/vm/drop_caches的值,默认为0。
[root@server test]# sync
手动执行sync命令(描述:sync 命令运行
sync 子例程。如果必须停止系统,则运行sync 命令以确保文件系统的完整性。sync
命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件)
[root@server test]# echo 3 &
/proc/sys/vm/drop_caches
[root@server test]# cat /proc/sys/vm/drop_caches
将/proc/sys/vm/drop_caches值设为3
[root@server test]# free -m
total used free shared buffers cached
Mem: 249 66 182 0 0 11
-/+ buffers/cache: 55 194
Swap: 511 0 511
再来运行free命令,会发现现在的used为66MB,free为182MB,buffers为0MB,cached为11MB。那么有效的释放了buffer和cache。
◎ 有关/proc/sys/vm/drop_caches的用法在下面进行了说明
/proc/sys/vm/drop_caches&(since Linux
Writing to this file causes the kernel to drop clean
dentries and inodes from memory, causing that memory to
To free pagecache, use echo 1 & /proc/sys/vm/drop_
free dentries and inodes, use echo 2 &
/proc/sys/vm/drop_
to free pagecache, dentries and inodes, use echo 3 &
/proc/sys/vm/drop_caches.
Because this is a non-destructive operation and dirty
are not freeable, the user should run sync first.
三、我的意见
上述文章就长期以来很多用户对Linux内存管理方面的疑问,给出了一个比较“直观”的回复,我更觉得有点像是核心开发小组的妥协。
对于是否需要使用这个值,或向用户提及这个值,我是有保留意见的:
1、从man可以看到,这值从2.6.16以后的核心版本才提供,也就是老版的操作系统,如红旗DC 5.0、RHEL
4.x之前的版本都没有;
2、若对于系统内存是否够用的观察,我还是原意去看swap的使用率和si/so两个值的大小;
用户常见的疑问是,为什么free这么小,是否关闭应用后内存没有释放?
但实际上,我们都知道这是因为Linux对内存的管理与Windows不同,free小并不是说内存不够用了,应该看的是free的第二行最后一个值:
-/+ buffers/cache: 58&191
这才是系统可用的内存大小。
实际项目中告诉我们,如果因为是应用有像内存泄露、溢出的问题,从swap的使用情况是可以比较快速可以判断的,但free上面反而比较难查看。
相反,如果在这个时候,我们告诉用户,修改系统的一个值,“可以”释放内存,free就大了。用户会怎么想?不会觉得操作系统“有问题”吗?
所以说,我觉得既然核心是可以快速清空buffer或cache,也不难做到(这从上面的操作中可以明显看到),但核心并没有这样做(默认值是0),我们就不应该随便去改变它。
一般情况下,应用在系统上稳定运行了,free值也会保持在一个稳定值的,虽然看上去可能比较小。
当发生内存不足、应用获取不到可用内存、OOM错误等问题时,还是更应该去分析应用方面的原因,如用户量太大导致内存不足、发生应用内存溢出等情况,否则,清空buffer,强制腾出free的大小,可能只是把问题给暂时屏蔽了。
我觉得,排除内存不足的情况外,除非是在软件开发阶段,需要临时清掉buffer,以判断应用的内存使用情况;或应用已经不再提供支持,即使应用对内存的
时候确实有问题,而且无法避免的情况下,才考虑定时清空buffer。(可惜,这样的应用通常都是运行在老的操作系统版本上,上面的操作也解决不了)。而
生产环境下的服务器可以不考虑手工释放内存,这样会带来更多的问题。记住内存是拿来用的,不是拿来看的。不像windows,
无论你的真实物理内存有多少,他都要拿硬盘交换文件来读。这也就是windows为什么常常提示虚拟空间不足的原因,你们想想多无聊,在内存还有大部分的
时候,拿出一部分硬盘空间来充当内存。硬盘怎么会快过内存,所以我们看linux,只要不用swap的交换空间,就不用担心自己的内存太少。如果常常swap用很多,可能你就要考虑加物理内存了,这也是linux看内存是否够用的标准哦。当然这仅代表我个人意见,也欢迎大家来交流讨论
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。Linux高端内存管理之非连续内存区(描述)_Linux教程_Linux公社-Linux系统门户网站
你好,游客
Linux高端内存管理之非连续内存区(描述)
来源:Linux社区&
作者:bullbat
总结了高端内存区的固定内核映射区、临时内核映射与永久内核映射。但是对于高端内存中各个区间的布置我们任然不是很清楚,首先我们从整体上看看内核对高端内存的划分情况。
如果内存足够大(比如用户:内核线性空间,内核就只能访问线性空间的第内容,如果物理内存超过则视为足够大),内核线性空间无法同时映射所有内存。这就需要将内核线性空间分出一段不直接映射物理内存,而是作为窗口分时映射使用到的未映射的内存。
相关阅读:
一、非连续内存区布局
Linux内核中对于非连续区间的开始:
#define&VMALLOC_START&&&((unsigned&long)high_memory&+&VMALLOC_OFFSET)&&
#define&VMALLOC_OFFSET&&(8&*&1024&*&1024)&&
对于变量high_memory变量:
void&__init&initmem_init(unsigned&long&start_pfn,&&
&&&&&&&&&&&&&&&&&&unsigned&long&end_pfn)&&
&&&&highstart_pfn&=&highend_pfn&=&max_&&
&&&&if&(max_pfn&&&max_low_pfn)&&
&&&&&&&&highstart_pfn&=&max_low_&&
&&&&num_physpages&=&highend_&&
&&&&high_memory&=&(void&*)&__va(highstart_pfn&*&PAGE_SIZE&-&1)&+&1;&&
其中,变量在函数中初始化为下面值
#define&MAXMEM&&(VMALLOC_END&-&PAGE_OFFSET&-&__VMALLOC_RESERVE)&&
&p&unsigned&int&__VMALLOC_RESERVE&=&128&&&&20;&/p&&&
对于非连续区间的结束定义:
#&define&VMALLOC_END&&&&(PKMAP_BASE&-&2&*&PAGE_SIZE)&&
由上面的内核代码,画出内存布局细节图如下
由上面的布局可知,然而直接映射区和连续内存之间空出来了的空间不能用,非连续空间和永久内核映射区之间也有的空间不可用,另外,内存顶端空出了不可用的。这样,高端内存能用的空间为大小的内存。
二、数据结构描述
虚拟内存区描述(对于链表)
struct&vm_struct&{&&
&&&&struct&vm_struct&&&&*&&
&&&&void&&&&&&&&&&&&*&&
&&&&unsigned&long&&&&&&&&&
&&&&unsigned&long&&&&&&&&&
&&&&struct&page&&&&&**&&
&&&&unsigned&int&&&&&&&&nr_&&
&&&&unsigned&long&&&&&&&phys_&&
&&&&void&&&&&&&&&&&&*&&
虚拟内存区描述(对于红黑树)
struct&vmap_area&{&&
&&&&unsigned&long&va_&&
&&&&unsigned&long&va_&&
&&&&unsigned&long&&&
&&&&struct&rb_node&rb_&&&&&/*&address&sorted&rbtree&*/&&
&&&&struct&list_head&&&&&&&/*&address&sorted&list&*/&&
&&&&struct&list_head&purge_&&&&/*&"lazy&purge"&list&*/&&
&&&&void&*&&
&&&&struct&rcu_head&rcu_&&
内存区由字段链接到一起,并且为了查找简单,他们以地址为次序。为了防止溢出,每个区域至少由一个页面隔离开。
三、非连续内存区初始化
非连续内存区的初始化工作在start_kernel()-&mm_init()-&vmalloc_init()完成
void&__init&vmalloc_init(void)&&
&&&&struct&vmap_area&*&&
&&&&struct&vm_struct&*&&
&&&&int&i;&&
&&&&for_each_possible_cpu(i)&{&&
&&&&&&&&struct&vmap_block_queue&*&&
&&&&&&&&vbq&=&&per_cpu(vmap_block_queue,&i);&&
&&&&&&&&spin_lock_init(&vbq-&lock);&&
&&&&&&&&INIT_LIST_HEAD(&vbq-&free);&&
&&&&&&&&INIT_LIST_HEAD(&vbq-&dirty);&&
&&&&&&&&vbq-&nr_dirty&=&0;&&
&&&&for&(tmp&=&&&tmp&=&tmp-&next)&{&&
&&&&&&&&va&=&kzalloc(sizeof(struct&vmap_area),&GFP_NOWAIT);&&
&&&&&&&&va-&flags&=&tmp-&flags&|&VM_VM_AREA;&&
&&&&&&&&va-&va_start&=&(unsigned&long)tmp-&&&
&&&&&&&&va-&va_end&=&va-&va_start&+&tmp-&&&
&&&&&&&&__insert_vmap_area(va);&&
&&&&vmap_area_pcpu_hole&=&VMALLOC_END;&&
&&&&vmap_initialized&=&true;&&
相关资讯 & & &
& (08月09日)
& (08月01日)
& (07月31日)
& (08月09日)
& (07月31日)
& (07月31日)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款查看:9509|回复:1
服务器内存也是内存,它与我们平常在电脑城所见的普通PC机内存在外观和结构上没有什么明显实质性的区别,它主要是在内存上引入了一些新的技术,普通PC机上的内存在服务器上一般是不可用的服务器认不到的,这就是说服务器内存不能随便为了贪便宜用普通PC机的内存来替代的原因了。有些人把具有某种技术的内存就称之为“服务器内存”,其实是不全面的,服务器的这些内存技术之所以在目前看来是服务器在专用,但不能保证永远只能是服务器专用。这些新技术之所以先在服务器上得以应用是因为服务器价格较贵,有条件得以应用,这些新技术由于价格的原因暂时在普通PC机上无法实现应用,但是会随着配件价格的下降逐步走向普通PC机,就行原来的奇偶校正内存一样原先也是最先应用在服务器上,现在不是很普遍了吗?所以服务器内存并不是一种特指,它是内存新技术在不同时间段上的应用。
& && &Buffer即缓存器,也可理解成高速缓存,在服务器及图形工作站内存有较多应用,容量多为64K,但随着内存容量的不断增大,其容量也不断增加,具有Buffer的内存将对内存的读写速度有较大提高,象早起168芯EDOECC服务器内存大多都带Buffer,Unbuffer表示不具有高速缓存。有Buffer的内存几乎都带有ECC功能,Unbuffer内存只有少数带 ECC功能。其在内存编号上也有较明显特征,以维京内存PC133 128M为例,其编号为ME16641U4SS-CL3,其中的字母U就代表Unbuffer。
&&Register即寄存器或目录寄存器,在内存上的作用我们右以把它理解成书的目录,有了它,当内存接到读写指令时,会先检索此目录,然后再进行读写操作,这将大大提高服务器内存工作效率。带有Register的内存一定带Buffer,并且目前能见到的Register内存也都具有ECC 功能,其主要应用在中高端服务器及图形工作站,如IBM Netfinity 5000。
&&目前是一谈到服务器内存,大家都一致强调要买ECC内存,认为ECC内存速度快,其实是一种错误地认识,ECC内存成功之处并不是因为它速度快(速度方面根本不关它事只与内存类型有关),而是因为它有特殊的纠错能力,使服务器保持稳定。ECC本身并不是一种内存型号,也不是一种内存专用技术,它是一种广泛应用于各种领域的计算机指令中,是一种指令纠错技术。它的英文全称是“Error Checking and Correcting”,对应的中文名称就叫做“错误检查和纠正”,从这个名称我们就可以看出它的主要功能就是“发现并纠正错误”,它比奇偶校正技术更先进的方面主要在于它不仅能发现错误,而且能纠正这些错误,这些错误纠正之后计算机才能正确执行下面的任务,确保服务器的正常运行。之所以说它并不是一种内存型号,那是因为并不是一种影响内存结构和存储速度的技术,它可以应用到不同的内存类型之中,就象我们在前面讲到的“奇偶校正”内存,它也不是一种内存,最开始应用这种技术的是EDO内存,现在的SD也有应用,而ECC内存主要是从SD内存开始得到广泛应用,而新的DDR、RDRAM也有相应的应用,目前主流的ECC内存其实是一种SD内存。
& &&&由于服务器内存在各种技术上相对兼容机来说要严格得多,它强调的不公是内存的速度,而是它的内在纠错能力和稳定性。所以在外频上目前来说只能是紧跟兼容机或普通台式内存之后。目前台式机的外频一般来说已到了150MHz以上得时代,但是133外频仍是主流。而服务器由于受到整个配件外频和高稳定性的要求制约,主流外频还100MHz,但133MHz外频已逐步在各档次服务器中推选,在先购服务器时当然最好选择133外频的了!内存、其它配件也一样,要尽量同步进行,否则就会影响个服务器的性能。
& & 由于服务器内存在技术难度和加工工艺上比普通PC机上的内存有较大提高,在服务内存品牌选择上没有象普通PC机内存一样那么杂,但目前服务器内存品牌也有逐步杂化的趋势,目前主要的服务器内存品牌主要有kingston、三星、IBM、NEC等,但主要以前面几种在市面上较为常见,而且质量也能得到较好保障。
& & 服务器内存也与任何其它产品一样,新技术是在不断开发,不断得到应用,然后逐步取代原有的技术,实现它的普及应用。ECC技术在目前来说是服务器内存的主流技术,但新内存技术已在不断涌现,目前主要有IBM和Chipkll技术在被各内存生产厂商采用。在内存类型上主要已有DDR和RDAMB公司的RDRAM来取代目前的SD内存,这种DDR目前也带有ECC技术。但上述主流内存技术也都是在围绕ECC技术这同一方向。同属于ECC技术范畴。
& & 服务器内存的选择不能与普通兼容机一样随便选择,因为服务器一般要求24小时连续不间断工作,而且要求主速度较高,容量较大,目前的一般要求在PC133以上,所以在选择内存时一定要注意选择服务器专用内存,外频要在133MHZ以上,不能随便用一个PC的内存代替。内存的优化主要体现在内存访问缓冲时间的设置,在CMOS中有相应设置,一般应尽量设置为小一点的缓冲时间,这样速度会更快些。另外,服务器内存千万不要用兼容条或是贴了假原装标签的内存。一定要选择一个好的供应商,一个好的内存品牌,如Kingston。
初级工程师
资料里数据有点老,
各个品牌的低端服务器的内存是可以用在pc上用的,
稍高一点的服务器,都用的是带有ecc功能的,不行

我要回帖

更多关于 linux查看服务器内存 的文章

 

随机推荐