linux 查看内存使用率 free -m 详解

今天top linux看了下内存占用率,看的有点儿迷糊,服务器压力不大,内存占用可不少,对此研究了一番。

Tasks: 131 total,   1 running, 130 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4138480k total,  3368264k used,   770216k free,   156800k buffers
Swap: 10241428k total,        0k used, 10241428k free,  2783368k cached
我是4G的内存,使用了3个多G,很费解,接着free看看。

[root@emos ~]# free -m
total       used       free     shared    buffers     cached
Mem:                       4041       3288      752          0           153          2718
-/+ buffers/cache:                 417       3623
Swap:                       10001        0        10001

蓝色部分:

total 内存总数: 4041M;
used 已经使用的内存数: 3288M;
free  空闲的内存数: 752M
shared 不同进程间用来进行数据交换,一般都是0(多个进程共享的内存总额)
buffers 是由各种进程分配的,被用在如输入队列等方面,一个简单的例子如某个进程要求有多个字段读入,在所有字段被读入完整之前,进程把先前读入的字段放在buffer中保存。: 153M
cached 经常被用在磁盘的I/O请求上,如果有多个进程都要访问某个文件,于是该文件便被做成cache以方便下次被访问,这样可提供系统性能。:2718M

绿色部分:

(-buffers/cache) used内存数:417M (指的第一部分Mem行中的used – buffers – cached)
( buffers/cache) free内存数: 3623M (指的第一部分Mem行中的free buffers cached)

黄色部分:

交换分区,就不说了,自己也会明白。

我们可能会纳闷儿,蓝色部分(Mem)与绿色部分(-/+ buffers/cache)的结果中,有关used和free为什么这么奇怪?我们可以从二个方面来解释:
对操作系统来讲是Mem的参数buffers和cached 都是属于被使用,它认为free只有752M。
对应用程序来讲是(-/+ buffers/cach),buffers和cached 是等同可用的,buffer和cached是为了提高程序执行的性能,当程序使用内存时,buffer和cached会很快地被使用。

以应用来看看,以(-/+ buffers/cache)的free和used为主.我们看这个就好了.Linux为了提高磁盘和内存存取效率, 开发人员做了很多精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:Buffer Cache和Page Cache.前者针对磁盘块的读写,后者针对文件inode的读写.这些Cache能有效缩短了 I/O系统调用(比如read,write,getdents)的时间.

内存是拿来用的,不是拿来看的。不像windows,无论你的真实物理内存有多少,他都要拿硬盘交换文件来读。这也就是windows为什么有时会提示虚拟空间不足的原因。在内存还有大部分的时候,拿出一部分硬盘空间来充当内存,硬盘怎么会快过内存?我们看linux,只要不用swap的交换空间,就不用担心自己的内存太少.如果常常swap用很多,可能你就要考虑加物理内存了,这也是linux看内存是否够用的标准。

那么有人说过段时间linux会自动释放掉所用的内存,我们使用free再来试试,看看是否有释放:

[root@emos ~]# free -m
total        used       free      shared    buffers     cached
Mem:                         4041       3288        752          0            153          2718
-/+ buffers/cache:                    417        3623
Swap:                        10001         0        10001

没有任何变化,那么我们就需要手动释放内存。

/proc是一个虚拟文件系统,我们可以通过对它的读写操作做为与kernel实体间进行通信的一种手段,也就是说可以通过修改/proc中的文件来对当前kernel的行为做出调整。我们可以通过调整/proc/sys/vm/drop_caches来释放内存:

[root@emos ~]# cat /proc/sys/vm/drop_caches   //默认为0
0
[root@emos ~]# sync   //sync 命令运行 sync 子例程。如果必须停止系统,则运行 sync 命令以确保文件系统的完整性。sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件)
[root@emos ~]# echo 3 > /proc/sys/vm/drop_caches
[root@emos ~]# free -m
total       used       free     shared    buffers     cached
Mem:          4041        381       3659          0          0         18    //cached被释放
-/+ buffers/cache:        362       3678
Swap:        10001          0      10001
[root@emos ~]# cat /proc/sys/vm/drop_caches     //再次查看内核参数变为3了。
3
有效的释放了buffer和cache

有关/proc/sys/vm/drop_caches的用法:

/proc/sys/vm/drop_caches (since Linux 2.6.16)

Writing  to  this  file  causes the kernel to drop clean caches,dentries and inodes from memory, causing that memory  to  becomefree.

To free pagecache,  use  echo 1 > /proc/sys/vm/drop_caches;
To free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches;
To free pagecache, dentries and inodes, use echo 3  >/proc/sys/vm/drop_caches.Because this is a non-destructive operation  and  dirty  objects

