百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

告别“一页障目”(障目四字成语)

cac55 2024-10-31 12:20 11 浏览 0 评论

用户进程的内存页分为两种:

  • file-backed pages(文件背景页)
  • anonymous pages(匿名页)

比如进程的代码段、映射的文件都是file-backed,而进程的堆、栈都是不与文件相对应的、就属于匿名页

file-backed pages在内存不足的时候可以直接写回对应的硬盘文件里,称为page-out,不需要用到交换区(swap);而anonymous pages在内存不足时就只能写到硬盘上的交换区(swap)里,称为swap-out。


file-backed pages(文件背景页)

对于有文件背景的页面,程序去读文件时,可以通过read也可以通过mmap去读。当你通过任何一种方式从磁盘读文件时,内核都会给你申请一个page cache,来缓存硬盘上的内容。这样的话,读过一遍的数据,本进程或其他进程下次再读的时候就直接从page cache里去拿,就很快了,提升系统的整体性能。因此用户的read/write实际上是跟page cache的相互拷贝。

而用户的mmap则会将一段虚拟地址(3G)以下映射到page cache上,这样的话,用户就可以通过读写这段虚拟地址来修改文件内容,省去了内核和用户之间的拷贝。

所以文件对于用户程序来讲其实只是内存,page cache就是磁盘中文件的一个副本。可以通过 “echo 3 > /proc/sys/vm/drop_cache” 来清cache。清掉之后,进程第一次读文件就会变慢。

通过free命令可以看到当前page cache占用内存的大小,free命令中会打印buffers和cached(有的版本free命令将二者放到一起了)。通过文件系统来访问文件(挂载文件系统,通过文件名打开文件)产生的缓存就由cached记录,而直接操作裸盘(打开/dev/sda设备去读写)产生的缓存就由buffers记录。

实际上文件系统本身再读写文件就是操作裸分区的方式,用户态也可以直接操作裸盘,像dd命令操作一个设备名也是直接访问裸分区。那么,通过文件系统读写的时候,就会既有cached又有buffers。从图中可以看到,文件名等元数据和文件系统相关,是进cached,实际的数据缓存还是在buffers。例如,read一个文件(如ext4文件系统)的时候,如果文件cache命中了,就不用走到ext4层,从vfs层就返回了。

当然,还可以在open的时候加上O_DIRECT标记,做直接IO,就连buffers都不进了,直接读写磁盘。

anonymous pages(匿名页)

没有文件背景的页面,即匿名页(anonymous page),如堆,栈,数据段等,不是以文件形式存在,因此无法和磁盘文件交换,但可以通过硬盘上划分额外的swap分区或使用swap文件进行交换。swap分区可以将不活跃的页交换到硬盘中,缓解内存紧张。swap分区可以当做针对匿名页伪造的文件背景。


页面回收(reclaim)

  • 文件背景的数据实际上就是page cache,但page cache不能无限增加,不能说慢慢的所有文件都缓存到内存了。肯定要有一个机制,让不常用的文件数据从page cache刷出去。内核中有一个水位控制的机制,在系统内存不够用的时候,会触发页面回收。
  • 对于没有文件背景的页面即匿名页,比如堆、栈、数据段,如果没有swap分区,不能与磁盘交换,就要常驻内存了。但是常驻内存的话,就会吃内存,可以通过给硬盘搞一个swap分区或硬盘中创建一个swap文件让匿名页也能交换到磁盘上。可认为是为匿名页伪造的文件背景。swap分区或swap文件实际上最终是到达了增大内存的效果。当然,如果频繁交换的话,被交换出去的数据的访问就会慢一些,因为要有IO操作了。

1. 水位(watermark)控制:

内核中有三个水位:

  • min:如果剩余内存减少到触及这个水位,可认为内存严重不足,当前进程就会被堵住,kernel会直接在这个进程的进程上下文里面做内存回收(direct reclaim)。
  • low:当剩余内存慢慢减少,触到这个水位时,就会触发kswapd线程的内存回收。
  • high: 进行内存回收时,内存慢慢增加,触到这个水位时,就停止回收。

由于每个ZONE是分别管理各自内存的,因此每个ZONE都有这三个水位

2. swapness:

回收的时候,是回收有文件背景的页还是匿名页还是都会回收呢,可通过/proc/sys/vm/swapness来控制让谁回收多一点点。swappiness越大,越倾向于回收匿名页;swappiness越小,越倾向于回收file-backed的页面。当然,它们的回收方法都是一样的LRU算法,即最近最少使用的页会被回收。

