Linux的内存管理与监控

一、Linux的物理内存与虚拟内存

 1.1、Linux的物理内存与虚拟内存简介

        Linux的物理内存是对应主板上内存条硬件提供的内存大小,是真正的内存而虚拟内存则是相对于物理内存的概念,是为了满足物理内存不足,利用硬盘空间虚拟出来的一块逻辑内存,而用于虚拟内存的硬盘空间则被称为交换空间(swap space),在生产环境中,swap的大小一般为真实物理内存的1.5~2倍需要注意的是虚拟内存的速度远不及真正的物理内存。

        Linux的内存管理采取的是【分页存取机制】,为了保证物理内存能够到充分的利用,内核会在适当的时候将物理内存中不经常使用的数据块自动交互到虚拟内存中,而将经常使用的信息保留到物理内存中【Linux系统会不时的进行页交换操作,以保持尽可能多的空闲物理内存(但进行页的交换是有条件的,不是所有页在不用时都交换到虚拟内存【即:Linux的内核会根据最近最经常使用页的算法仅仅将最不经常使用的页交换到虚拟内存中】)由于Linux的这个算法机制会导致一种奇怪现象【即:Linux中的物理内存明明还有很多很充足,但是交换空间也被使用了】(举个示例来解释一下这个现象(如:有一个占用很大物理内存的应用程序进程,它在运行的时候就会消耗很多的内存资源,这个时候就会有一些不常用的页文件被交换到虚拟内存中;最后该应用程序进程结束后,其使用的物理内存资源就会被释放了;但是该应用程序进程被交换到虚拟内存中的页文件不会再自动交换到物理内存中了,主要是也没必要))

        注意:交换空间的页在使用时会首先被交换到物理内存,如果此时没有足够的物理内存来容纳这些页面,它们又会被马上交换出去,如此一来,虚拟内存中可能没有足够空间来存储这些交换页面,最终会导致Linux出现假死机、服务异常等问题发生

 1.2、Linux的内存监控查看

#查看内存信息命令
free -h

从内核的角度来查看内存的情况(Centos6)
        16402432(物理内存总量)-16360492(物理内存使用量)=41940(物理内存剩余量)

从应用层的角度来看可用的内存内容
        41940+(465404+12714880)=13222224
对于应用程序来说,buffers/cached占有的内存是可用的,因为buffers/cached是为了提高文件读取的性能,当应用程序需要用到内存的时候,buffers/cached会很快地被回收,以供应用程序使用。

buffers与cached的相同点与不同点
buffers与cached的相同点buffers与cached的不同点

buffers与cached都是内存操作

        用来保存系统曾经打开过的文件以及文件属性信息,这样当操作系统需要读取某些文件时,会首先在buffers与cached内存区查找,如果找到,直接读出传送给应用程序,如果没有找到需要数据,才从磁盘读取,这就是操作系统的缓存机制,通过缓存,可极大提高操作系统的性能

buffers与cached缓冲的内容是不同的

