如何限制Linux内存的使用

如何限制Linux内存的使用,第1张

swap是一块磁盘空间或者一个本地文件/proc/sys/vm/swappiness 可以设置服务器使用 swap 的积极程度。取值范围为0-100,值越大,越积极使用swap,更倾向于回收匿名页值越小,越消极使用swap,更倾向于回收文件页。 即使swap设置为0,当剩余内存+文件页小于页高阈值( pages_high )的时候,也会发生swap Linux有专门的内核线程 kswapd0 定期回收内存,为了衡量内存的使用情况, kswapd0 定义了三个内存阈值:页最小阈值 pages_min 、页低阈值 pages_low 和页高阈值 pages_high ,剩余内存使用 pages_free 表示。kswapd0 定期扫描内存的使用情况,并根据剩余内存和这三个阈值的关系进行内存回收 *** 作。pages_free <pages_min :进程可用内存耗尽,只有内核才可以分配内存pages_min <pages_free <pages_low :内存压力较大, kswapd0 会执行内存回收,直到剩余内存大于高阈值为止pages_low <pages_free <pages_high :内存有一定压力,但还可以满足新内存请求pages_free >pages_high :剩余内存较多,没有内存压力。 这些阈值可以通过内核选项来 proc/sys/vm/min_free_kbytes 间接设置。 min_free_kbytes 设置了页最小阈值( pages_min )。 pages_low=pages_min*5/4 , pages_high=pages_min*3/2 /etc/security/limits.conf通过这个配置文件可以对每个登录的会话进行限制,这种限制不是全局的,也不是永久的,只在会话期间起作用。 通常,对单个用户的限制优先级高于对用户组的限制 可以使用以下方式限制内存使用 语法<domain><type><item><value> 详见 limits.conf(5) - Linux man page /proc/sys/vm/overcommit_memory 控制内核使用虚拟内存的模式,可以设置为以下值

linux实现了 请求页面调度 (在需要时将页面从硬盘交换进来,当不再需要时再交换出去),这使得系统中进程的虚拟地址空间与实际的物理内存大小没有直接的关系。

交换对进程来说是透明的,应用程序一般都不需要关心内核页面调度的行为。然而在下面 两种 情况下,应用程序可能希望影响系统的页面调度:

POSIX1003.1b-1993定义两个接口将一个或多个页面“锁定”在物理内存,来保证它们不会被交换到磁盘。

调用mlock( )将锁定addr开始长度为len个字节的虚拟内存。成功时函数返回0,失败返回-1,并适当设置errno。

mlockall( )函数锁定一个进程现有的地址空间在物理内存中的所有页面。

flags参数,是下面两个值的 按位或 *** 作,用以控制函数行为:(大部分应用程序会同时设定这两个值)

POSIX标准提供了两个接口用来将页从内存中解锁,允许内核根据需要将页换出至硬盘中。

内存锁定并不会重叠,所以不管mlock( )或mlockall( )了几次,仅一个munlock( )或munlockall( )会解除一个页面的锁定。

linux对于一个进程能锁定的页面数进行了限制:拥有 CAP_IPC_LOCK 权限的进程能锁定 任意多 的页面。没有这个权限的进程只能锁定 RLIMIT_MEMLOCK 个字节,默认情况下,该限制是 32KB

mincore( )函数,用来确定一个给定范围的内存是在物理内存中还是被交换到了硬盘中:

函数通过vec来返回向量,这个向量描述start(必须页面对齐)开始长为length(不需要对齐)字节的内存中的页面的情况。

Linux使用 投机性分配策略 :当一个进程向内核请求额外的内存-如扩大它的数据段,或者创建一个新的存储器映射-内核作出了分配承诺但 实际上并没有分给进程任何的物理存储

这样处理有如下几个 优点

超量使用的好处:和在应用请求页面就分配物理存储相比, 在使用时刻才分配物理存储的过量使用机制允许系统运行更多,更大的应用程序

但是,如果系统中的进程为满足超量使用而申请的内存大于物理内存和交换空间之和,内核只能杀死另一个进程并释放它的内存,以此来满足下一次的分配需求。

内核允许通过文件/proc/sys/vm/overcommit_memory关闭超量使用,和此功能相似的还有sysctl的vm.overcommit_memory参数。

在严格审计模式中,承诺的内存大小被严格限制在交换空间的大小加上 可调比例 的物理内存大小。

使用严格审计策略时要非常小心!许多系统设计者认为严格审计策略才是解决之道,然而, 应用程序常常进行一些不必要的、且只有使用超量使用才能满足的分配请求,而允许这种行为也是设计虚拟内存的主要动机之一。

Linux共享内存可以不用加锁,不过需要一种机制来标记共享内存的读写状态;也就是说要让两个进程知道:1)负责写入的进程,必须知道当前共享内存是否可以写入,上一次的写入内容是否有被负责读取的进程读走;2)负责读取的进程,必须知道当前共享内存是否需要读取,防止重复读取。一般的这种标记机制是通过以下方式来简单实现:1)通过读写锁来控制;2)共享内存上设置一个地方,专门存放当前共享内存的读写状态;


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7390336.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-05
下一篇 2023-04-05

发表评论

登录后才能评论

评论列表(0条)

保存