1.先了解/proc/meminfo中的各个字段的含义
2.free命令的分析
计算公式:used=total - free - buffers - cache
total Total installed memory (MemTotal and SwapTotal in /proc/meminfo)
MemTotal Total amount of usable RAM, in kibibytes, which is physical RAM minus a number of reserved bits and the kernel binary code.
可用RAM的总量(以千字节为单位),即物理RAM减去一些保留位和内核二进制代码。(可以理解为系统需要占用的)
比如之前遇到的CentOS8的系统通过meminfo查看MemTotal比CentOS7的要少,和内核有关系
used Used memory (calculated as total - free - buffers - cache)
已经使用的物理内存
free Unused memory (MemFree and SwapFree in /proc/meminfo)
没有使用的物理内存
shared Memory used (mostly) by tmpfs (Shmem in /proc/meminfo)
主要是tmpfs使用的内存
buffers Memory used by kernel buffers (Buffers in /proc/meminfo,
Buffers
— The amount, in kibibytes, of temporary storage for raw disk blocks.)
还没有来得及写到磁盘上的数据,先放在内存。当系统空闲或者buffer的容量达到一定的大小,再写入磁盘。我们平时执行的sync命令,就是强制把buffers写入到磁盘中
cache Memory used by the page cache and slabs (Cached and SReclaimable in /proc/meminfo)
page cache:缓存从磁盘上读取的数据,以及slabs
SReclaimable
— The part of Slab that can be reclaimed, such as caches.
Slab
— The total amount of memory, in kibibytes, used by the kernel to cache data structures for its own use.
buff/cache Sum of buffers and cache
buffers 与 cache的加起来的和
available Estimation of how much memory is available for starting new applications, without swapping. Unlike the data provided by the cache or free fields, this field takes into account page cache and also that not all reclaimable memory slabs will be reclaimed due to items being in use (MemAvailable in /proc/meminfo,available on kernels 3.14, emulated on kernels 2.6.27+, otherwise the same as free)
估计有多少内存可用于启动新应用程序而无需使用swap。与由cache或free字段提供的数据不同,此字段考虑了页面缓存,以及由于正在使用的项目,并非所有可回收的slab内存都会被回收,但是是可以被回收后使用的内存。
这个是从应用程序的视角来观察的。
3.swap相关设置
概念:virtual memory (VM) subsystem
swap工作原理是 :当物理内存不够时,在某些在内存当中所占的程序会暂时被移动到 swap 中,让物理内存可以被更需要的程序来优先使用。
(1)设置swap的相关内核参数
主要靠设置swappiness这个文件的值实现
红帽的文档中是如下介绍swappiness的
/proc/sys/vm/swappiness swappiness — Determines how much a machine should swap. The higher the value, the more swapping occurs. The default value, as a percentage, is set to 60. Swappiness is a property for the Linux kernel that changes the balance between swapping out runtime memory, as opposed to dropping pages from the system page cache. Swappiness can be set to values between 0 and 100, inclusive. A low value means the kernel will try to avoid swapping as much as possible where a higher value instead will make the kernel aggressively try to use swap space.
在Linux系统中,可以通过查看/proc/sys/vm/swappiness
内容的值来确定系统对SWAP分区的使用原则。当 swappiness
内容的值为0
时,表示最大限度地使用物理内存,物理内存使用完毕后,才会使用SWAP分区。当swappiness
内容的值为100
时,表示积极地使用SWAP分区,并且把内存中的数据及时地置换到SWAP分区。
误区:并不是指当内存使用到百分之swappiness的值,才开始使用swap,swappiness只是计算使用swap的积极程度(swap_tendency)算法中的其中一个值①。
swap_tendency = mapped_ratio/2 + distress + vm_swappiness
Swap_tendency < 100,内核会尽量的从page cache中做回收(写回page cache)
Swap_tendency >=100,内核会尽量交换匿名内存和共享内存。
● mapped_ration : 物理内存的使用百分比。
● distress : 内核尝试释放物理内存的难易程度0-100(page cache回收的难易程度)。
● vm_swappiness:是我们可以通过/proc/sys/vm/swappiness内核参数调节的值。
可以看出我们可以人为的干预交换内存的交换,但无法准确控制因为有distress参数
- 查看当前的swappiness的值
cat /proc/sys/vm/swappiness
- 临时设置
sudo sysctl vm.swappiness=10
- 永久设置
在/etc/sysctl.conf 文件里添加如下参数:
vm.swappiness=10
sysctl -p
生效
(2)创建以及启用swap的步骤如下
一、新建磁盘分区作为swap分区
- 以root身份进入控制台(登录系统),输入 swapoff -a #停止所有的swap分区(如有)
- 用fdisk命令(例:# fdisk /dev/vdb)对磁盘进行分区,添加swap分区,新建分区,在fdisk中用“t”命令将新添的分区id改为82(Linux swap类型),最后用w将操作实际写入硬盘(没用w之前的操作是无效的)。
- mkswap /dev/vdb1 #格式化swap分区
- swapon /dev/vdb1 #启动新的swap分区
- 为了让系统启动时能自动启用这个交换分区,可以编辑/etc/fstab,加入下面一行
/dev/vdb1 swap swap defaults 0 0
二、用文件作为Swap分区
1.创建要作为swap分区的文件:增加2GB大小的交换分区,则命令写法如下,其中的count等于想要的块的数量(bs*count=文件大小)。
dd if=/dev/zero of=/home/swapfile bs=1M count=2048
2.格式化为交换分区文件:
mkswap /home/swapfile #建立swap的文件系统
3.启用交换分区文件:
swapon /home/swapfile #启用swap文件
4.使系统开机时自启用,在文件/etc/fstab中添加一行:
echo "/home/swapfile swap swap defaults 0 0" >> /etc/fstab
测试
redis-server --test-memory 希望占用的内存大小(MB)
测试使用swap的截图
FYI:
当使用swap时,kswapd0这个进程可能由于分配磁盘交换空间作缓存,导致CPU跑高。
参考文献