buffer 与cache 的区别
A buffer is something that has yet to be “written” to disk.
A cache is something that has been “read” from the disk and stored for later use.
更详细的解释参考:Difference Between Buffer and Cache
对于共享内存(Shared memory),主要用于在UNIX 环境下不同进程之间共享数据,是进程间通信的一种方法,一般的应用程序不会申请使用共享内存,如果你有兴趣,请参考:What is Shared Memory?
cache 和 buffer的区别:
Cache: 高速缓存,是位于CPU与主内存间的一种容量较小但速度很高的存储器。由于CPU的速度远高于主内存,CPU直接从内存中存取数据要等待一定时间周期,Cache中保存着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据时可从Cache中直接调用,这样就减少了CPU的等待时间,提高了系统的效率。Cache又分为一级Cache(L1 Cache)和二级Cache(L2 Cache),L1 Cache集成在CPU内部,L2 Cache早期一般是焊在主板上,现在也都集成在CPU内部,常见的容量有256KB或512KB L2 Cache。
Buffer:缓冲区,一个用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据时,速度快的设备的操作进程不发生间断。
Free中的buffer和cache:(它们都是占用内存):
buffer: 作为buffer cache的内存,是块设备的读写缓冲区
cache: 作为page cache的内存, 文件系统的cache
如果 cache 的值很大,说明cache住的文件数很多。如果频繁访问到的文件都能被cache住,那么磁盘的IO会非常小。
Buffer和Cache的区别
缓存(cached)是把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就无需去读硬盘了,若没有命中就读硬盘。其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不再读的内容不断往后排,直至从中删除。
缓冲(buffers)是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。linux有一个守护进程定期清空缓冲内容(即写如磁盘),也可以通过sync命令手动清空缓冲。

关闭系统默认共享

安装微软原版系统之后,系统会存在几个默认的共享,视为潜在的安全隐患。传说中的IPC入侵就是这个原理

(命令提示符键入:net share查看)

共享名       资源                            注解

——————————————————————————-
C$           C:\                             默认共享
D$           D:\                             默认共享
E$           E:\                             默认共享
IPC$                                         远程 IPC
ADMIN$       C:\Windows                      远程管理
命令成功完成。

关闭此共享可进一步提高系统的安全性。

关闭后的效果:

共享名       资源                            注解

——————————————————————————-
IPC$                                         远程 IPC
命令成功完成。

适用于:xp/win7/server 2003/server2008 及R2

将以下代码保存到记事本中,修改拓展名为*.reg 双击导入即可关闭系统的默认共享。

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters]
“AutoShareServer”=dword:00000000
“AutoSharewks”=dword:00000000

重启系统生效。

redhat 安装ntfs-3g 支持NTFS读写

下载第三方软件包 ntfs-3g:
http://www.tuxera.com/community/ntfs-3g-download/
安装gcc、gcc-c++所需的编译环境
[root@NQ ntfs-3g-2011.1.15]# ./configure
[root@NQ ntfs-3g-2011.1.15]# make
[root@NQ ntfs-3g-2011.1.15]# make install
[root@NQ ntfs-3g-2011.1.15]# whereis ntfs-3g
ntfs-3g: /bin/ntfs-3g /usr/local/bin/ntfs-3g.secaudit /usr/local/bin/ntfs-3g.usermap /usr/local/bin/ntfs-3g.probe
[root@NQ ntfs-3g-2011.1.15]#
可以看到命令的位置,现在就来挂在NTFS分区
看一下我硬盘分区情况
Disk /dev/sda: 160.0 GB, 160041885696 bytes
255 heads, 63 sectors/track, 19457 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1        6375    51200000    7  HPFS/NTFS
/dev/sda2            6375       12749    51200000    7  HPFS/NTFS
/dev/sda3           12749       19457    53886976    7  HPFS/NTFS
[root@NQ sda3]#
[root@NQ sda3]# /bin/ntfs-3g /dev/sda3 /mnt/move/sda3/
OK~

linux 下的ps命令参数

%CPU 进程的cpu占用率
%MEM 进程的内存占用率
VSZ 进程所使用的虚存的大小
RSS 进程使用的驻留集大小或者是实际内存的大小
TTY 与进程关联的终端(tty)
STAT 检查的状态:进程状态使用字符表示的,如R(running正在运行或准备运行)、S(sleeping睡眠)、I(idle空闲)、Z (僵死)、D(不可中断的睡眠,通常是I/O)、P(等待交换页)、W(换出,表示当前页面不在内存)、N(低优先级任务)T(terminate终止)、W has no resident pages

