返回顶部
首页 > 资讯 > 操作系统 >linux中swappiness参数有什么用
  • 698
分享到

linux中swappiness参数有什么用

2023-06-27 18:06:00 698人浏览 八月长安
摘要

这篇文章将为大家详细讲解有关linux中swappiness参数有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。swappiness是Linux的一个内核参数,控制系统在进行swap时,内存使用的相

这篇文章将为大家详细讲解有关linux中swappiness参数有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

swappiness是Linux的一个内核参数,控制系统在进行swap时,内存使用的相对权重。swappiness参数值可设置范围在0到100之间。 此参数值越低,就会让Linux系统尽量少用swap分区,多用内存;参数值越高就是反过来,使内核更多的去使用swap空间。

linux中swappiness参数有什么用

一. 关于内存分配与页回收(page reclaim)

page reclaim发生的场景主要有两类,一个是kswapd后台线程进行的活动,另一个是direct reclaim,即分配页时没有空闲内存满足,需要立即直接进行的页回收。大体上内存分配的流程会分为两部分,一部分是fast path,另一部分是slow path,通常内存使用非紧张情况下,都会在fast path就可以满足要求。并且fast path下的内存分配不会出现dirty writeback及swap等页回收引起的io阻塞情况。

fast path大体流程如下:1.如果系统挂载使用了memory cgroup,则首先检查是否超过cgroup限额,如果超过则进行direct reclaim,通过do_try_to_free_pages完成。如果没超过则进行cgroup的charge工作(charge是通过两阶段提交完成的,这里不展开了)。2.从本地prefered zone内存节点查找空闲页,需要判断是否满足系统watermark及dirty ratio的要求,如果满足则从buddy system上摘取相应page,否则尝试对本地prefered zone进行页回收,本次fast path下页回收只会回收clean page,即不会考虑dirty page以及mapped page,这样就不会产生任何swap及writeback,即不会引起任何blocking的IO操作,如果这次回收仍然无法满足请求的内存页数目则进入slow path

slow path大体流程如下:\1. 首先唤醒kswapd进行page reclaim后台操作。\2. 重新尝试本地prefered zone进行分配内存,如果失败会根据请求的GFP相关参数决定是否尝试忽略watermark, dirty ratio以及本地节点分配等要求进行再次重试,这一步中如果分配页时有指定GFP_NOFAIL标记,则分配失败会一直等待重试。\3. 如果没有GFP_NOFAIL标记,则会需开始进行page compact及page direct reclaim操作,之后如果仍然没有可用内存,则进入OOM流程。

相关内容可以参阅内核代码__alloc_pages函数的逻辑,另外无论page reclaim是由谁发起的,最终都会统一入口到shrink_zone,即针对每个zone独立进行reclaim操作,最终会进入shrink_lruvec函数,进行每个zone相应page lru链表的扫描与回收操作。

二. 关于页回收的一些背景知识

页回收大体流程会先在每个zone上扫描相应的page链表,主要包括inactive anon/active anon(匿名页链表)以及inactive file/active file链表(file cache/映射页链表),一共四条链表,我们所有使用过的page在被回收前基本是保存在这四条链表中的某一条中的(还有一部分在unevictable链表中,忽略),根据其被引用的次数会决定其处于active还是inactive链表中,根据其类型决定处于anon还是file链表中。

页回收总体会扫描逐个内存节点的所有zone,然后先扫描active,将不频繁访问的页挪到inactive链表中,随后扫描inactive链表,会将其中被频繁引用的页重新挪回到active中,确认不频繁的页则最终被回收,如果是file based的页则根据是否clean进行释放或回写(writeback,filecache则直接释放),如果是anon则进行swap,所以本文实际关心的是swappiness参数对anon链表扫描的影响。

另外还需要了解前面描述的四个链表原来是放在zone数据结构上的,后来引入了mem_cgroup则,重新定义了一组mem_cgroup_per_zone/mem_cgroup_per_node的数据结构,这四个链表同时定义在这组数据结构上,如果系统开启了mem cgroup则使用后者,否则用前者。

另外再重点说下swap只是page reclaim的一种处理措施,主要针对anon page,我们最终来看下swappiness的确切含义

