Linux进程分析之内存

free命令解析

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

详解

  • 看看free支持的参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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
  • 以人类可看的方式输出
1
2
3
4
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命令出来的要少一行。

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

1
2
3
4
5
[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的变化;

1
2
3
4
5
6
7
8
9
10
11
12
13
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:

1
2
3
4
# 每隔3秒查看当前系统时间
watch -n 3 date
# -d 参数可以高亮显示执行结果的变化
watch -n 3 -d date

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

1
watch -n 1 -d free

top命令解析

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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命令显示的含义是一致的,他们都反应了整个系统的内存消耗情况;

未完待续。。。

Donate comment here