Centos 7 解决free -m 下buff/cache缓存很高

本文深入探讨Linux服务器的内存管理机制,包括buff/cache的作用及如何手动释放内存,以避免swap空间过度使用导致系统变慢。文章还介绍了/proc虚拟文件系统在内存管理中的角色,并提供了释放不同缓存的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自:人走搽谅

 Linux服务器运行一段时间后,由于其内存管理机制,会将暂时不用的内存转为buff/cache,这样在程序使用到这一部分数据时,能够很快的取出,从而提高系统的运行效率,所以这也正是linux内存管理中非常出色的一点,所以乍一看内存剩余的非常少,但是在程序真正需要内存空间时,linux会将缓存让出给程序使用,这样达到对内存的最充分利用,所以真正剩余的内存是free+buff/cache

但是有些时候大量的缓存占据空间,这时候应用程序回去使用swap交换空间,从而使系统变慢,这时候需要手动去释放内存,释放内存的时候,首先执行命令 sync 将所有正在内存中的缓冲区写到磁盘中,其中包括已经修改的文件inode、已延迟的块I/O以及读写映射文件,从而确保文件系统的完整性

  说到清理内存,那么不得不提到/proc这一个虚拟文件系统,这里面的数据和文件都是内存中的实时数据,很多参数的获取都可以从下面相应的文件中得到,比如查看某一进程占用的内存大小和各项参数,cpu和主板的详细信息,显卡的参数等等;相应的关于内存的管理方式是在/proc/sys/vm/drop_chches文件中,一定要注意这个文件中存放的并不是具体的内存内容,而是0-3这几个数字,通过文件大小只有1B也可以知道,而这些代号分别告诉系统代表不同的含义如下:

  0:0是系统默认值,默认情况下表示不释放内存,由操作系统自动管理

  1:释放页缓存

  2:释放dentries和inodes

  3:释放所有缓存

  所以根据上面的说明,分别将1,2,3这3个数字重定向到drop_caches中可以实现内存的释放,一般释放内存都是重定向3到文件中,释放所有的缓存

那么下面举个例子,比如这里只释放页缓存,首先使用

free -h

查看当前内存剩余

 当前内存剩余570M左右,另外buff/cache是1.3G,根据上面说的现在真正的剩余内存应该是1.8G左右,首先写缓存到文件系统:

sync

然后执行下面命令释放内存(页缓存buff/cache):

echo 1 > /proc/sys/vm/drop_caches

执行完之后,再次查看内存剩余:

会发现内存被释放了,可用内存确实变为1.5G左右

  到这里内存就释放完了,现在drop_caches中的值为1,如果现在想让操作系统重新分配内存,那么设置drop_caches的值为0即可:

echo 0 > /proc/sys/vm/drop_caches

但是我走到这里报错,从0可以设置为1-3 ,但是不能设置为0了。一直没有找到原因,最后直接重启服务器了,然后开机之后自己恢复成0了。

所以命令慎用!!!

另外需要注意的是,在生产环境中的服务器我们不要频繁的去释放内存,只在必要时候清理内存即可,更重要的是我们应该从应用程序层面去优化内存的利用和释放,经常清理内存可能只是暂时屏蔽的应用程序中的一些bug,所以更重要的是程序的调优,其他的交给操作系统来管理

 Linux服务器运行一段时间后,由于其内存管理机制,会将暂时不用的内存转为buff/cache,这样在程序使用到这一部分数据时,能够很快的取出,从而提高系统的运行效率,所以这也正是linux内存管理中非常出色的一点,所以乍一看内存剩余的非常少,但是在程序真正需要内存空间时,linux会将缓存让出给程序使用,这样达到对内存的最充分利用,所以真正剩余的内存是free+buff/cache

  但是有些时候大量的缓存占据空间,这时候应用程序回去使用swap交换空间,从而使系统变慢,这时候需要手动去释放内存,释放内存的时候,首先执行命令 sync 将所有正在内存中的缓冲区写到磁盘中,其中包括已经修改的文件inode、已延迟的块I/O以及读写映射文件,从而确保文件系统的完整性

  说到清理内存,那么不得不提到/proc这一个虚拟文件系统,这里面的数据和文件都是内存中的实时数据,很多参数的获取都可以从下面相应的文件中得到,比如查看某一进程占用的内存大小和各项参数,cpu和主板的详细信息,显卡的参数等等;相应的关于内存的管理方式是在/proc/sys/vm/drop_chches文件中,一定要注意这个文件中存放的并不是具体的内存内容,而是0-3这几个数字,通过文件大小只有1B也可以知道,而这些代号分别告诉系统代表不同的含义如下:

  0:0是系统默认值,默认情况下表示不释放内存,由操作系统自动管理

  1:释放页缓存

  2:释放dentries和inodes

  3:释放所有缓存

  所以根据上面的说明,分别将1,2,3这3个数字重定向到drop_caches中可以实现内存的释放,一般释放内存都是重定向3到文件中

