Linux进程分析之内存

2016/12/11 posted in  Linux

free命令解析

free命令可以用来了解当前操作系统整体可用内存的使用情况

详解

  • 看看free支持的参数
hushiwei@hsw:~$ free --help

Usage:
 free [options]

Options:
 -b, --bytes         show output in bytes
     --kilo          show output in kilobytes
     --mega          show output in megabytes
     --giga          show output in gigabytes
     --tera          show output in terabytes
     --peta          show output in petabytes
 -k, --kibi          show output in kibibytes
 -m, --mebi          show output in mebibytes
 -g, --gibi          show output in gibibytes
     --tebi          show output in tebibytes
     --pebi          show output in pebibytes
 -h, --human         show human-readable output
     --si            use powers of 1000 not 1024
 -l, --lohi          show detailed low and high memory statistics
 -t, --total         show total for RAM + swap
 -s N, --seconds N   repeat printing every N seconds
 -c N, --count N     repeat printing N times, then exit
 -w, --wide          wide output

     --help     display this help and exit
 -V, --version  output version information and exit

  • 以人类可看的方式输出
hushiwei@hsw:~$ free -h
              total        used        free      shared  buff/cache   available
Mem:           7.7G        4.4G        240M        970M        3.0G        2.1G
Swap:            0B          0B          0B

我用的是Deepin系统,free命令出来的比一般的ubuntu或者linux命令出来的要少一行。

为了详细的说明,我换一台服务器

[devel@xxx ~]$ free -h
total used free shared buffers cached
Mem: 24G 20G 3.6G 18M 358M 13G
-/+ buffers/cache: 6.9G 17G
Swap: 4.0G 0B 4.0G

  • 简单说明:
    • total:24G 即为总的物理内存大小
    • used:20G 为当前被系统调度的内存大小
    • free:3.6G 当前未被系统调度的内存大小

注意: 这里的用词是被系统调度,而不是被系统进程物理占用的内存大小

如何理解:

  • used只是被系统调度的内存,系统可以从used里面划分出有效的内存来调度给新进程使用
  • 只有在可调度内存不够的情况下,才会从free中挪用新内存进行调度。

used内存会被系统用来做哪些调度

  • 1.实实在在被进程占用。比如进程申请的栈内存,被分配并被使用的堆内存。在进程存活并未主动释放它的内存情况下,这块内存是无法被系统调度给其他进程使用的。即第三行used=6.9G部分
  • 2.用于写buffers,即上面buffers:358M.对于文件写操作需要经过写buffer的过程再落到磁盘上,而buffer这块内存是可以被系统回收并反复被调度的内存。
  • 3.用于读cached,即上面的cached:13G.系统会将一大部分内存用于cache,比如用于文件预读等,与buffer相同,这部分内存可以被系统重复调度给信息的进程

总结:

  • 因此,一个系统**被调度内存大小**=buffers(358M)+cached(13G)+第三行的used(6.9G)=第二行的used(20G)
  • **可用于新进程的内存大小**=free(3.6G)+buffers(358M)+cached(13G)=第三行的free(17G)
  • 所以,这里第三行表示了当前物理内存被系统占用的内存(used),以及可以被调度的内存大小(free)
  • 而这里free+used即为total的物理内存大小,也就是机器的所有内存大小。
  • 所以,在日常工作中,可以通过第三行的信息快速获取机器物理内存被实际占用情况。(Deepin系统居然没有这一行...什么原因)
  • 理解了之后,这里终于知道这个-/+ buffers/cache:是什么意思了.实际占用内存也就是已被系统调度内存减去buffers和cached内存.
  • 那么实际可用内存也就是系统未被调度内存加上buffers和cached内存了
  • 最后,知道每个部分的意思后,就算没有第三行,自己也可以轻易的看出来系统内存实际使用情况

相关命令

  • vmstat

free,buffer,cached的值,也可以通过vmstat命令来动态获取它的变化值,比如每隔一秒采集一次,总共采集10次memory的变化;

