《Linux 虚拟内存参数配置.docx》由会员分享,可在线阅读,更多相关《Linux 虚拟内存参数配置.docx(9页珍藏版)》请在优知文库上搜索。
1、一、问题出发点Jun110:30:21auditlkernel:swapper:pageallocationfailure,order:1,mode:020Dun110:30:21auditlkernel:Pid:,comm:swapperTainted:GT2.6.32-431.20.3.el6.86-64#1JUn110:30:21auditlkernel:CallTrace:Dun110:30:21auditlkernel:(?_alloc-pages-nodemask+x74a0x8dJUn110:30:21auditlkernel:?kmem-getpages+6217Jun110:
2、30:21auditlkernel:?fallback-alloc+0lba0270JUn110:30:21auditlkernel:)?CaChe_a】IOJnode+0x99/0x160JUn110:30:21auditlkernel:?kmem-cache-alloc*llb019JUn110:30:21auditlkernel:?sk_prot_alloc+0x48/0xlc0JUn110:30:21auditlkernel:()?sk-clo11e+022x2eDun110:30:21auditlkernel:?inet-csk-clone+16xdJun110:30:21audit
3、lkernel:?tcp_create_openreq_child*0x23/0x470在监控中,发现InCSSafleS日志中出现failure报错信息,发现如上内存堆栈报错。二、虚拟内存介绍IjHa内存毋用置疑,虚拟内存绝对是操作系统中最重要的概念之一.我想主要是由于内存的电要“战略地位,CPU太快,但容做小且功能单一,其他I/O硬件支持各种花式功能,可是相时于CPU,它们又太慢.于是它们之间就需要一种润滑剂来作为缓冲,这就是内存大显身手的地方。而在现代操作系统中,多任务已是标配“多任务并行,大大提升了CPU利用率,但却引出J多个进程对内存操作的冲突向即,虚拟内存极念的提出就是为了解决这个
4、问题,上图是虚拟内存量简单也是宜观的解算.操作系统有一块物理内存(中间的部分),有两个诳程(实际会更多)Pl和P2,操作系统偷偷地分别告诉Pl和P2,我的整个内存:都是你的,的使用,管够,可事实上呢,操作系统只是给它们画了个大tft这些内存说是都给了Pl和P2,实际上只给了它们一个序号而已.只有当Pl和P2其正开始使用这些内存时,系统才开始使用辍转掘移.拼凑出名个块给进程用,P2以为自己在用A内存,实际上已经被系统悄悄理定向到我正的B去J,甚至,当Pl和P2共用了C内存,他们也不知道.操作系统的这种欺啸进程的手段,就是虚拟内存.对PI和P2等进程来说,它们都以为自己占用了整个内存,而自己使用的
5、物理内存的哪段地址,它们并不知道也无需关心。2 .分页和页表虚拟内存是操作系统里的概念,对操作系统来说,虚拟内存就是一张张的对照表,Pl获取A内存里的数据时应该去物理内存的A地址找.而找B内存里的数据应该去物理内存的C地址.我们知道系统里的墙本单位都是BYte字节,如果将每一个虚拟内存的BVte都对应到物理内存的地址.都个条目最少需要8字节(32位虚拟地址-32位物理地址),在4G内存的情况K就需要32GB的空间来存放对照表那么这张表就大得真正的物理地址也放不下了,于是操作系统引入了页(Page)的概念.在系统启动时,操作系统将整个物理内存以4K为单位,划分为各个页,之后进行内存分配时,都以页
6、为单位,那么虚拟内存页对的物理内存页的映射表就大大减小了,4G内存,只需要8M的映射表即可,一蛭进程没有使用到的虚拟内存,也并不需要保存映射关系,而且1.inUX还为大内存设H了多级页表,可以进一页减少了内存消耗。操作系统能拟内存到物理内存的映射表,就被称为页表.3 .内存寻址和分配我们知道通过虚拟内存机制,每个进程都以为自己占用全部内存,进程访问内存时,操作系统都会把进程提供的虚拟内存地址转换为物理地址,再去时应的物理地址上获取数据。CPU中有一种硬件,内存管理的元MMU(MemoryManagementUnit)专门用来将期译虚拟内存地址。CPU还为页表寻址设置了缓存策略由于程序的局部性,
7、其缓存命中率能达到98%.以上情况是页表内存在虚拟地址到物理地址的映射,而如果进程访问的物理地址还没有被分配,系统则会产生一个缺页中断,在中断处理时,系统切到内核态为进程虚拟地址分配物理地址04 .zone内存管理的机关逻辑都是以zone为球位的,这里zone的含义是指内存的分区管理,Unux将内存分成多个区,主要有点接访问区(DMA)、一般区(NormaI)和高端内存区(HighMemor).j内核时内存不同区域的访问因为硬件结构因素会有寻址和效率上的差别.如果在NUMA架构匕不同CPU所管理的内存也是不同的zone.5 .NUMANUMA中,虽然内存直接访问在CPU上,但是由于内存被平均分
8、配在了各个CPU上.只有当CPU访问自身宜接访问内存时应的物理地址时,才会有较短的响应时间(后称1.ocaIAccess)o而如果需要访问其他CPUattaeh的内存的数据时,就需要通过万联通道访问,响应时间就相比之前变慢了(后称RemOteACCess)。所以NUMA(Non-UniformMemoryAccess)就此得名.三、分析1 .fl:官方解狎(RootCause),在RHE1.6.4之前kswapd不会尝试择放连续页面,当系统中没有其他碎片整理内存时,这可能导致GFP_ATOMlC分配请求反更失败.使用RHEI.6.4和更高版本时,如果需要,kswapd将压缩(碎片整理)可用内存
9、.请注:t,分配失败仍然可能发生.例如,当出现较大的GFP_ATOMIC分配突发时,kswapd可能难以跟上.但是,这些分配最终应该会成功.2 .红M事件回复建议设武如下内核参数:1) vm.rin-free-kbytes系统默认:rootglocalhost-#cat/proc/5ys/vm/min_free_kbytes4556rootnodellogffsysctl-agrepvm.minvm.min_free_kbytes-45056建议设置为:vm.min_free_kbytes=450560即增大该值的设置.2) vm.zone_reclaim_mode系统默认为0:(rootg)
10、loca!hostsysctl-agrepvm.zone_reclaim_modevm.zone_reclaim_mode=0建议设置vm.zone_redaim_mOde=1到etcssctl.conf文件。具体如下:#Vilnetcsysctl.conf#打开该文件,追加或修改为如下设置(其他参数不变:vm.min_free_kbytes=4556vm.zonereclaimmode=1设置之后,保存退出。写入到该文件中的参数,执行SySCtl-P可即时生效,卜.次垂启将读取该文件的设置.3) VirtualIienOry相关参数介绍3.1. v三.Sirappiness控制换出运行时内存
11、的相对权用.SWaPPineSS参数值可设置范围在。到100之间.低参数值会让内核尽量少用交换,更高参数值会使内核更多的去使用交换空间.默认值为60(参考网络资料:当剩余物理内存低于40%(40=100-60)时,开始使用交换空间,对于大多数操作系统,设置为100可能会影响整体性能,而设置为更低值(甚至为0)则可能破少响应延迟。SWaPPineSS的伯的大小对如何使用swap分区是有着很大的联系的。先前,人们建议把Vmswapiness设汉为0,它意味若“除非发生内存薇处,否则不要进行内存交换“。直到IJrUlX内核35E版本发布,这个值的意义才发生了变化。这个变化被一直到其他的发行版本上,包
12、括RedHat企业版内核2632303.在发生变化之后.0意味若“在任何情况下慈不要发生交换。所以现在建议把这个值设置为KSWaPPineSS100的时候表示枳极的使用swap分区,并且把内存上的数据及时的搬运到SWaP空间里面,推券值tvm.swapplness=103.2. vs.Bin-fre-kbytes用干强制1.inuxVM保留最小数擅的千字节,VM使用该数字为系统中的每个低内存区域计算水位线WMARK_MIN)tfi.每个Iowmem区域根据其大小成比例地获得许多保留的空闲页面。雨要一些最小的内存来满足PF_MEMAIIoC分配:如果将此值设设为小于1024KB,则系统将被破坏,
13、并在高负载下易于死锁,设置得太高将立即使您的机器OOM这个参数本身决定了系统中每个zone的Watermarkmin)的位大小,然后内核根据min的大小并参考每个ZOne的内存大小分别算出每个zone的Iow水位和high水位侑,从上面的解释中主要有如卜两个点:1 .代表系统所保用空闲内存的最低限2 .用于计算影响内存回收的三个参数watermarkminlowhigh而系统空闲内存低于WatermarkUOw时,开始启动内核线程kswapd世行内存回收.直到该zone的空闲内存数量达到Watermarkhigh后停止El收.如果上层申请内存的速度太快,导致空闲内存降至Watermarkmin
14、后,内核就会遂行directreclaim(直接回收),即直接在应用程序的进程上下文中进行回收,再用回收上米的空闲页满足内存中请,因此实际会阻塞应用程序,带来一定的响应延迟,而且可能会触发系统OoM.这是因为Watermarkmin以下的内存属于系统的自用内存,用以满足特殊使用,所以不会给用户态的普通申请来用。三个Watermark的计算方法:watermarkmin-1QfreeJcbytes换算为page单位即可.故设为min_free_pages.watermarklow=watermarkmin)54watermark(high=watermark(min3/2Definesaperc
15、entagevalue.Writeoutofdirtydatabeginsinthebackground(viapdflush)whendirtydatacomprisesthispercentageoftotalmemory.ThedefaultvalueIs10.Fordatabaseworkloads,RedHatrecommendsalowervalueof3.Settingmin_free_kbytestoohighwillcausesystemhangs,eseciallyin386arch,usinglessthan5%oftotalmemorycanavoidit,sochoose%5offreememoryor2%oftotalmemory.推荐值:vm.min_free_kbytes=内存值*2%(上限5G)3.3. VB.zone_reclaiB-aodezon