3. 如何计算水位:

/proc/sys/vm/min_free_kbytes 是一个用户可配置的值,默认值是min_free_kbytes = 4 * sqrt(lowmem_kbytes)。然后根据min算出来low和high水位的值:low=5/4*min,high=6/4*min。


脏页的写回

sync是用来回写脏页的,脏页不能在内存中呆的太久,因为如果突然断电没有写到硬盘的话脏数据就丢了,另一方面如果攒了很多一起写回也会明显占用CPU时间。

那么脏页时候写回呢?脏页回写的时机由时间空间两方面共同控制:

时间:

  • dirty_expire_centisecs: 脏页的到期时间,或理解为老化时间,单位是1/100s,内核中的flusher thread会检查驻留内存的时间超过dirty_expire_centisecs的脏页,超过的就回写。
  • dirty_writeback_centisecs:内核的flusher thread周期性被唤醒(wakeup_flusher_threads())的时间间隔,每次被唤醒都会去检查是否有脏页老化了。如果将这个值置为0,则flusher线程就完全不会被唤醒了。

空间:

  • dirty_ratio: 一个写磁盘的进程所产生的脏页到达这个比例时,这个进程自己就会去回写脏页。
  • dirty_background_ratio: 如果脏页的数量超过这个比例时,flusher线程就会启动脏页回写。

所以:

  1. 即使只有一个脏页,那如果它超时了,也会被写回。防止脏页在内存驻留太久。dirty_expire_centisecs这个值默认是3000,即30s,可以将其设置得短一些,这样掉电后丢失的数据会更少,但磁盘写操作也更密集。
  2. 不能有太多的脏页,否则会给磁盘IO造成很大压力,例如在内存不够做内存回收时,还要先回写脏页,也会明显耗时。

需要注意的是,在达到dirty_background_ratio后,flusher线程(名为“[flush-devname]”)开始回写,但由于写磁盘速度慢,如果此时应用进程还在不停地写磁盘,flusher线程回写没那么快,那么就会导致进程的脏页达到dirty_ratio,这时这个进程就会去回写脏页而导致write被堵住。也就是说dirty_background_ratio通常是比dirty_ratio小的。

脏页都是指有文件背景的页面,匿名页不会存在脏页。从/proc/meminfo的’Dirty’一行可以看到当前系统的脏页有多少,用sync命令可以刷掉。


zRAM机制

不用swap分区,也可以用zRAM机制来缓解内存紧张:从内存里拿出一段内存空间(compressed block),作为交换空间模拟硬盘的交换分区,用来交换匿名页,并且让kernel看到的物理内存大小不包括这段内存。而这段交换空间自带透明压缩功能,即交换到这块zRAM分区时,Linux会自动将这块匿名页压缩存放。系统访问这块页面的内容时,产生page fault后从交换分区去拿,这时Linux给你透明解压再交换出来。

使用zRAM的好处,就是访存比访问硬盘或flash的速度提高很多,且不用考虑寿命问题,并且由于这段内存是压缩后存储的,因此可以存更多的数据,虽然占用了一段内存,但实际可以存更多的数据,也达到了增加内存的效果。缺点就是压缩要占用CPU时间。


Android里面普遍使用了zRAM技术,由于zRAM牺牲了CPU时间,所以交换次数还是越少越好。像Android和windows,内存越大越好,因为发生交换的几率就小。这样两个进程相互切换(如微博和微信)时就会变得流畅,因为内存足够的话,后台进程无需被换进swap分区或被OOM杀掉。当然如果你只打打电话,就没必要大内存啦。

相关推荐

赶紧查下支付宝登陆授权,有人被盗刷了!你的还安全吗?

神马,支付宝被盗刷了?曾经在其他手机上用过支付宝?赶紧查下你的支付宝登陆授权!有网友说自己的支付宝被盗刷了,可能是他的支付宝在其他设备上登陆过。该怎么办?打开支付宝,点击“我的”,点击“设置”,点击“...

用支付宝的都要看!原来这个账号这么重要!

现在支付宝已经完全融入大家的生活付钱、种树、偷能量、集五福上到退休老人,下到小学生大家都能操作的666但这些只能算是基本操作还有人用支付宝赚起了零花钱??近日,还在上中学的小龙收到一条QQ消息,对方是...

