swap知识点
结合了两篇文章copy下来的,转载记得附上文章原文地址linux开启swap(磁盘缓存)操作_阳光梦的专栏-CSDN博客_kib swap系统内存还有很多的情况下为何swap使用很高了 - 程序员大本营linux开启swap(磁盘缓存)操作_阳光梦的专栏-CSDN博客_kib swap一、Swap是什么Swap就是把一块磁盘空间或者一个本地文件,当成内存来使用。换出,就是把进程暂时不用的内存数据存
结合了两篇文章copy下来的,转载记得附上文章原文地址
linux开启swap(磁盘缓存)操作_阳光梦的专栏-CSDN博客_kib swap系统内存还有很多的情况下为何swap使用很高了 - 程序员大本营
linux开启swap(磁盘缓存)操作_阳光梦的专栏-CSDN博客_kib swap
目录
一、Swap是什么
- Swap就是把一块磁盘空间或者一个本地文件,当成内存来使用。
- 换出,就是把进程暂时不用的内存数据存储到磁盘中
- 换入,就是在进程再次访问这些内存的时候,从磁盘中读取到内存
- Swap其实是把系统的可用内存变大了,这样即使服务器的内存不足,也可以腾出空间来运行大内存的应用程序。
- 既然Swap是为了回收内存,那么Linux会在什么时候需要回收内存呢?它又是怎么来衡量内存是不是紧张或者压力大呢?
二、内存回收是什么?
- 内存回收是子系统释放掉可以回收的内存
- 缓存和缓冲区,他们在内存管理中,叫做文件页
- 大部分文件页可以直接回收,有需要的时候再从磁盘读取
- 至于脏页,就得先写入磁盘,然后才能进行内存释放
- 脏页的回收,可以在应用程序中,通过系统调用fsync,或者有系统内核现成pdflush负责刷新到磁盘
- Swap,应用程序动态分配的堆内存,他们在内存管理中叫做匿名页
三、如何衡量内存是不是紧张了呢?
- 定期回收内存的内核线程kwapd0,定义了三个内存阀值,然后根据内存剩余值的范围来进程对应内存操作
- 页最小阀值,内存压力很大,无法进行正常分配
- 页低阀值,内存有一定的压力,但是可以进行正常分配
- 页高阀值,内存无压力
- 如果剩余内存小于页低阀值,就会出发内存回收了
- 页低阀值可以查看 /proc/sys/vm/min_free_kbytes
- min_free_kbytes设置了页最小阀值,根据这个阀值可以计算另外两个数值
- pages_low = pages_min*5/4
- pages_high = pages_min*3/2
1.内存阀值参数
- pages中的min、low、high,就是三个内存阀值
- free就是剩余内存页数,它跟后面的nr_free_pages相同
- nr_active_anon和nr_inactive_anon,分别是活跃和非活跃的匿名页数
- nr_active_file和nr_inactive_file,分别是活跃和非活跃的文件页数
- 那内存参数里面的Node0又是什么呢?
watch -d grep -A 15 'Normal' /proc/zoneinfo
2.NUMA架构
- 处理器的NUMA架构,在这种架构下,多个处理器被划分到不同的Node上,同时每个Node都拥有自己的本地内存空间
- 当某个Node内存不足时,系统可以从本地内存中回收内存,也可以从其他Node寻找空闲内存。具体什么模式,可以通过zone_reclaim_mode参数来调整
- 默认0,既可以本地回收内存,也可以从其他Node寻找空闲内存
- 1、2、4都表示只回收本地内存,2表示可以回写脏数据回收内存,4表示可以用Swap方式回收内存
3.内存回收机制
- 到这里,我们就可以理解内存回收机制了。这些回收的内存既包括了文件页,又包括了匿名页
- 对文件页的回收,就是直接回收缓存,或者把脏页写回磁盘后再回收
- 对匿名页的回收,其实就是通过Swap机制,把它们写入磁盘后再释放内存
- 这两种不同的内存回收机制,在实际的内存回收过程中,到底应该先回收哪一种呢
4.swapiness
- Linux提供了一个swapiness选项,用来调整使用swap的积极程度
- 范围是0-100,数值越大,表示越积极使用Swap,也就是更倾向于回收匿名页数
- 数值越小,越消极使用Swap,也就是更倾向于回收文件页
- 默认的60是一个比较中和的值,系统会根据实际运行情况,选择合适的内存回收类型,比如回收不活跃的匿名页,或者不活跃的文件页
5.Swap被哪些应用占用
- 可以使用以下命令来查看系统的Swap被哪些应用所占用
for file in /proc/*/status;do awk '/VmSwap|Name|^Pid/{printf $2 " " $3}END{ print ""}' $file;done |sort -k 3 -n -r |head
四、swap开关
1.swappiness修改
1.临时修改 : sysctl vm.swappiness=10
2.永久修改 : echo 'vm.swappiness=10' >>/etc/sysctl.conf
2.swap大小配置
一般来说可以按照如下规则设置swap大小:
4G以内的物理内存,SWAP 设置为内存的2倍。
4-8G的物理内存,SWAP 等于内存大小。
8-64G 的物理内存,SWAP 设置为8G。
64-256G物理内存,SWAP 设置为16G。
3.swap自动启动
cat /etc/fstab
ext分区是否启用由mount及umount控制。
swap分区是否启动,由swapon及swapoff控制。
4.swap开关
查看swap分区列表: swapon -s
关闭swap : swapoff -a 或单独关闭一个swap分区: swapoff /dev/sda2( /dev/sda2是我们在安装操作系统时划分的磁盘分区)
关掉Swap会发生什么?
当内存足够的时候,关掉Swap,Swap占用的空间大小会保存在内存当中去
当内存不够的时候,没法强行关掉Swap打开swap: swapon /dev/sda2
5.查看目录类型blkid
6.使用文件作为SWAP分区
1.在根目录下生成一个文件:swap-file,大小1G:dd if=/dev/zero of=/swap-file bs=1M count=1024
2.将生成的文件格式化成交换分区: mkswap /swap-file
3.启动swap分区: swapon /swap-file
4.查看状态: swapon -s
5.若要swap分区永久生效需要在/etc/fstab文件中添加以下内容
UUID=227e6299-9a43-4996-94ec-bb67bd8cf105 swap swap defaults 0 0
或者: /swap-file swap swap defaults 0 0
7.使用磁盘作为SWAP分区
参考文章: linux开启swap(磁盘缓存)操作_阳光梦的专栏-CSDN博客_kib swap
1.先划分一个G的磁盘分区出来: fdisk /dev/sdb
2.查看 fdisk -l (fdisk ID的编号。 83代表ext分区,82代表swap分区)
3.格式化swap分区: mkswap /dev/sdb1
4.使用mkswap –L swap-disk/dev/sdc1
5.查看类型 blkid
6.类型改变,可以手动启动swap : swapon /dev/sdc1
7.查看swap列表: swapon -s
五、常问的十个问题
- 为什么系统在可用内存还有很多的情况下,会用到swap? 答案:这个受numa架构参数值,swapiness参数值以及文件页和匿名页不同内存对象的影响。
- swap到磁盘中的匿名页,当再次被换入到内存中,那磁盘中的匿名页会被释放掉吗? 答案:会的。
- 如果swap到磁盘中的匿名页一直没被使用,磁盘中如何进行释放? 答案:会根据进程生命周期来进行释放。
- 如果系统不开启Swap,那匿名页还怎么回收? 答案:会一直保存在内存中。
- 如果大量匿名页把Swap都写满了,这个时候怎么选择从swap里清理哪些匿名页? 答案:大量匿名页把Swap都写满了,说明内存不够了,可能会出现OOM了。
- 内核中swapness使用的默认值是60,如果配置为0还会使用swap吗? 答案:会的。这个值只是一个倾向值,即使为0,在内存紧张的情况下,还是有可能会用到。
- 当Swap升高时,系统性能会受到影响吗? 答案:会的,Swap升高,说明系统中本来和内存打交道的一些操作会涉及到和磁盘打交道,IO性能会受到影响。
- 如果没有swap,系统内存不够了怎么办? 答案:OOM。
- cache、buffer和swap回收的内存对象有什么不同? 答案:cache和buffer回收的是文件页,Swap回收的是匿名页。
- 哪些应用或者服务应该关闭swap? 答案:对IO有很高要求的应用或者服务都应该关闭Swap,比如DB等。
更多推荐
所有评论(0)