hushiwei@hsw:~$ vmstat 1 10
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 420908 95636 3952264 0 0 309 89 420 3104 10 3 83 5 0
0 0 0 438580 95636 3932768 0 0 0 360 1548 12740 8 3 88 0 0
0 0 0 438944 95636 3932684 0 0 0 0 788 7131 2 2 96 0 0
1 0 0 439020 95636 3932684 0 0 0 0 817 11039 3 2 95 0 0
2 0 0 423376 95636 3950340 0 0 0 0 1092 8635 7 5 88 0 0
0 0 0 421692 95644 3951528 0 0 0 236 1231 12386 10 3 84 3 0
1 0 0 439968 95644 3932768 0 0 0 360 881 7472 3 2 95 0 0
1 0 0 439800 95644 3932680 0 0 0 0 3319 22657 15 3 81 0 0
0 0 0 439692 95644 3932680 0 0 0 0 737 7149 3 1 96 0 0
2 0 0 422388 95644 3950288 0 0 0 0 916 12164 7 2 91 0 0

  • watch

在linux中可以通过watch命令,实时监控每一条命令执行的结果动态变化。

  • watch命令可以实时全屏监控当前命令执行的动态变化结果
  • watch命令的常用参数有:
    • -n:时隔多少秒刷新(默认每隔2秒刷一次结果)
    • -d:高亮显示动态变化
    • -t:关闭命令顶部的时间间隔,命令显示

example:
```

每隔3秒查看当前系统时间

watch -n 3 date

-d 参数可以高亮显示执行结果的变化

watch -n 3 -d date
```

因此,watch与free命令配合,也可以获取到动态的内存变化值。

watch -n 1 -d free

top命令解析

top不仅仅用于内存分析,还用于进程分析。先说关于内存部分

top - 10:28:54 up 19 days, 20:48,  1 user,  load average: 0.00, 0.00, 0.00
Tasks: 362 total,   1 running, 361 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni, 99.9%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  25402148k total, 22153960k used,  3248188k free,   367512k buffers
Swap:  4194300k total,        0k used,  4194300k free, 14689300k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 27234 kafka     20   0 9023m 596m  18m S  1.3  2.4 265:13.15 java
  1344 root       1 -19  510m 284m 1032 S  0.3  1.1  75:39.37 mfsmount
 23913 hdfs      20   0 2932m 645m  24m S  0.3  2.6  81:37.27 java
 29664 yarn      20   0 2990m 359m  25m S  0.3  1.4  79:56.77 java
 36226 hive      20   0 9349m 744m  25m S  0.3  3.0 112:08.36 java
     1 root      20   0 19356 1540 1228 S  0.0  0.0   0:02.15 init
     2 root      20   0     0    0    0 S  0.0  0.0   0:00.02 kthreadd
     3 root      RT   0     0    0    0 S  0.0  0.0   0:01.00 migration/0
     4 root      20   0     0    0    0 S  0.0  0.0   0:03.30 ksoftirqd/0
     5 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 stopper/0
     6 root      RT   0     0    0    0 S  0.0  0.0   0:01.80 watchdog/0
     7 root      RT   0     0    0    0 S  0.0  0.0   0:01.35 migration/1
     8 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 stopper/1
     9 root      20   0     0    0    0 S  0.0  0.0   0:04.01 ksoftirqd/1
    10 root      RT   0     0    0    0 S  0.0  0.0   0:01.56 watchdog/1
    11 root      RT   0     0    0    0 S  0.0  0.0   0:01.00 migration/2
    12 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 stopper/2
    13 root      20   0     0    0    0 S  0.0  0.0   0:03.74 ksoftirqd/2
    14 root      RT   0     0    0    0 S  0.0  0.0   0:01.62 watchdog/2
    15 root      RT   0     0    0    0 S  0.0  0.0   0:01.10 migration/3
    16 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 stopper/3
 ```

其中mem部分的total,used,free,buffers,cached与free命令显示的含义是一致的,他们都反应了整个系统的内存消耗情况;

未完待续。。。