START (进程启动时间和日期)
TIME ;(进程使用的总cpu时间)
COMMAND (正在执行的命令行命令)
NI (nice)优先级
PRI 进程优先级编号
PPID 父进程的进程ID(parent process id)
SID 会话ID(session id)
WCHAN 进程正在睡眠的内核函数名称;该函数的名称是从/root/system.map文件中获得的。
FLAGS 与进程相关的数字标识

常用参数
-A 显示所有进程(等价于-e)(utility)
-a 显示一个终端的所有进程,除了会话引线
-N 忽略选择。
-d 显示所有进程,但省略所有的会话引线(utility)
-x 显示没有控制终端的进程,同时显示各个命令的具体路径。dx不可合用。(utility)
-p pid 进程使用cpu的时间
-u uid or username 选择有效的用户id或者是用户名
-g gid or groupname 显示组的所有进程。
U username 显示该用户下的所有进程,且显示各个命令的详细路径。如:ps U zhang;(utility)
-f 全部列出,通常和其他选项联用。如:ps -fa or ps -fx and so on.
-l 长格式(有F,wchan,C 等字段)
-j 作业格式
-o 用户自定义格式。
v 以虚拟存储器格式显示
s 以信号格式显示
-m 显示所有的线程
-H 显示进程的层次(和其它的命令合用,如:ps -Ha)(utility)
e 命令之后显示环境(如:ps -d e; ps -a e)(utility)
h 不显示第一行

Linux 任务计划 crond 命令用法

crond 是Linux用来定期执行程序的命令。当安装完成操作系统之后,默认便会启动此任务调度命令。crond命令每分钟会定期检查是否有要执行的工作,如果有 要执行的工作便会自动执行该工作。而Linux任务调度的工作主要分为以下两类:

  1、系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存

  2、个人执行的工作:某个用户定期要做的工作,例如每隔10分钟检查邮件服务器是 否有新信,这些工作可由每个用户自行设置

  Crontab是UNIX系统下的定时任务触发器,其使用者的权限记载在下列两个 文件中:

  文件 含义

  /etc/cron.deny 该文件中所列的用户不允许使用Crontab命令

  /etc/cron.allow 该文件中所列的用户允许使用Crontab命令

  /var/spool/cron/ 是所有用户的crontab文件

  /var/spool/cron/crontabs /var/spool/cron/crontabs

  Crontab命令的格式为:crontab –l|-r|-e|-i [username],其参数含义如表一:

  参数名称 含义 示例

  -l 显示用户的Crontab文件的内容 crontabl –l

  -i 删除用户的Crontab文件前给提示 crontabl -ri

  -r 从Crontab目录中删除用户的Crontab文件 crontabl -r

  -e 编辑用户的Crontab文件 crontabl -e

  用户所建立的Crontab文件存于/var/spool/cron中,其文件名 与用户名一致。

  它的格式共分为六段,前五段为时间设定段,第六段为所要执行的命令段,

  格式如下:* * * * * <command>

  其时间段的含义如表二:

  段 含义 取值范围

  第一段 代表分钟 0—59

  第二段 代表小时 0—23

  第三段 代表日期 1—31

  第四段 代表月份 1—12

  第五段 代表星期几,0代表星期日 0—6

 例:如果用户的Crontab文件的内容是:29 19 * * * echo its dinner time,则系统每天的19:29显示‘its dinner time’

  示例(创建一个cron全过程,每分钟都会在test.txt里输入当前时间):

  1. 以普通用户登录linux系统(我用的是CentOS4.1)

  2. $crontab –e

  说明:系统默认的编辑器是VIM,如果不是请加上以下shell:

  $EDITOR=vi

  $export EDITOR

  3. 输入”*/1 * * * * date >> $HOME/test.txt”,save and exit VIM

  4. $su root

  5. $cd /etc/init.d

  6. ./crond restart

  下面看看看几个具体的例子:

  ● 0 */2 * * * /sbin/service httpd restart 意思是每两个小时重启一次apache

  ● 50 7 * * * /sbin/service sshd start 意思是每天7:50开启ssh服务

  ● 50 22 * * * /sbin/service sshd stop 意思是每天22:50关闭ssh服务

  ● 0 0 1,15 * * fsck /home 每月1号和15号检查/home 磁盘

  ● 1 * * * * /home/bruce/backup 每小时的第一分执行 /home/bruce/backup这个文件

  ● 00 03 * * 1-5 find /home “*.xxx” -mtime 4 -exec rm {} \; 每周一至周五3点钟,在目录/home中,查找文件名为*.xxx的文件,并删除4天前的文件。

  ● 30 6 */10 * * ls 意思是每月的1、11、21、31日是的6:30执行一次ls命令。

          * 1 * * * /usr/sbin/ntpdate 192.168.10.10   每天晚上1点,与192.168.10.10 进行时间同步