1、buffers表示块设备(block device)所占用的缓存页(page cache),包括直接读写块设备、以及文件系统元数据(metadata)如SuperBlock所使用的缓存页(如:可在Centos6系统上执行

find扫描命令查找文件[find /* -name "*.conf" -print]或[ cat /dev/sda2 > /dev/null]命令,观察 “buffers” 增加的情况)

2、cached表示普通文件所占用的缓存页(page cache),cached把读取过的数据保缓存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘。其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不经常读取的内容不断往后排,直至从中删除(如:通过vi打开一个非常大的文件,看看cached的变化,然后再次vi这个文件,感觉一下两次打开的速度有何异同【第二次打开会比第一次快很多】)。

 1.3、手动释放Linux的缓存

手动释放缓存cache
序号手动释放缓存cache命令说明
在手动释放内存前,必须先使用sync指令(该指令是将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件。否则在释放缓存的过程中,可能会丢失未保存的文件)。
0sync先将所有未写入硬盘中的缓冲区内容同步到硬盘上
1echo 1 > /proc/sys/vm/drop_caches

释放缓存页(page cache)【真正对应释放内存中的buffers内容】

2echo 2 > /proc/sys/vm/drop_caches

释放文件节点(inodes)缓存和目录项缓存(dentries),大部分缓存数据都是用的缓存页(page cache)【真正对应释放内存中的cached内容】

3echo 3 > /proc/sys/vm/drop_caches

释放所有缓存内容(包括page cache、dentries和inodes缓存等内容)

【将buffers与cached的内容都释放】

二、Linux的内存交换空间Swap

创建、删除和优化内存交换空间swap
创建交换空间swap所需的交换文件是一个普通的文件,但是,创建交换文件与创建普通文件不同,必须通过dd命令来完成,同时这个文件必须位于本地硬盘上,不能在网络文件系统(NFS)上创建swap交换文件
序号swap操作说明
1创建swap文件
#创建swap文件示例(可在任意目录创建,一般扩展swap文件大小是通过bs数量扩展,
#count数量建议保持在65536以内)【如:我这里创建1M*2048=2048M=2G】
dd if=/dev/zero of=/data/swapfile1 bs=1M count=2048

创建swap文件的参数含义说明:

【if】表示输入文件,或者设备名称。

【of】表示输出文件,或者设备名称(dev/zero是Linux的一种特殊字符设备(输入设备),可以用来创建一个指定长度用于初始化的空文件,如临时交换文件,该设备无穷尽地提供0,可以提供任何你需要的数目)。

【ibs】ibs=1024表示一次读入1024 个字节(即一个单位数据块(block)大小为 1024 个字节)。

【obs】obs=1024 表示一次写 1024 个字节(即一个单位数据块(block)大小为1024 个字节)。

【bs】bs=bytes,同时设置读写块的大小,以bytes为单位,此参数可代替 ibs 和 obs(如bs=1024M就是1G)。

【count】count=blocks 表示拷贝blocks个数据块(block)

2指定swap文件

使用【mkswap】命令指定作为交换空间的设备或者文件。

#将刚才创建的/data/swapfile1文件指定为交换空间
mkswap /data/swapfile1
3激活swap文件

使用【swapon】命令激活创建的交换空间文件【/usr/sbin/swapon /data/swapfile1】

#使用swapon命令激活刚才创建指定的/data/swapfile1文件激活
swapon /data/swapfile1

#注意:若激活该创建指定的swap文件后提示
#【swapon: /data/swapfile1:不安全的权限 0644,建议使用 0600。】
#时不用紧张,实际上已经激活该文件了,如果不放心也
#可以手动指定一下该swap文件的权限
chmod -R 0600 /data/swapfile1 

1-可使用【free -h】或【swapon -s】命令查看当前的虚拟内存容量情况;

2-创建swap文件并激活后还需要在【开机自动挂载分区文件(/etc/fstab)上挂着该swap文件】

#1-可以直接编辑/etc/fstab文件添加上该swap文件实现开机自动挂载
/data/swapfile1  swap  swap  defaults  0  0

#2-或者直接使用命令添加到/etc/fstab文件中
echo  "/data/swapfile1   swap  swap  defaults  0  0" >>  /etc/fstab
4优化swap

swappiness值的大小对如何使用swap分区是有着很大的联系的。swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。linux的基本默认设置为60。

swap交换内存性能远比不上物理内存,且过多使用swap反而会降低系统整体性能,这违背了创建swap交换内存的初衷。我们希望在物理内存即将到达满荷时再使用交换内存swap,因此swappiness的值建议范围在10-60的区间,而固态硬盘可以将这个值设置的偏高一些

#查看系统当前设置的swap值(值为60表示你的物理内存
#在使用到100-60=40%的时候,就开始使用swap交换了)
cat /proc/sys/vm/swappiness

#从操作系统层面来说,要尽可能使用物理内存
#(因为物理内存是比swap内存快很多的)
#我们这里临时设置物理内存到70%的时候才使用swap交换
sysctl vm.swappiness=30

#设置vm.swappiness=30永久生效,则需要修改/etc/sysctl.conf配置文件
#在这个配置文件末尾添加上【vm.swappiness = 30】系统重启后生效
vi /etc/sysctl.conf
5删除swap文件
#1-先停用内存交换空间文件
swapoff /data/swapfile1 

#2-再直接移除这个内存空间交换文件
rm -rf /data/swapfile1 

#3-注释或直接删除掉之前在/etc/fstab文件里追加的开机自动挂载配置内容
#/data/swapfile1                          swap                    swap    defaults        0 0

三、其他资料

13.2. 推荐的系统 swap 空间 | 管理存储设备 | Red Hat Enterprise Linux | 8 | Red Hat Documentationhttps://docs.redhat.com/zh-cn/documentation/red_hat_enterprise_linux/8/html/managing_storage_devices/recommended-system-swap-space_getting-started-with-swap13.4. 创建交换文件 | 管理存储设备 | Red Hat Enterprise Linux | 8 | Red Hat Documentationhttps://docs.redhat.com/zh-cn/documentation/red_hat_enterprise_linux/8/html/managing_storage_devices/creating-a-swap-file_getting-started-with-swapSwap - Arch Linux 中文维基https://wiki.archlinuxcn.org/wiki/Swap

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛奶咖啡13

我们一起来让这个世界有趣一点…

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值