<think>我们有两个目标: 1. 在top命令的顶部汇总区域显示内存使用率百分比(即系统总内存使用率百分比) 2. 在进程列表中显示每个进程的内存使用百分比(%MEM列默认已有) 根据用户需求,主要是想调整输出格式以显示内存使用率的百分比,例如在内存行后面直接显示百分比(如13%)。但是,top命令默认并不在汇总行显示百分比,因此我们需要通过配置或外部命令来实现。 然而,top命令本身并不支持在内存行直接显示百分比。我们可以通过以下两种方式实现类似效果: ### 方法1:使用外部脚本处理top输出(推荐) 我们可以使用批处理模式运行top,然后使用awk等工具计算并添加百分比。 示例命令: ```bash top -b -n 1 | awk ' /KiB Mem/ || /MiB Mem/ || /GiB Mem/ { # 提取总内存和已用内存(注意单位可能不同,但数值部分我们只关心数字) # 在top输出中,内存行格式为:KiB Mem : 总内存 total, 空闲内存 free, 已用内存 used, 缓存内存 buff/cache # 注意:字段位置可能因top版本和单位不同而变化,这里以字段数定位 # 通常:$4是总内存,$6是已用内存(注意单位是KiB、MiB或GiB,但数值部分都是浮点数或整数) total = $4; used = $6; # 去掉单位后缀(如果有的话,但top输出中数字后面没有单位,单位在字段前,所以这里直接取数值) # 计算百分比 percent = (used / total) * 100; # 打印原始行,并追加百分比 printf "%s %.1f%%\n", $0, percent; next; } { print }' ``` 但是,这个脚本有一个问题:top命令的输出中,内存行可能有不同的字段数(例如,有时可能没有buff/cache,但现代top通常有)。因此,我们需要更健壮的版本。 ### 改进版脚本(考虑不同单位) ```bash top -b -n 1 | awk ' /^KiB Mem/ || /^MiB Mem/ || /^GiB Mem/ { # 从第4个字段开始,直到遇到逗号,这些字段组合起来是总内存(但实际第4个字段就是总内存的数值,第5个字段是单位?不,第5个字段是"total,") # 实际上,top输出内存行时,字段是固定的: # 例如:KiB Mem : 8155152 total, 167968 free, 1049880 used, 6937304 buff/cache # 字段:$1=$2=$3="KiB","Mem",":";$4="8155152";$5="total,";$6="167968";$7="free,";$8="1049880";$9="used,";$10="6937304";$11="buff/cache" # 所以,总内存是$4,已用内存是$8(注意:这里的位置可能因top版本不同而不同,特别是在不同单位下字段数一样) # 更通用的方法:遍历字段,找到"total,"前面的数字和"used,"前面的数字 total = 0; used = 0; for (i=1; i<=NF; i++) { if ($i == "total,") { total = $(i-1); } if ($i == "used,") { used = $(i-1); } } if (total > 0) { percent = (used / total) * 100; # 打印原始行,并在行尾添加百分比 printf "%s %.1f%%\n", $0, percent; } else { print $0; } next; } { print }' ``` ### 方法2:修改top的显示配置(无法直接添加百分比) top命令可以通过配置文件(~/.toprc)来定制显示,但是默认的配置选项并不支持在内存行添加百分比。因此,这种方法可能行不通。 ### 方法3:使用其他工具 - 使用`htop`:它默认以进度条形式显示内存使用率,更直观,但也不是在内存行后面直接显示百分比数字(不过进度条旁边有百分比数字)。 - 使用`free`命令:`free -m`可以显示总内存和已用内存,然后计算百分比。 例如: ```bash free -m | awk 'NR==2{printf "内存使用率: %.2f%%\n", ($3/$2)*100}' ``` ### 结论 由于top本身不支持在汇总行直接添加百分比,建议使用外部脚本处理top输出(如上述awk脚本)或使用其他命令(如free)来获取内存使用率百分比。 如果用户坚持要在top运行时实时显示内存使用率百分比,可以考虑将上述awk脚本封装成一个实时监控脚本,但这样就不是原生的top了。 ### 针对用户示例的调整 用户示例输出:`KiB Mem : 8155152 total, 167968 free, 1049880 used, 6937304 buff/cache 13%` 我们可以在top批处理模式输出后,通过管道用awk处理,将百分比添加到内存行后面。 ### 实际操作步骤 1. 创建一个脚本(如`topmem`): ```bash #!/bin/bash top -b -n 1 | awk ' /^KiB Mem/ || /^MiB Mem/ || /^GiB Mem/ { # 尝试提取总内存和已用内存 # 根据top输出,内存行格式:$1:单位(KiB/MiB/GiB); $2:"Mem"; $3=":"; 然后依次是 [数字] [total,], [数字] [free,], [数字] [used,], ... # 我们遍历每个字段,当遇到"total,"时,前一个字段就是总内存;当遇到"used,"时,前一个字段就是已用内存。 total = 0; used = 0; for (i=1; i<=NF; i++) { if ($i == "total,") { total = $(i-1); } if ($i == "used,") { used = $(i-1); } } if (total > 0) { # 计算百分比 percent = (used / total) * 100; # 输出原行,并在行尾添加百分比 printf "%s %.1f%%\n", $0, percent; } else { print $0; } next; } { print }' ``` 2. 赋予执行权限:`chmod +x topmem` 3. 运行:`./topmem` ### 注意事项 - 这个脚本只运行一次top(批处理模式),如果需要实时刷新,可以使用watch命令: ```bash watch -n 1 './topmem' ``` - 不同版本的top输出格式可能略有不同,需要根据实际情况调整awk脚本中的字段解析逻辑。 ### 替代方案:使用htop htop默认以更友好的方式显示内存使用情况,包括进度条和百分比数字。安装htop: ```bash # CentOS yum install htop # Ubuntu apt install htop ``` 在htop中,内存使用情况以进度条形式展示,并在右侧显示百分比数字,更加直观。 ### 回答用户 根据您的要求,调整top命令输出格式以在内存行显示百分比(如13%)需要借助外部脚本处理top的输出。以下是具体步骤: 1. 创建脚本`topmem`(内容如下): ```bash #!/bin/bash top -b -n 1 | awk ' /^KiB Mem/ || /^MiB Mem/ || /^GiB Mem/ { total = 0; used = 0; for (i=1; i<=NF; i++) { if ($i == "total,") total = $(i-1); if ($i == "used,") used = $(i-1); } if (total > 0) { percent = (used / total) * 100; printf "%s %.1f%%\n", $0, percent; } else { print $0; } next; } { print }' ``` 2. 赋予执行权限: ```bash chmod +x topmem ``` 3. 运行脚本: ```bash ./topmem ``` 示例输出: ``` KiB Mem : 8155152 total, 167968 free, 1049880 used, 6937304 buff/cache 12.9% ``` 4. 如需实时刷新,可结合`watch`命令: ```bash watch -n 1 ./topmem ``` ### 注意事项 - 脚本依赖top输出的特定格式,不同版本top可能需调整字段提取逻辑。 - 建议考虑使用`htop`工具,它默认显示内存百分比,更直观[^3]。 §§相关问题§§ 1. 如何让top命令按内存使用百分比排序? 2. 如何用free命令查看内存使用率? 3. htop工具如何安装和使用?</think>要配置 `top` 命令的输出格式以显示内存使用率的百分比(如 `13%`),可以通过以下两种方法实现: --- ### 方法一:使用批处理模式 + awk(实时计算百分比) ```bash top -b -n 1 | awk ' /KiB Mem|MiB Mem|GiB Mem/ { total = $4; # 总内存 used = $6; # 已用内存 percent = (used / total) * 100; printf "%s %.1f%%\n", $0, percent; next } { print } ' ``` **输出示例:** ``` KiB Mem : 8155152 total, 167968 free, 1049880 used, 6937304 buff/cache 12.9% ``` **参数说明:** - `-b`:批处理模式(适合脚本处理) - `-n 1`:只运行一次 - `awk`:提取内存行并计算百分比 --- ### 方法二:修改 `top` 配置文件(永久生效) 1. **运行 `top` 并进入配置模式:** ```bash top ``` 2. **按 <kbd>Shift</kbd> + <kbd>f</kbd> 进入字段管理界面** 3. **选择显示内存百分比列:** - 找到 `%MEM` 并按下空格键启用(行首出现 `*`) - 按 <kbd>q</kbd> 退出配置界面 4. **按 <kbd>W</kbd> 保存配置到 `~/.toprc`** **效果:** ``` PID USER %MEM %CPU TIME+ COMMAND 1234 app 12.3 6.5 10:20.11 java 5678 mysql 8.7 2.1 05:43.22 mysqld ``` > 此时 `%MEM` 列会永久显示每个进程的内存使用百分比[^1][^3]。 --- ### 关键说明 1. **系统级内存百分比**: - `top` 默认不在汇总行显示百分比,需通过 `awk` 计算(方法一) - 计算公式: $$ \text{内存使用率} = \left( \frac{\text{used}}{\text{total}} \right) \times 100\% $$ 2. **进程级内存百分比**: - 通过配置 `%MEM` 列显示(方法二),默认按 <kbd>Shift</kbd>+<kbd>M</kbd> 可按此列排序[^3] 3. **单位一致性**: - 在 `top` 运行时按 <kbd>E</kbd> 切换内存单位(KiB/MiB/GiB) - 确保 `awk` 中 `total` 和 `used` 单位一致 > 推荐使用 `htop`(安装命令:`sudo apt install htop`),它默认以进度条+百分比形式显示内存使用率[^3]。 --- ### 长期监控建议 ```bash # 每2秒刷新一次并显示内存百分比 watch -n 2 "free | awk '/Mem/{printf \"内存使用率: %.1f%%\\n\", \$3/\$2*100}'" ``` **输出:** ``` 内存使用率: 62.5% ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值