内存和swap的查看 和脚本


内存的查看可以是 free    top等

free    查看系统的全部内存使用情况

top     可以查看全部使用情况和单个程序的消耗




free

  常用参数

b 以字节为单位显示。

-k 以K字节为单位显示。默认显示。

-m 以兆字节为单位显示。

-s 每隔多少秒重复执行。可编写一个脚本用于监控。


显示的状态如下:

wKioL1YvIefghnr9AACHOBkYzCU093.jpg

其中:

第一行 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的参数就不说了 现在说下与内存相关的东西:

wKioL1YvKGjzZSTUAASR2Y33lpk206.jpg


其中 

 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"