linux内存利用率计算以及swap的设置

本文主要内容参考红帽官网和阿里社区文章


前言

工作期间遇到一个计算服务内存利用率的需求,之前直接使用(total-free)/total,对内存实际占用没有深入了解,后续测试过程中发现和其他工具计算出来的占用出入比较大,网上了解了之后发现内存使用计算不正确,对功能实现进行了修改。最近在阿里云社区上发现一篇讲相关内容的文章,参考并整理记录。
原文传送门


一、内存利用率的计算公式

free -h

used = total - free - buff/cache
内存利用率 = (total - free - buff/cache) / total

二、redhat官网对/proc/meminfo各个字段的含义解释

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/deployment_guide/s2-proc-meminfo

三、free命令分析

内存分类含义
Total安装内存总数(在/proc/meminfo中的MemTotal和SwapTotal)
MemTotal可用RAM的总量(以千字节为单位),即物理RAM减去一些保留位和内核二进制代码。(可以理解为系统需要占用的)
used已经使用的物理内存(计算方式为 Total - free - buffers - cache)
free没有使用的物理内存(MemFree and SwapFree in /proc/meminfo)
shared主要是tmpfs使用的内存(Shmem in /proc/meminfo)
buff/cachebuffers 与 cache的加起来的和,如下:
buffers还没有来得及写到磁盘上的数据,先放在内存。当系统空闲或者buffer的容量达到一定的大小,再写入磁盘。我们平时执行的sync命令,就是强制把buffers写入到磁盘中(Buffers in /proc/meminfo, in kibibytes)
cacheMemory 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.
available估计有多少内存可用于启动新应用程序而无需使用swap。与由cache或free字段提供的数据不同,此字段考虑了页面缓存,以及由于正在使用的项目,并非所有可回收的slab内存都会被回收,但是是可以被回收后使用的内存。这个是从应用程序的视角来观察的。

四、swap相关设置

概念:virtual memory (VM) subsystem(虚拟内存子系统
swap工作原理是 :当物理内存不够时,在某些在内存当中所占的程序会暂时被移动到 swap 中,让物理内存可以被更需要的程序来优先使用。

1.swap相关内核参数-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)算法中的其中一个值。(来自https://access.redhat.com/solutions/103833)

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步骤

2.1、新建磁盘分区作为swap分区

  1. 以root身份进入控制台(登录系统),输入 swapoff -a #停止所有的swap分区(如有)
  2. 用fdisk命令(例:# fdisk /dev/vdb)对磁盘进行分区,添加swap分区,新建分区,在fdisk中用“t”命令将新添的分区id改为82(Linux swap类型),最后用w将操作实际写入硬盘(没用w之前的操作是无效的)。
  3. mkswap /dev/vdb1 #格式化swap分区
  4. swapon /dev/vdb1 #启动新的swap分区
  5. 为了让系统启动时能自动启用这个交换分区,可以编辑/etc/fstab,加入下面一行
    /dev/vdb1 swap swap defaults 0 0

2.2、用文件作为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进行内存占用测试: redis-server --test-memory 希望占用的内存大小(MB)

当使用swap时,kswapd0这个进程可能由于分配磁盘交换空间作缓存,导致CPU跑高。

在这里插入图片描述


总结

在做这个需求的时候,对于服务器的内存利用率并不知道具体的计算方式,和开发对接脚本的同事简单对接后简单的使用了used/Total导致计算结果偏大。后面才发现,原来redhat官网有如此细致的解释。一是感慨自己的linux基础知识的欠缺,二是以后遇到自己不熟悉的领域和方向,需要有方法有技巧的去看清需求和问题,仔细分析是可以想到去linux发型版本的官网查询的。

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值