三. swappiness对page reclaim的确切影响

page reclaim逻辑中对前面所述四个链表进行扫描的逻辑在vmscan.c中的get_scan_count函数内,该函数大部分逻辑注释写得非常清楚,我们简单梳理下,主要关注scan_balance变量的取值:

\1. 首先如果系统禁用了swap或者没有swap空间,则只扫描file based的链表,即不进行匿名页链表扫描代码如下:

if (!sc->may_swap || (get_nr_swap_pages()

\2. 如果当前进行的不是全局页回收(cgroup资源限额引起的页回收),并且swappiness设为0,则不进行匿名页链表扫描,这个是没得商量,这里swappiness值直接决定了是否有swap发生,设成0则肯定不会发生,另外需要注意,这种情况下需要设置的是cgroup配置文件memory.swappiness,而不是全局的sysctl vm.swappiness代码如下:

if (!global_reclaim(sc) && !vmscan_swappiness(sc)) {scan_balance = SCAN_FILE;Goto out;}

\3. 如果进行链表扫描前设置的priority(这个值决定扫描多少分之一的链表元素)为0,且swappiness非0,则可能会进行swap代码如下:

if (!sc->priority && vmscan_swappiness(sc)) {scan_balance = SCAN_EQUAL;goto out;}

\4. 如果是全局页回收,并且当前空闲内存和所有file based链表page数目的加和都小于系统的high watermark,则必须进行匿名页回收,则必然会发生swap,可以看到这里swappiness的值如何设置是完全无关的,这也解释了为什么其为0,系统也会进行swap的原因,另外最后我们会详细解释系统page watermark是如何计算的。代码如下:

anon = get_lru_size(lruvec, LRU_ACTIVE_ANON) +get_lru_size(lruvec, LRU_INACTIVE_ANON);file = get_lru_size(lruvec, LRU_ACTIVE_FILE) +get_lru_size(lruvec, LRU_INACTIVE_FILE);

if (global_reclaim(sc)) {free = zone_page_state(zone, NR_FREE_PAGES);if (unlikely(file + free

\5. 如果系统inactive file链表比较充足,则不考虑进行匿名页的回收,即不进行swap代码如下:

if (!inactive_file_is_low(lruvec)) {scan_balance = SCAN_FILE;goto out;}

\6. 最后一种情况则要根据swappiness值与之前统计的file与anon哪个更有价值来综合决定file和anon链表扫描的比例,这时如果swappiness设置成0,则也不会扫描anon链表,即不进行swap,代码比较多,不再贴出。

四. 系统内存watermark的计算

前面看到系统内存watermark对页回收机制是有决定影响的,其实在内存分配中也会频繁用到这个值,确切的说它有三个值,分别是low,min和high,根据分配页时来指定用哪个,如果系统空闲内存低于相应watermark则分配会失败,这也是进入slow path或者wakeup kswapd的依据。

实际这个值的计算是通过sysctl里的vm.min_free_kbytes来决定的,大体的计算公式如下:

pages_min = min_free_kbytes >> (PAGE_SHIFT – 10);tmp = (u64)pages_min * zone->managed_pages;do_div(tmp, lowmem_pages);zone->watermark[WMARK_MIN] = tmp;zone->watermark[WMARK_LOW] = min_wmark_pages(zone) + (tmp >> 2);zone->watermark[WMARK_HIGH] = min_wmark_pages(zone) + (tmp >> 1);

即根据min_free_kbytes的值按照每个zone管理页面的比例算出zone的min_watermark,然后再加min的1/4就是low,加1/2就是high了

关于“linux中swappiness参数有什么用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: linux中swappiness参数有什么用

本文链接: https://lsjlt.com/news/312719.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • linux中swappiness参数有什么用
    这篇文章将为大家详细讲解有关linux中swappiness参数有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。swappiness是Linux的一个内核参数,控制系统在进行swap时,内存使用的相...
    99+
    2023-06-27
  • Linux系统中如何修改swappiness参数
    这篇文章主要为大家展示了“Linux系统中如何修改swappiness参数”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux系统中如何修改swappiness参数”这篇文章吧。Linux系...
    99+
    2023-06-27
  • linux系统swappiness参数在内存与交换分区间优化
    http://blog.itpub.net/29371470/viewspace-1250975swappiness的值的大小对如何使用swap分区是有着很大的联系的。swappiness=0的时候表示最大限度使用物理内存,然后才是 swa...
    99+
    2023-06-05
  • ajax()中data参数有什么用
    这篇文章主要介绍“ajax()中data参数有什么用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ajax()中data参数有什么用”文章能帮助大家解决问题。在aj...
    99+
    2024-04-02
  • tomcat中的Connector参数有什么用
    这篇文章给大家分享的是有关tomcat中的Connector参数有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Connector的主要功能,是接收连接请求,创建Request和Response对象用于和请...
    99+
    2023-06-04
  • dd参数有什么用
    这篇文章主要为大家展示了“dd参数有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“dd参数有什么用”这篇文章吧。dd 强大的备份命令命令格式:dd 参数参数有:bs=bytes数 ...
    99+
    2023-06-13
  • 在mysql中innodb_fast_shutdown参数有什么作用
    这篇文章主要讲解了“在mysql中innodb_fast_shutdown参数有什么作用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“在mysql中inno...
    99+
    2024-04-02
  • linux中apt命令参数是什么
    linux中apt命令参数是根据运行不同的参数使用不同的功能,例如常用的apt命令参数有:apt-cache search package #搜索包apt-cache show package #获取包的相关信息,如说明、大小、版本等sud...
    99+
    2024-04-02
  • MySQL中mysqldump命令的参数有什么用
    这篇文章主要介绍MySQL中mysqldump命令的参数有什么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 参数说明--all-databases ...
    99+
    2024-04-02
  • linux mencoder参数的作用是什么
    mencoder 是一个开源的视频编码和解码工具,常用于处理视频文件的转码和压缩。mencoder 的参数用于指定视频文件的输入和输...
    99+
    2023-10-18
    linux
  • mysql dump参数有什么作用
    本篇内容介绍了“mysql dump参数有什么作用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • linux中open参数的含义是什么
    本篇内容介绍了“linux中open参数的含义是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!open函数是linux 文件I/O读取的...
    99+
    2023-06-27
  • Linux中Redhat的系统参数是什么
    本篇文章为大家展示了Linux中Redhat的系统参数是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。fs.aio-max-nr:同时可以拥有的的异步IO请求数目推荐值:1048576 其实它等...
    99+
    2023-06-05
  • Linux 中find命令exec参数的作用是什么
    本篇文章为大家展示了Linux 中find命令exec参数的作用是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。  exec解释:  -exec 参数后面跟的是command命令,它的终止是以;...
    99+
    2023-06-13
  • Ubuntu中MySQL的参数文件my.cnf有什么用
    这篇文章主要介绍Ubuntu中MySQL的参数文件my.cnf有什么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言对于MySQL的理解,我认为很多性能优化工作、主从主主复制都是...
    99+
    2024-04-02
  • ASP 框架中的 path 参数有什么作用?
    ASP框架是一个非常流行的Web应用程序开发框架,它使用一种称为path参数的技术来处理Web请求。在本文中,我们将详细探讨ASP框架中path参数的作用。 首先,让我们了解一下什么是path参数。在ASP框架中,path参数是一种特殊的参...
    99+
    2023-10-19
    框架 path 分布式
  • Linux下keepalive的内核参数有什么含义
    小编给大家分享一下Linux下keepalive的内核参数有什么含义,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!tcp_keepalive_time - INT...
    99+
    2023-06-13
  • ajax函数有什么参数
    这篇文章将为大家详细讲解有关ajax函数有什么参数,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 ajax函数的参数有:options、asy...
    99+
    2024-04-02
  • Linux中变量参数$的含义是什么
    本篇文章为大家展示了Linux中变量参数$的含义是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Linux变量参数$的含义   我们先写一个简单的脚本,执行以后再解释各个变量的意义 # touc...
    99+
    2023-06-13
  • linux中ls命令参数有哪些
    这篇文章主要介绍linux中ls命令参数有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、ls命令参数详解 可以通过阅读 ls 的说明书页(man ls)来获得选项的完整列表。 -a – 全...
    99+
    2023-06-09
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作