Linux记录-Linux Swap分区虚拟内存相关解决方案
Swap用途:Swap意思是交换分区,通常我们说的虚拟内存,是从硬盘中划分出的一个分区。当物理内存不够用的时候,
内核就会释放缓存区(buffers/cache)里一些长时间不用的程序,然后将这些程序临时放到Swap中,
也就是说如果物理内存和缓存区内存不够用的时候,才会用到Swap。
swap清理:swapoff -a && swapon -a
注意:这样清理有个前提条件,空闲的内存必须比已经使用的swap空间大
--------------------------------------------------------------------------------------------------------------------------------------------------------------
1.Linux如何查看哪个进程占用的SWAP分区比较多
##for i in $(ls /proc | grep "^[0-9]" | awk '$0>100'); do awk '/Swap:/{a=a+$2}END{print '"$i"',a/1024"M"}' /proc/$i/smaps;done| sort -k2nr | head
##ps aux | grep ${pid}
--------------------------------------------------------------------------------------------------------------------------------------------------------------
2.释放linux的swap内存
第一步:先执行sync命令
#sync
sync命令用于强制被改变的内容立刻写入磁盘,更新超块信息,以防止释放,sync命令则可用来强制将内存缓冲区中的数据立即写入磁盘中。
第二步:(如果仅仅是清理swap的话,这一步可以不执行)
#echo 3 > /proc/sys/vm/drop_caches 此指令输入立即生效,意在释放所有缓存。
#cat /proc/sys/vm/drop_caches
--------------------------------------------------------------------------------------------------------------------------------------------------------------
0 – 不释放
1 – 释放页缓存 ##echo 1 > /proc/sys/vm/drop_caches 或者 # sysctl -w vm.drop_caches=1
2 – 释放dentries(目录缓存)和inodes ##echo 2 > /proc/sys/vm/drop_caches 或者 # sysctl -w vm.drop_caches=2
3 – 释放所有缓存 ##echo 3 > /proc/sys/vm/drop_caches 或者 # sysctl -w vm.drop_caches=3
以上三种方式都是临时释放缓存的方法,要想永久释放缓存,需要在/etc/sysctl.conf文件中配置:vm.drop_caches=1/2/3,然后sysctl -p生效即可!
可以使用sync命令来清理文件系统缓存,还会清理僵尸(zombie)对象和它们占用的内存
温馨提示:
上面操作在大多数情况下都不会对系统造成伤害,只会有助于释放不用的内存。
但是如果在执行这些操作时正在写数据,那么实际上在数据到达磁盘之前就将它从文件缓存中清除掉了,这可能会造成很不好的影响。
那么如果避免这种事情发生呢?
因此,这里不得不提一下/proc/sys/vm/vfs_cache_pressure这个文件,告诉内核,当清理inoe/dentry缓存时应该用什么样的优先级。
#cat /proc/sys/vm/vfs_cache_pressure
100
vfs_cache_pressure=100 这个是默认值,内核会尝试重新声明dentries和inodes,并采用一种相对于页面缓存和交换缓存比较"合理"的比例。
减少vfs_cache_pressure的值,会导致内核倾向于保留dentry和inode缓存。
增加vfs_cache_pressure的值,(即超过100时),则会导致内核倾向于重新声明dentries和inodes
总之,vfs_cache_pressure的值:小于100的值不会导致缓存的大量减少,超过100的值则会告诉内核你希望以高优先级来清理缓存。
其实无论vfs_cache_pressure的值采用什么值,内核清理缓存的速度都是比较低的。
如果将此值设置为10000,系统将会将缓存减少到一个合理的水平。
-------------------------------------------------------------------------------------------------------------------------------------------------
cat /proc/sys/vm/swappiness
修改swappiness值为10
#sudo sysctl vm.swappiness=10
#sudo gedit /etc/sysctl.conf
vm.swappiness=10
设置vm.swappiness=0 后并不代表禁用swap分区,只是告诉内核,能少用到swap分区就尽量少用到,
设置vm.swappiness=100的话,则表示尽量使用swap分区,默认的值是60
------------------------------------------------------------------------------------------------------------------------------------------------
第三步:关闭swap,再开启swap(请在业务低峰期操作,有可能导致服务器挂掉)
#swapoff -a
#swapon -a
#free -m
swapon -s 会查看到你的swap分区是挂在哪里!
swapoff /dev/sda2
swapon -a