1.不同操作系统提取内存信息注意点
-
不同操作系统要注意free -m提取内存信息的区别:
上面是Centos 7:内存使用了339M,还剩下15G,看available
下面是Centos 6:内存使用了770M,还剩余15G。因为Linux会将内存作为文件的缓存使用,15912并不是程序进程真正使用的内存,而是作为inode缓存使用
-
脏页、页缓存、硬盘数据的关系
小数据块称为blocksize,也叫page内存页x86的页缓存大小为4k,无论是从磁盘中读还是写数据,都会将其加载到内存页中,写完以后,一页不够,可能需要很多页,这些页就称为脏页,修改的数据发生在内存中,需要持久化到磁盘中去保存(也就是写脏页的过程)
-
因为需要配合zabbix,所以会写成这样的函数
#!/bin/bash
MemTotal()
{
awk '/^MemTotal/{print $2}' /proc/meminfo
}
MemFree()
{
awk '/^MemFree/{print $2}' /proc/meminfo
}
Dirty()
{
awk '/^Dirty/{print $2}' /proc/meminfo
}
Buffers()
{
awk '/^Buffers/{print $2}' /proc/meminfo
}
$1
执行./memory.sh MemFree
- watch -n.5
每隔5s看一次
watch -n.5 grep 'Dirty' /proc/meminfo
- 结合脏页的概念看cp指令的执行过程
cp表示将数据从硬盘中读取到内存中这些页上,然后copy到内存中的另一些页上去,最后将这些数据持久化到硬盘中去。
cp命令结束仅仅代表:将内存中的一块脏页拷贝到另一个脏页中去
磁盘写入是异步的,sync表示:立刻将脏页写到硬盘中(刷脏页),sync结束表示数据持久化(持久化表示数据掉电不丢失)到硬盘中去了
2. 手工释放linux内存
[root@testserver ~]# uname -a
Linux testserver 2.6.18-164.el5 #1 SMP Thu Sep 3 03:28:30 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux
[root@testserver ~]# free -m
total used free shared buffers cached
Mem: 2013 1661 352 0 223 1206
-/+ buffers/cache: 231 1782
Swap: 2047 0 2047
[root@testserver ~]# sync
[root@testserver ~]# sync
[root@testserver ~]# cat /proc/sys/vm/drop_caches 0
[root@testserver ~]# echo 3 > /proc/sys/vm/drop_caches
[root@testserver ~]# cat /proc/sys/vm/drop_caches 3
[root@testserver ~]# free -m
total used free shared buffers cached
Mem: 2013 100 1913 0 0 14
-/+ buffers/cache: 85 1927
Swap: 2047 0 2047
[root@testserver ~]# 测试成功
参考:手工释放linux内存——/proc/sys/vm/drop_caches
3.Linux中的空闲内存与已使用的内存
- 如何运行 free
不带选项运行会显示一个以KB为单位的默认输出。
Mem:表示物理内存统计
-/+ buffers/cached:表示物理内存的缓存统计
Swap:表示硬盘上交换分区的使用情况
第一行:
Total(全部) : 1026740 表示物理内存总量
Used(已用) : 843396 表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用
Free(可用) : 183344 未被分配的内存
Shared(共享) : 0 共享内存,一般系统不会用到,这里也不讨论。
Buffers(块设备缓存区) : 52704 系统分配但未被使用的buffers 数量
Cached(文件缓存) : 376384 系统分配但未被使用的cache 数量
buffers是指用来给块设备做的缓冲大小,他只记录文件系统的metadata以及 tracking in-flight pages.
cached是用来给文件做缓冲。
那就是说:buffers是用来存储,目录里面有什么内容,权限等等。而cached直接用来记忆我们打开的文件
第二行: -/+ buffers/cached
used:也就是第一行中的used - buffers-cached 也是实际使用的内存总量。
free:未被使用的buffers 与cached 和未被分配的内存之和,这就是系统当前实际可用内存=free+buffers+cached
因为buffers和cached是系统为了提高性能申请的内存数,实际上当应用程序需要此功能时,是可以使用这些内存的,
所以对应用程序来说,这些内存也是可以使用的。
第三行
Swap (以KB计)
Total(全部) : 1045500
Used(已用) : 3376 显示使用量
Free(可用) : 1042124 有多少空闲的交换区
当你看见 buffer/cache 的空闲空间低或者 swap 的空闲空间低,说明内存需要升级了。这意味这内存利用率很高。
请注意 shared(共享)内存列应该被忽略 ,因为它已经被废弃了。
-
/proc/meminfo文件分析:参考,
4.shell log
function log()
{
local contend="$(date '+%Y-%m-%d %H:%M:%S') $@"
echo -e "\033[32m" "${contend}" "\033[0m"
}
more:挺好用 ! shell脚本日志技巧