一、内存监控
监控内存的使用状态是非常重要的,通过监控有助于了解内存的使用状态,比如内存占用是否正常,内存是否紧缺等等,监控内存最常使用的命令有free、vmstat、top等
1.1 free
1 | $ free |
- total:内存总数 32872632 KB
- used:已使用的内存数 12393128 KB
- free:空闲的内存数 20479504 KB
- shared:多个进程共享的内存,总是0
- buffers:缓存内存数 23308 KB
- cached:缓存内存数 7496048 KB
第二行(-/+ buffers/cache):
- used:第一行Mem中的 used - buffers - cached = 12393128 - 23308 - 7496048 = 4873772 KB
- free:第一行Mem中的 free + buffers + cached = 20479504 + 23308 + 7496048 = 27998860 KB
- 可见这一行【used-buffers/cache】反映的是被程序实实在在吃掉的内存,【used+buffers/cache】反映的是可以挪用的内存总数。
第三行(Swap):表示交换分区的内存使用状态。
第一行内存状态是对于操作系统来说的,buffers/cached 都是属于被使用。
第二行内存状态是对于应用程序来说的,对于应用程序来说,buffers/cached占有的内存是可用的,因为buffers/cached是为了提高程序执行的性能,当应用程序需要用到内存的时候buffers/cached会很快地被回收,以供应用程序使用。
通常我们是从应用的角度来看的,所以只看第二行就行了。
另外,我们可以使用参数-m
、-g
来以MB
、GB
单位显示:1
2
3
4
5$ free -m
total used free shared buffers cached
Mem: 32102 12104 19998 0 22 7320
-/+ buffers/cache: 4760 27341
Swap: 0 0 0
1.2 vmstat
vmstat(Virtual Meomory Statistics,虚拟内存统计)是对系统的整体情况进行统计,包括内核进程、虚拟内存、磁盘、陷阱和 CPU 活动的统计信息。1
$ vmstat 2 100 # 2表示刷新间隔,100表示输出次数
结果如下:1
2
3
4
5
6
7
8
9
10procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 192532 91788 88812 0 0 2 1 20 30 0 0 100 0 0
0 0 0 192492 91788 88812 0 0 0 0 31 35 0 1 99 0 0
0 0 0 192492 91788 88812 0 0 0 0 23 30 0 0 100 0 0
0 0 0 192492 91788 88812 0 0 0 0 22 30 0 0 100 0 0
0 0 0 192492 91788 88812 0 0 0 0 22 31 0 1 100 0 0
0 0 0 192492 91788 88812 0 0 0 0 21 29 0 0 100 0 0
0 0 0 192492 91788 88812 0 0 0 0 21 30 0 0 100 0 0
0 0 0 192492 91788 88812 0 0 0 0 21 28 0 0 100 0 0
1)procs
- r列表示运行和等待CPU时间片的进程数,这个值如果长期大于系统CPU个数,就说明CPU资源不足,可以考虑增加CPU;
- b列表示在等待资源的进程数,比如正在等待I/O或者内存交换等。
2)memory
- swpd列表示切换到内存交换区的内存数量(以KB为单位)。如果swpd的值不为0或者比较大,而且si、so的值长期为0,那么这种情况一般不用担心,不会影响系统性能;
- free列表示当前空闲的物理内存数量(以KB为单位);
- buff列表示buffers cache的内存数量,一般对块设备的读写才需要缓冲;
- cache列表示page cached的内存数量,一般作文件系统的cached,频繁访问的文件都会被cached。如果cached值较大,就说明cached文件数较多。如果此时IO中的bi比较小,就说明文件系统效率比较好。
3)swap
- si列表示由磁盘调入内存,也就是内存进入内存交换区的数量;
- so列表示由内存调入磁盘,也就是内存交换区进入内存的数量
- 一般情况下,si、so的值都为0,如果si、so的值长期不为0,则表示系统内存不足,需要考虑是否增加系统内存。
4)IO
- bi列表示从块设备读入的数据总量(即读磁盘,单位KB/秒)
- bo列表示写入到块设备的数据总量(即写磁盘,单位KB/秒)
这里设置的bi+bo参考值为1000,如果超过1000,而且wa值比较大,则表示系统磁盘IO性能瓶颈。
5)system
- in列表示在某一时间间隔中观察到的每秒设备中断数;
- cs列表示每秒产生的上下文切换次数。
上面这两个值越大,会看到内核消耗的CPU时间就越多。
6)CPU
- us列显示了用户进程消耗CPU的时间百分比。us的值比较高时,说明用户进程消耗的CPU时间多,如果长期大于50%,需要考虑优化程序啥的。
- sy列显示了内核进程消耗CPU的时间百分比。sy的值比较高时,说明内核消耗的CPU时间多;如果us+sy超过80%,就说明CPU的资源存在不足。
- id列显示了CPU处在空闲状态的时间百分比;
- wa列表示IO等待所占的CPU时间百分比。wa值越高,说明IO等待越严重。如果wa值超过20%,说明IO等待严重。
- st列一般不关注,虚拟机占用的时间百分比。
1 | $ vmstat -s # 查看内存使用的详细信息 |
上面的信息主要来自于/proc/meminfo
,/proc/stat
和/proc/vmstat
。
二、CPU监控
2.1 top
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况及总体状况,类似于Windows的任务管理器。
1 | top - 20:32:28 up 1149 days, 11:13, 2 users, load average: 2.97, 2.42, 1.67 |
第一行:
- 20:32:28: 当前时间
- up 1149 days, 11:13:系统运行时间,系统已经运行了1149天11小时13分钟了。
- 2 users:当前登录用户数
- load average:系统负载,即任务队列的平均长度。三个数值分别为最近1分钟、最近5分钟、最近15分钟的平均负载 —— 超过N(CPU核数)说明系统满负荷运行。也可以通过
$w
或$uptime
命令查看load average。
第二行:
- 显示进程总数、正在运行的进程数、休眠的进程数、停止的进程数、僵尸进程数
第三行:
- %us:用户进程消耗的CPU百分比
- %sy:内核进程消耗的CPU百分比
- %ni:改变过优先级的进程占用CPU的百分比
- %id:空闲CPU的百分比
- %wa:IO等待消耗的CPU百分比
按”1”查看单个CPU的状况: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
28top - 20:32:49 up 1149 days, 11:13, 2 users, load average: 0.00, 0.00, 0.00
Tasks: 671 total, 1 running, 669 sleeping, 0 stopped, 1 zombie
Cpu0 : 1.0%us, 0.7%sy, 0.0%ni, 98.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu1 : 0.3%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu2 : 0.7%us, 0.0%sy, 0.0%ni, 99.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu3 : 0.3%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu4 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu5 : 0.3%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu6 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu7 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu8 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu9 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu10 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu11 : 0.3%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu12 : 1.0%us, 0.3%sy, 0.0%ni, 98.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu13 : 0.3%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu14 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu15 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu16 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu17 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu18 : 0.7%us, 0.0%sy, 0.0%ni, 99.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu19 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu20 : 0.7%us, 1.0%sy, 0.0%ni, 98.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu21 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu22 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu23 : 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: 32872632k total, 12336360k used, 20536272k free, 23080k buffers
Swap: 0k total, 0k used, 0k free, 7441976k cached
另外,下面的命令可以查看CPU的核数:1
2$ grep 'model name' /proc/cpuinfo | wc -l
24
2.2 mpstat
mpstat(Multiprocessor Statistics,多处理器统计)是实时系统监控工具,它会报告与CPU相关的统计信息,这些信息存放在/proc/stat文件中。
1 | $ mpstat -P ALL 2 # ALL表示显示所有CPUs,也可以指定某个CPU;2表示刷新间隔 |
1 | Linux 2.6.32-2.0.0.1 (localhost) 2015年09月05日 _x86_64_ (24 CPU) |
至于各百分比的含义前面已经介绍过了,这里就不再赘述。
三、网络监控
3.1 ethtool
使用ethtool
查看网卡带宽,需要root权限:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23# ethtool eth0
Settings for eth0:
Supported ports: [ TP ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised pause frame use: No
Advertised auto-negotiation: Yes
Speed: 1000Mb/s
Duplex: Full
Port: Twisted Pair
PHYAD: 1
Transceiver: internal
Auto-negotiation: on
MDI-X: Unknown
Supports Wake-on: pumbg
Wake-on: g
Current message level: 0x00000003 (3)
Link detected: yes
可以看出网卡eth0
的带宽为1000Mbps(兆比特每秒),所以理论上的网速极限为1000÷8 = 125MB/s。
3.2 sar
1 | $ sar -n DEV 3 100 |
1 | $ sar -n DEV 3 100 |
- IFACE:网络设备的名称
- rxpck/s:每秒钟接收到的包数目
- txpck/s:每秒钟发送出去的包数目
- rxkB/s:每秒钟接收到的字节数
- txkB/s:每秒钟发送出去的字节数
3.3 netstat
netstat
命令一般用于检验本机各端口的网络连接情况,用于显示与IP、TCP、UDP和ICMP协议相关的统计数据。
部分选项如下:1
2
3
4
5
6
7
8
9
10-a, --all, --listening 显示所有连接中的Socket。
-n, --numeric 以数字形式显示地址和端口号。
-t, -–tcp 显示TCP传输协议的连线状况。
-u, -–udp 显示UDP传输协议的连线状况。
-p, --programs 显示正在使用socket的程序名/进程ID
-l, --listening 显示监控中的服务器的Socket。
-o, --timers 显示计时器。
-s, --statistics 显示每个网络协议的统计信息(比如SNMP)
-i, --interfaces 显示网络界面信息表单(网卡列表)
-r, --route 显示路由表
常用的几种:1
2
3
4
5$ netstat -aup # 输出所有UDP连接状况
$ netstat -atp # 输出所有TCP连接状况
$ netstat -s # 显示各个协议的网络统计信息
$ netstat -i # 显示网卡列表
$ netstat -r # 显示路由表信息
找出程序运行的端口:1
$ netstat -ap | grep ssh
找出运行在指定端口的进程:1
$ netstat -anp | grep 60010
四、磁盘监控
4.1 df
df
命令的功能是用来检查linux的文件系统的磁盘空间占用情况。如果没有文件名被指定,则显示当前所有被挂载的文件系统,默认以 KB 为单位。
常用选项如下:1
2
3
4
5
6
7-a 全部文件系统列表
-h 以方便阅读的方式显示
-i 显示inode信息
-T 显示文件系统类型
-l 只显示本地文件系统
-k 以KB为单位
-m 以MB为单位
最常用的就是$ df -h
。
4.2 iostat
上面在介绍CPU监控时,就可以看到%wa
或%iowait
这一项,它表示I/O等待所占用CPU的百分比。为了得到关于磁盘IO更详细的状态信息,可以使用 iostat(I/O statistics,输入输出统计)命令:1
2
3
4
5-c 显示CPU使用情况
-d 显示磁盘使用情况
-k 以 KB 为单位显示
-m 以 M 为单位显示
-x 显示详细信息
1 | $ iostat -x -k 2 100 # 2表示刷新间隔,100表示刷新次数 |
iostat
主要是用来监控磁盘I/O,首先输出了CPUs的平均数据(avg-cpu),我们可以看%iowait
这一项,除此之外iostat还提供了一些更详细的I/O状态数据,比如
- r/s: 每秒完成的读 I/O 设备次数。
- w/s: 每秒完成的写 I/O 设备次数。
- rkB/s: 每秒读K字节数.是 rsect/s 的一半,因为每扇区大小为512字节。
- wkB/s: 每秒写K字节数.是 wsect/s 的一半。
- avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。
- avgqu-sz: 平均I/O队列长度。
- await: 平均每次设备I/O操作的等待时间 (毫秒)。
- svctm: 平均每次设备I/O操作的服务时间 (毫秒)。
- %util: 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。
五、进程监控
5.1 top
前面介绍过的top命令中可以对进程进行监控,其中一行就输出了进程的总体情况:1
Tasks: 661 total, 1 running, 659 sleeping, 0 stopped, 1 zombie
默认情况下,top按照CPU使用率对各个进程进行排序。1
2
3
4 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2543 root 20 0 9204 636 396 S 0.7 0.0 614:57.76 irqbalance
4279 work 20 0 15.8g 1.4g 10m S 0.7 4.6 121:19.27 java
11761 work 20 0 153m 7192 1080 S 0.7 0.0 642:26.65 python
- RES:进程使用的物理内存大小
- SHR:进程共享内存大小
- S:进程状态(R表示运行 ,S表示睡眠,Z表示僵死,D表示不可中断的睡眠)
在top运行状态下,输入M
按内存使用率排序、输入P
按CPU占用率排序、输入T
按累计时间排序、输入c
显示进程的启动命令,输入u
显示指定用户的进程。1
$ top -p <pid>
动态显示进程号为pid的进程的状态。
5.2 ps
ps(Process Status,进程状态)命令是最基本同时也是非常强大的进程查看命令,最常用的命令就是ps aux
——显示当前所有进程1
2
3
4$ ps aux | grep root # 输出root用户的所有进程
$ ps -p <pid> -L # 显示进程<pid>的所有线程
$ ps -e -o pid,uname,pcpu,pmem,comm # 定制显示的列
$ ps -o lstart <pid> # 显示进程的启动时间
ps命令的输出可以按任意某一列进行排序,通过使用内部排序键(列的别名),例如:1
2
3
4$ ps aux --sort=+rss # 按内存升序排列
$ ps aux --sort=-rss # 按内存降序排列
$ ps aux --sort=+%cpu # 按cpu升序排列
$ ps aux --sort=-%cpu # 按cpu降序排列
ps
命令的用法太多了,掌握一些常用的用法就好。如需了解更多的可选项,可以查看man手册。