【linux】free 命令显示 swap 信息异常处理
文章目录
- 前言
- 问题原因:
- 为什么出现这么大的值?
- 为什么会发生 swap free 大于 swap total 的现象?
- 解决方案:
- 实践:
- 1. 启用交换分区
- 2. 增加交换分区使用频率
- 3. 编写一个内存代码 `munch.c`
- 4. 编译
- 5. 执行
- 6. 查看内存
- 7. 修改交换分区使用频率
- 总结:
- 错误:
- 参考:
前言
今天发现有台服务swap分区数据显示异常,使用free -g
命令查看内存使用情况,swap 的 used 远远超过 swap total 的值, free 的值也大于 total, 如下所示:
[root@dx-selk00 ~]# free -gtotal used free shared buffers cached
Mem: 125 125 0 0 0 40
-/+ buffers/cache: 83 42
Swap: 0 1717986918 3
可以看到交换分区使用明显是不正常的,并且使用swapon/swapoff
命令也并不能解决问题!
使用swapon -a
使用swapoff -a
可以看到使用swapon/swapoff
命令也并不能解决问题!
问题原因:
为什么出现这么大的值?
通过查看 free 命令的源代码说明: https://github.com/mmalecki/procps/
free.c 文件关于 swap 信息的代码:
22 #define S(X) ( ((unsigned long long)(X) << 10) >> shift)
...
...
38 int shift = 10;
...
...
100 printf(
101 "%-7s %10Lu %10Lu %10Lu\n", "Swap:",
102 S(kb_swap_total),
103 S(kb_swap_used),
104 S(kb_swap_free)
105 );
追踪 kb_swap_used 到 proc/sysinfo.c 文件的代码:
41 #define MEMINFO_FILE "/proc/meminfo"
...
589 FILE_TO_BUF(MEMINFO_FILE,meminfo_fd);
...
621 kb_swap_used = kb_swap_total - kb_swap_free;
622 kb_main_used = kb_main_total - kb_main_free;
从代码来看 free 命令是通过读取 /proc/meminfo 的信息来显示内存及 swap 的使用, 通过 free -m 函数可以看到 free 大于 total 的总量, 在这里的话 X 即为负数 -2752, 在宏定义函数 S 中, 将 X 强制转换为64位的无符号整形, 表达式 (unsigned long long) (X) 等效于 2^64 - 2752 , 计算出结果后左移 10 位再右移 10(shift 值) 位, 得出结果 18014398509479232.
为什么会发生 swap free 大于 swap total 的现象?
在 kernel-2.6.32-573.7.1 版本之前, 函数 get_swap_page 在加锁的过程中去掉了自旋锁 swap_lock, 这可能会引起 nr_swap_pages 检测异常使得 /proc/meminfo 记录失效的 swapfree 数值, 由此可能引起 swapfree 大于 swaptotal 的现象. 详见: RHBA-2015-1827.html bug 说明
- A previous change in the get_swap_page() locking removed the use of the
swap_lock spinlock. This could cause nr_swap_pages corruption and invalid
SwapFree information in the /proc/meminfo file, where the size of SwapFree could
exceed the size of SwapTotal. This update uses an atomic variable for
nr_swap_pages, and the size of SwapFree in /proc/meminfo is now correct.
(BZ#1259362)
解决方案:
上述问题的原因在于 kernel 方面的 bug 而引起, 所以要永久杜绝该现象可以升级内核到 2.6.32-573.7.1 版本, 重启后即可生效; 如果不升级 kernel 的话, 只是简单的 swapoff/swapon
是不能让结果正常显示的, 因为 swap 的使用未见变化。
- 临时解决方案: 重启
- 永久解决方案:升级内核
- 占用部分 swap 空间就可以使 free 显示正常
由于这台服务器上部署的服务比较多,切服务比较重要,索引重启机器和升级内核的方案不能使用。于是选择使用第三种方案:
实践:
1. 启用交换分区
因为我们需要占用部分 swap 空间,所以第一步打开交换分区。
swapon -a
2. 增加交换分区使用频率
增加交换分区的使用频繁,这样使我们的内存程序能够更好的使用交换分区的空间。
echo 60 > /proc/sys/vm/swappiness
3. 编写一个内存代码 munch.c
代码的功能是会尽可能多地占用内存,或者达到指定的限制
vim /tmp/munch.c
代码内容如下:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>int main(int argc, char** argv) {int max = -1;int mb = 0;char* buffer;if(argc > 1)max = atoi(argv[1]);while((buffer=malloc(1024*1024)) != NULL && mb != max) {memset(buffer, 0, 1024*1024);mb++;printf("Allocated %d MB\n", mb);}return 0;
}
4. 编译
编译c程序
gcc munch.c -o munch
5. 执行
./munch 或者./munch 60000
这块根据自己的服务器配置来写,我这里让程序去占用60G内存,这样可能用到swap 分区。
6. 查看内存
这里建议开启两个终端窗口,一个用来执行代码,一个用来查看内存情况。
free -g
可以看到swap分区已经显示正常了。
7. 修改交换分区使用频率
echo 1 > /proc/sys/vm/swappiness
这里有个注意点,当swap分区显示正常后,如果我们再次关闭交换分区,那个这个异常问题还是会复现,所以在这里就不关闭交换分区了,只是调小交换分区的使用频繁。
总结:
在内存急速被占尽的情况下, 由于旧版本 kernel 的函数处理可能会引起该问题的发生, 进而造成 /proc/meminfo 数据信息的异常, 最后导致 free 命令的错误. 如果要杜绝该现象, 需要将 kernel 升级到 kernel-2.6.32-573.7.1 版本. 另外也应该尽量避免运行急速消耗内存的进程.
错误:
问题一:
在编译c程序时,报gcc commands not found。
出现以上问题的原因是系统没有安装gcc编译器所以需要安装,可以使用yum源进行安装;
yum -y install gcc+ gcc-c++
参考:
https://blog.arstercz.com/free-%E5%91%BD%E4%BB%A4%E6%98%BE%E7%A4%BA-swap-%E4%BF%A1%E6%81%AF%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86/
https://www.linuxatemyram.com/play.html
【linux】free 命令显示 swap 信息异常处理相关推荐
- linux系统周几的格式是,linux cal命令显示日历信息周几天数差
cal显示日历信息 功能描述: 使用cal命令可以显示计算机系统的日历 命令语法: cal[选项][月[年]] cal命令选项含义 选项含义 -j显示出给定月中的每一天是一年中的第几天(从1月1日算起 ...
- linux lsattr命令: 显示文件属性
linux lsattr命令: 显示文件属性 介绍: 文件属性在文件系统的安全管理方面起很重要的作用,linux下lsattr命令用于查看文件属性信息. 语法: lsattr [-adRvV] [文件 ...
- 【linux命令】Linux du 命令(显示目录或文件的大小)
文章目录 1. Linux du 命令 2. 语法: 3. 实例 3.1 显示目录或者文件所占空间 3.2 显示指定文件所占空间 3.3 方便阅读的格式显示test目录所占空间情况 3.3.1 列出超 ...
- linux tree命令源码,[转帖]linux tree命令--显示目录的树形结构
linux tree命令--显示目录的树形结构 版权声明:iamqilei@qq.com https://blog.csdn.net/u011729865/article/details/533684 ...
- linux id 命令 显示用户id和组id信息
Linux id命令用于显示用户的ID,以及所属群组的ID. id会显示用户以及所属群组的实际与有效ID.若两个ID相同,则仅显示实际ID.若仅指定用户名称,则显示目前用户的ID. 语法 id [-g ...
- Linux TOP 命令显示详情
2019独角兽企业重金招聘Python工程师标准>>> TOP: 当前时间 系统已运行的时间 当前登录用户的数量 相应最近5.10和15分钟内的平均负载 可以使用'l'命令切换upt ...
- linux free 命令 显示内存使用情况
free 命令显示系统内存的使用情况,包括物理内存.交换内存(swap)和内核缓冲区内存. 如果加上 -h 选项,输出的结果会友好很多: 有时我们需要持续的观察内存的状况,此时可以使用 -s 选项并指 ...
- Linux中top显示的信息详解
一.信息显示 Linux系统可以通过top命令查看系统的CPU.内存.运行时间.交换分区.执行的线程等信息.通过top命令可以有效的发现系统的缺陷出在哪里.是内存不够.CPU处理能力不够.IO读写过高 ...
- linux命令作为子进程标记,Linux基础命令---显示进程ps
ps ps指令可以显示系统中当前进程的信息,它的输出结果是高度可定制的.如果您希望重复更新所选内容和显示的信息,请使用top(1)代替. 请注意,"ps-aux"与"ps ...
最新文章
- 数字签名与数字证书是什么
- js网页如何获取手机屏幕宽度
- Bash Shell学习笔记一
- 将DataTable的内容以EXCEl的形式导出到本地
- python 类中方法总结 --- 实例方法、类方法、静态方法
- CAN 总线嵌入式驱动编程
- 常用头文件的可调用函数的归类笔记
- Wijmo 5 与Breeze 的组合,及与METRONIC 的集成
- jQuery实现button按钮提交表单
- 牛顿插值法 matlab程序计算方法,(最新整理)牛顿插值法matlab程序
- SpringBoot+OCR 实现图片文字识别
- 思维导图组件@hellowuxin/mindmap的基本使用
- 关于谷歌浏览器请求action两次
- 卫星定位原理以及室内定位技术
- pdf文档转换后出现大量乱码怎么办
- 【转】学习巴菲特投资思想的经典书籍
- 数据结构之算法(二叉排序树的查找分析)
- ❤️软件设计师之程序设计语言与语言处理程序基础“小总结”(莽起来)❤️
- windows核心宝藏
- Qt+VTK+OCCT读取IGES/STEP模型