客服回应“WP8.1版支付宝需升级登录”:请换系统

前瞻科技快讯10月20日消息,对于WindowsPhone用户反馈的,WP8.1版支付宝钱包在登录时会收到”“抱歉,此版本将不再支持,建议你升级到最新版本,或使用支付宝网站进行操作。”提示一事,网友...

支付宝移动平台三大类之一《服务窗》怎么开通,大家是这样开通的

支付宝移动平台分三大类:《一》服务窗平台《二》二维码平台《三》卡劵平台《一》服务窗平台(一)服务窗查找步骤:马云旗下的支付宝潜藏着另类“公众号”----服务窗,查找步骤:打开支付宝...

支付宝:不要想得美!支付宝一段时间未登录将被销号!

近日,淘宝、支付宝对服务协议进行了更新:连续12个月未登录支付宝,且没有任何资产的支付宝用户将被注销。如需再次使用,重新申请注册即可。但@支付宝同时提醒:在花呗借呗有欠款的朋友无论多久没操作都不会被...

支付宝上线人脸登录(支付宝上线人脸登录怎么设置)

本报讯(记者胡晓晶)需要靠脸才能过安检,正在乌镇举行的第二届世界互联网大会,让“人脸识别”再次成为热门话题。不过,如今这项技术不仅能给大佬用,也能用于普通人了。昨天起,这种用“刷脸”取代账号密码来登录...

WP8.1版支付宝不能登录使用新进展:操作环境已保护

昨天,我们报道了部分用户的WP8.1版支付宝钱包不能正常登录的问题,并且提示“抱歉,此版本将不再支持”,而今天用户发现有了新的提示“我们对你当前的操作环境加强了保护,请联系95188转人工受理”,结果...

熟人能改你的支付宝登录密码?支付宝称仅可在自己手机上修改

通过识别好友和买过的商品就可以找回自己的甚至获取别人的支付宝登录密码?近日,有网友称支付宝存在安全漏洞,熟人可以用一方的用户名输入其账户后,不输入密码而选择找回密码的方式,在认证环节中输入熟人的相关信...

支付宝小程序常用 API 开发指南:从登录到支付的全流程解析

作为一名在小程序开发领域摸爬滚打多年的前端老程序员,我深知不同平台的小程序API各有特点。今天咱们就聚焦支付宝小程序,聊聊那些从登录授权到支付交易的核心API使用技巧,顺便也会分享一个能让你的...

快报:支付宝出现大面积无法正常登陆现象

IT之家讯5月27日下午消息,就在刚刚,有大量用户反馈支付宝钱包客户端和网页版均出现无法正常登陆的情况。用户反映,自己在登陆支付宝的时候提示网络繁忙,无法登陆,有些用户登陆上去却又提示需要重新登陆,...

支付宝部分地区出现故障,用户无法登录和支付

三言财经12月5日消息,今日有部分网友反映支付宝出现故障,无法登陆。表现为会从已登录状态突然跳回原登录界面,或者验证码登录时收验证码速度特别慢,淘宝快捷登录失效。也有用户反映购物时出现无法支付和转账...

支付宝正式上线“刷脸”登录功能(支付宝登录为什么要刷脸才能登进去)

IT之家讯12月17日消息,近日支付宝正式上线了人脸登录功能,只需要在手机前面“刷脸”就能取代密码进行登录操作,目前仅限iOS和部分安卓机型。据悉,要想开启刷脸登录功能,需在支付宝客户端中依次选择“...

企业版支付宝如何充值、转账、在线支付和扫码支付

首先要开通企业版支付宝,开通方法暂不介绍。企业版支付宝和个人支付宝差别并不大,不过企业版支付宝可以理解成一个银行对公账号,就是说资金进出都要记账。企业版支付宝由于不能直接像个人支付宝那样绑定银行卡后就...

支付宝这个新功能,我等了十年(支付宝推出几年了)

经过年前年后的几波小更新,微信这个国民级App又进入了短暂的休眠状态。目前小雷已经停留在8.0.20版本许久,越用越觉得索然无味,这并非微信的问题。而是作为一位精神00后,秃头雷一直热爱尝鲜。只要手机...

免登录!城乡居民医保支付宝缴费指南来了→

原标题:免登录!城乡居民医保支付宝缴费指南来了→来源:重庆税务...

取消回复欢迎 发表评论: