Linux命令详解-free

显示全文:

相信运维工程师,在linux系统环境中最容易遇到的问题就是各种IO瓶颈,内存使用率高,cpu使用率高等问题,我们如何来定位错误?linux提供了很多命令来协助我们快速定位到错误,这里先介绍下free命令

1,free 命令解释:

[root@www ~]# free 
                  1          2          3          4           5         6 
1                 total       used       free      shared        buffers   cached
2    Mem:       1906552     430788    1475764       0          60164     226684
3    -/+ buffers/cache:     143940    1762612
4    Swap:      2097144       0       2097144

参数:

usage: free [-b|-k|-m|-g] [-l] [-o] [-t] [-s delay] [-c count] [-V]
  -b,-k,-m,-g show output in Bytes, KB, MB, or GB  用来指定输出的单位。
  -l show detailed low and high memory statistics   可以看到详细的最大最小值
  -o use old format (no -/+buffers/cache line)       以老的格式显示,没有-/+buffers/cache line那一行
  -t display total for RAM + swap        :会显示内存的总和,包括物理内存和swap分区大小。
  -s update every [delay] seconds     : 输出结果每秒刷新一次
  -c update [count] times     :刷新次数
  -V display version information and exit   :显示版本信息。

接着介绍下free命令输出的各个参数:

MEM:
    total:总计物理内存大小
    used:已经使用的物理内存大小
    free: 空闲的物理内存大小
    shared:多个进程共享的内存空间
    buffer:缓冲
    cache:缓存

这里详细介绍下buffer和cache,因为面试过程中,很容易问到这两者之间的区别。

buffer缓冲区: 将数据缓冲下来,解决速度慢和快的交接;速度快的需要通过缓冲区将数据一点一点传给速度慢的区域。例如:从内存中将数据往硬盘中写入,并不是直接写入,而是缓冲到一定大小之后刷入硬盘中。

cached缓存:实现数据的重复使用,速度慢的需要通过缓存将经常要用到的数据缓存起来,缓存下来的数据可以提供高速的传输给速度快的设备。例如:将硬盘中的数据读取出来放在内存的缓存区中,这样以后再次访问同一个资源,速度回快很多。

这两个参数主要是为了提高IO的性能,性能调优,会涉及这两个参数的修改。

例如在之前内核那篇blog中提到我们可以通过修改内核参数清空buffer。
主要是和/proc/sys/vm/drop_caches那个内核参数有关

在Documentation/sysctl/vm.txt中有如下描述:

drop_caches
Writing to this will cause the kernel to drop clean caches, dentries and inodes from memory, causing that memory to become free.
To free pagecache:                              清空buffer
 echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes:      
 echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:  
 echo 3 > /proc/sys/vm/drop_caches    清空cache
As this is a non-destructive operation and dirty objects are not freeable, the user should run `sync' first.
在清空buffer和cache之前我们最好先进行sync将内存中的数据(特别是修改过的数据同步到磁盘中,防止改动没有改动就清空掉)

free命令输出第三行:

-/+ buffers/cache: 代表的是两个参数:- buffers/cache和+ buffers/cache
注意,buffer和cache是用来提高IO性能的,当应用程序需要新的内存空间的时候也会把buffer,cache回收。

- buffers/cache :表示一个应用程序认为系统被用掉多少内存。这个值是通过MEM已经使用的总值减去buffer和cache所占用的值。
例如:143940=430788(used) - 60164(buffer) - 226684(cached)

+ buffers/cache :表示一个应用程序认为系统还有多少内存。这个值时MEM的空闲free加上buffer和cache。
例如: 1762612 = 1475764(free) + 60164(buffer) + 226684(cached)

free命令输出第四行:是关于swap分区的。

total:总大小
used:已经使用的
free:空闲的

正常情况下,swap分区是不会被使用的。只有物理内存被使用完之后才会使用swap分区。

简单介绍下swap分区:

内存不够用的时候,从硬盘上找一部分空间,将内存中最近最少使用的数据挪到硬盘的空间里。这段在硬盘中的空间就是swap分区。
交换空间(swap):允许内存过载(超出本身内存空间)使用;不过会影响系统性能,一般用于应急。
page in , page out
swap out swap in 上下对应
交换分区最好放在最外面的磁道上,这样性能还有所提升;

添加交换分区:

步骤:

*    1),新建分区  fdisk。
*    2),使用L ;设置文件系统分类;
    t调整分区类型;82(千万不能忘了;)
    w保存退出
*    3,)partprobe  内存分区读取
*    4,)创建交换分区:
    mkswap  /dev/sda8:格式化为交换分区;
    或      -L   LABEL指定卷标;
*    5)交换分区的使用:,swapon   /dev/sda8   :启用交换分区上的交换空间
    swapoff    /dev/sda8  关闭;
    swapon    -a   启用所有的定义在/etc/fstab文件中交换设备;
    mount挂载的文件系统,在我们重启开机的时候就不再存在了。有些能自动挂载,有些不能。这就是fstab文件的功能;

特殊场景:

假如磁盘上已经没有空间创建新的分区了,但是某个分区里已经挂载的位置还有很多空间可以使用,我们急着在当前系统上创建swap分区;在当前系统上怎么应急:

**回环设备**:loopback:使用软件来模拟实现硬件;

创建一个镜像文件,假如1G空间,可以将它当做硬盘来用,模拟存储空间:
*    1),dd  if=/dev/zero  of=/var/swapfile  bs=1M  count=1024 创建一个大小为1024M
的镜像文件;
*    2)mkswap   /var/swapfile  创建一个swap类型文件;
*    3),swapon  /var/swapfile   启用
    free   -m  查看