• Linux交换空间和内存不足


    交换空间

    交换技术就是将一页内存复制到预先设定的硬盘上的交换空间,来释放该页占用内存。物理内存和交换空间的和就是可提供的虚拟内存的总量。Linux有两种形式的交换方式,分别是交换分区,交换文件。

    • 优点:可以把空闲的内存页写入磁盘,把空出的内存给进程使用。
    • 缺点:交换发生越多,速度越慢。

    交换空间的大小

    交换空间的配置原则:

    1. 对于桌面系统,使用系统内存的两倍的交换空间,将可以运行大量的应用程序(其中可能有很多闲置的),使更多的RAM用于主要的应用;
    2. 对于服务器,使用小量的交换空间(通常是物理内存的一半),这样你就可以通过监控交换空间的大小来预警是否需要增加RAM;
    3. 对于老式台式机,使用尽可能大的交换空间

    swappiness

    有时候你会发现,虽然电脑内存还有非常多的剩余空间,但系统仍然在使用交换空间。这是由于swappiness的设置。swapppiness是Linux内核的一个参数,它控制Linux内核将进程从物理内存中交换出去的频繁度。swappiness的值可以在0到100之间。较低的swappiness值使Linux内核尽量避免进行交换操作,而较高的值则使内核尽量使用交换空间。swappiness的默认值是60。如果值为0,那么内核不进行交换操作,除非物理内存已经用完。如果值为100,那么内核将频繁地进行交换操作。若用户的物理内存充足,那么推荐把swappiness值设为10以提高程序的响应性。

    交换公式(swap formula)

    交换公式可以用于计算系统在什么时候会开始使用交换空间。交换公式如下:

    剩余内存 <= 总物理内存/ 100 *swappiness

    优先级

    如果你的系统上不只有一个交换分区或交换文件,那么你应当考虑为每个交换空间设置一个优先级。

    OOM现象

    了解了交换空间,我们知道了操作系统所有进程可以使用的内存总量是交换空间+swap空间

    默认情况下,Linux内核会允许进程请求的内存超出实际可用内存的大小。这在现实世界中是有意义的,因为大多数进程其实并不会用到所有分配给它的内存(注:同一时间内不会全用到)。

    这个做法的一个很明显的副作用就是,万一有一个程序正走上了一条耗尽内存的不归路怎么办。这会导致低可用内存的情况,也就是没有内存页能够再分配给进程了。你可能也碰到过这种情况,没有root帐户你是杀不掉这种顽固的进程的。为了解决这一情况,在剩余内存低于某个阈值,终结者被激活了,并找出了要终结的进程,这一现象叫OOM现象。

    overcommit特性

    Linux有overcommit特性,允许进程申请超过当前内存的更多的空间。可以为overcommit设置3个级别,级别0,1都会触发OOM。

    • 0:默认级别,启发式策略,比较严重的Overcommit将不能得逞。
    • 1:永远允许overcommit,这种策略适合那些不能承受内存分配失败的应用,比如某些科学计算应用。
    • 2:永远不允许overcommit,最大内存申请量为物理内存 + swap空间 * N,N为系数。

    如何选择被杀死的进程

    只要存在overcommit,就可能会有OOM killer。Linux下每个进程都有个OOM权重,在/proc/oom_adj里面,取值是-17到+15,取值越高,越容易被干掉。所以,我们可以把进程的oom_adj权重设置为-17,就能避免杀死。

  • 相关阅读:
    C# GridView点击某列打开新浏览器窗口
    大白话系列之C#委托与事件讲解(二)
    大白话系列之C#委托与事件讲解(一)
    Razor语法大全
    Expression<Func<T,TResult>>和Func<T,TResult>
    C#委托的介绍(delegate、Action、Func、predicate)
    Android--样式经验
    Android--onSaveInstanceState()保存数据
    Android--ActivityLiving生命周期
    android--快捷键
  • 原文地址:https://www.cnblogs.com/biterror/p/6913218.html
Copyright © 2020-2023  润新知