内存和swap的查看 和脚本
内存的查看可以是 free top等
free 查看系统的全部内存使用情况
top 可以查看全部使用情况和单个程序的消耗
free
常用参数
b 以字节为单位显示。
-k 以K字节为单位显示。默认显示。
-m 以兆字节为单位显示。
-s 每隔多少秒重复执行。可编写一个脚本用于监控。
显示的状态如下:
其中:
第一行 total 995 指服务器的总内存的大小
used 923 指已经分配的内存的大小 (包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用。
free 71 指未分配的内存。
shared 0 指共享内存的大小,一般系统不会用到。
buffers 202 指系统分配但未被使用的buffers 数量。
cached 417 指系统分配但未被使用的cached数量
第二行
-/+ buffers/cache的意思:
-buffers/cache 的内存数: 303 (等于第1行的 used - buffers - cached)
+buffers/cache 的内存数: 691 (等于第1行的 free + buffers + cached)
注:此处的内存数在用上面式子计算后,在大小上有一点点出入(还不知道是什么原因)。
可见-buffers/cache反映的是被程序实实在在吃掉的内存,而+buffers/cache反映的是可以挪用的内存总数。
buffers与cached的区别:
buffers是用来给块设备做的缓冲大小,他只记录文件系统的metadata以及 tracking in-flight pages。
cached用来给文件做缓冲。
即:buffers是用来存储目录里面有什么内容,权限等等,而cached用来记忆我们打开的文件.
第三行
swap的使用情况 当swap使用的较多的时候证明内存不够用,跟虚拟内存频繁交换。
对于 第一部分(Mem)与第二部分(-/+ buffers/cache)
其实我们可以从二个方面来解释.
对操作系统来讲是Mem的参数.buffers/cached 都是属于被使用,所以它认为free只有71.
对应用程序来讲是(-/+ buffers/cach).buffers/cached 是等同可用的,因为buffer/cached是为了提高程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。
所以,以应用来看看,以(-/+buffers/cache)的free和used为主.所以我们看这个就好了.另外告诉大家一些常识.Linux为了提高磁盘和内存存取效率,Linux做了很多精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换),还采取了两种主要Cache方式:Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache能有效缩短了I/O系统调用(比如read,write,getdents)的时间。
记住内存是拿来用的,不是拿来看的.不像windows,无论你的真实物理内存有多少,他都要拿硬盘交换文件来读.这也就是windows为什么常常提示虚拟空间不足的原因.你们想想,多无聊,在内存还有大部分的时候,拿出一部分硬盘空间来充当内存.硬盘怎么会快过内存.所以,我们看linux,只要不用swap的交换空间,就不用担心自己的内存太少.如果常常swap用很多,可能你就要考虑加物理内存了.这也是linux看内存是否够用的标准哦.
top
top的参数就不说了 现在说下与内存相关的东西:
其中
VIRT 是分配内存的大小,并不是真实使用的大小
RES 是真正使用的内存的大小,是真实使用的
下面是查看内存 swap 的脚本
#!/bin/bash
###############################################################################
# 日期 : 2015-09-10
# 作者 : wangtenghe
# Email : secure1@sina.com
# 版本 : 2.0
# 脚本功能 : 列出正在占用swap的进程。
# 调用关系 :
# 其他说明 :
###############################################################################
echo -e "PID\t\tSwap\t\tProc_Name"
for pid in `ls -l /proc | grep ^d | awk '{ print $9 }'| grep -v [^0-9]`
do
if [ $pid -eq 1 ];then continue;fi # Do not check init process
grep -q "Swap" /proc/$pid/smaps 2>/dev/null
if [ $? -eq 0 ];then
swap=$(gawk '/Swap/{ sum+=$2;} END{ print sum }' /proc/$pid/smaps)
proc_name=$(ps aux | grep -w "$pid" | awk '!/grep/{ for(i=11;i<=NF;i++){ printf("%s ",$i); }}')
if [ $swap -gt 0 ];then
echo -e "$pid\t${swap}\t$proc_name"
fi
fi
done | sort -k2 -n | gawk -F'\t' '{
if($2<1024)
printf("%-10s\t%15sKB\t%s\n",$1,$2,$3);
else if($2<1048576)
printf("%-10s\t%15.2fMB\t%s\n",$1,$2/1024,$3);
else
printf("%-10s\t%15.2fGB\t%s\n",$1,$2/1048576,$3);
}'
#! /bin/bash
#!/bin/bash
###############################################################################
# 日期 : 2015-09-14
# 作者 : wangtenghe
# Email : secure1@sina.com
# 版本 :1.0
# 脚本功能 : 列出正在内存和cpu使用率的大小、PID和程序
# 调用关系 :
# 其他说明 :
###############################################################################
ps -aux | awk '$3>0 || $6>0{print}'|sort -k6 -n | awk '!/\$/{
if($6<1024)
printf("%-10s\t%10s%15.2fKB\t%s%s%s%s%s\n",$2,$3,$6,$11" ",$12" ",$13" ",$14" ",$15);
else if($6<1048576)
printf("%-10s\t%10s%15.2fMB\t%s%s%s%s%s\n",$2,$3,$6/1024,$11" ",$12" ",$13" ",$14" ",$15);
else
printf("%-10s\t%10s%15.2fGB\t%s%s%s%s%s\n",$2,$3,$6/1048576,$11" ",$12" ",$13" ",$14" ",$15);
fi
}'
echo -e "PID\t\t\tCPU%\t\tMEM\tProc_Name"