监控介绍

1
2
3
4
1.系统的监控:实际上是对系统不间断的实时监控
2.实时反馈系统当前状态:我们监控某个硬件、或者某个系统,都是需要能实时看到当前系统的状态是正常、异常、或者故障。
3.保证服务可靠性安全性:我们监控的目的就是要保证系统、服务、业务正常运行
4.保证业务持续稳定运行:如果我们的监控做得很完善,即使出现故障,能第一时间接收到故障报警在第一时间处理解决,从而保证业务持续性的稳定运行。(往往,第一时间知道业务宕机的都是用户)

监控软件介绍

1
2
3
1.CACTI 网络监控
2.Nagios 系统监控 https://www.nagios.com/
3.falcon 小米监控 https://open-falcon.github.io/

监控有哪些方面

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
29
30
31
32
33
34
35
36
37
38
39
40
41
硬件层
- CPU温度
- 风扇转速
- 磁盘是否损坏
- CMOS电池电量
- 内存是否损坏
...
系统层
- CPU:使用率、负载
- 内存:使用率
- 磁盘:使用率,IO
- 进程
- TCP状态
- 系统负载
- 文件描述符
...
网络层
- 网络设备:路由器,交换机
- 网卡入口流量
- 网卡出口流量
- 带宽的峰值
...
应用层
- MySQL:主从复制是否有延迟(zabbix监控模板)
- redis:主从复制是否有延迟
- 监控思路:zabbix没有固定模板,可以在主库中set一个key为时间戳,然后从库会同步这个时
- 间戳(动态),写脚本时时获取这两个时间戳,做对比
- NFS:磁盘挂载状况
- tomcat:JVM监控,老年代、新生代、永久带、full-gc(垃圾回收)
- rsync的同步情况,MD5校验文件是否被篡改
...
业务层
- URL的监控
- API的监控
- nginx的状态码
- tomcat的exception
- 请求时间
- 响应时间
- 加载时间
- 渲染时间
...

常用监控命令

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
28
29
30
31
32
33
34
[root@web02 ~]# w
10:33:44 up 1:28, 1 user, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 10.0.0.1 09:44 0.00s 0.03s 0.00s w

零宽断言
ifconfig eth0|grep -Po '\d\d\.\d\.\d\.\d(?= netmask)'
ifconfig eth0|grep -Po '[1-9][0-9]+\.[0-9]+\.[0-9]+\.[0-9]+(?= netmask)'
10.0.0.7

\K 是一个特殊的 PCRE 符号,表示“忽略之前的匹配”,
ifconfig eth0 | grep -oP 'inet \K(\d+\.\d+\.\d+\.\d+)'


[root@web02 ~]# top

[root@web02 ~]# htop
[root@web02 ~]# glances
[root@web02 ~]# uptime
10:37:12 up 1:32, 1 user, load average: 0.13, 0.09, 0.01

#不管用什么命令监控,查看CPU,我们都必须了解,系统的用户态和内和态。
%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
us: 用户态 跟用户的操作有关35%
sy: 内和态 跟内核的处理有关65%
id: CPU空闲

#查看命令执行时间
[root@web02 ~]# time ls
backup.sh group_vars_web_group
real 0m0.002s 真实执行时间
user 0m0.001s 用户执行时间
sys 0m0.001s 系统执行时间

内存监控命令

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
[root@web02 ~]# free -m
total used free shared buff/cache available
Mem: 972 94 588 7 290 712
Swap: 1023 0 1023


## 如何查看单个进程占用内存?
#进程占用内存公式
pmem = VmRSS / MemTotal * 100
process mem = 虚拟内存 / 总内存 * 100


[root@web02 ~]# cat mem.py
#!/usr/bin/env python
# _*_ coding:UTF-8 _*_
# 收集程序所占用的物理内存大小,占所有物理内存的比例
# Python: 2.7.6
import sys
import os
from subprocess import Popen,PIPE

def get_pid(program):
'获取目标程序的PID列表'
p = Popen(['pidof',program],stdout=PIPE,stderr=PIPE)
pids,stderrput = p.communicate()
# pids = p.stdout.read() #这种方法也是可以的
# 这里也可以对stderrput来进行判断
if pids:
return pids.split()
else:
raise ValueError

def mem_calc(pids):
'计算PIDs占用的内存大小'
mem_total = 0
for pid in pids:
os.chdir('/proc/%s' % pid)
with open('status') as fd:
for line in fd:
if line.startswith('VmRSS'):
mem = line.strip().split()[1]
mem_total += int(mem)
break
return mem_total

def mem_percent(mem):
'计算程序内存占用物理内存的百分比'
with open('/proc/meminfo') as fd:
for line in fd:
if line.startswith('MemTotal'):
total = line.strip().split()[1]
percent = (float(mem)/int(total)) * 100
return percent

def main():
try:
program = sys.argv[1]
pids = get_pid(program)
except IndexError as e:
sys.exit('%s need a Program name ' % __file__)
except ValueError as e:
sys.exit('%s not a Process Name or not Start' % program )
mem_total = mem_calc(pids)
percent = mem_percent(mem_total)
return program,mem_total,percent
if __name__ == '__main__':
program,mem_total,mem_percent=main()
print('进程名称:%s\n物理内存为:%s\n百分比为:%.2f%%'%
(program,mem_total,mem_percent))

磁盘监控命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@web02 ~]# df -h

[root@web02 ~]# iotop
[root@web02 ~]# iostat -dm 1 10
[root@web01 ~]# iostat -dm 1 10
Linux 3.10.0-957.el7.x86_64 (web01) 08/04/2024 _x86_64_ (1 CPU)

Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn
scd0 0.00 0.00 0.00 1 0
sda 1.08 0.02 0.00 93 15
[root@web02 ~]# dstat
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
0 0 99 0 0 0| 36k 45k| 0 0 | 0 0 | 56 125
0 0 100 0 0 0| 0 0 | 60B 874B| 0 0 | 56 94

网络监控命令

1
2
3
4
5
6
7
8
9
[root@web02 ~]# ifconfig
[root@web02 ~]# iftop
[root@web02 ~]# nethogs
[root@web02 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.0.254 0.0.0.0 UG 102 0 0 eth0
10.0.0.0 0.0.0.0 255.255.255.0 U 102 0 0 eth0
172.16.1.0 0.0.0.0 255.255.255.0 U 101 0 0 eth1

TCP监控命令

1
2
3
4
5
6
7
8
9
10
[root@web01 ~]# netstat -an|awk '/^tcp/ {print $NF}'|sort|uniq -c
2 ESTABLISHED
6 LISTEN
[root@web01 ~]# netstat -an|awk '/^tcp/ {++state[$NF]} END {for(key in state)print key," \t" ,state[key]}'
LISTEN 6
ESTABLISHED 2
[root@web02 ~]# ss -n|awk '{print $2}'|sort|uniq -c
89 ESTAB
1 State

系统的oom

1
2
3
4
5
6
7
8
9
10
11
随着时间的推移,用户不断增多,服务消耗的内存越来越多,当系统内存不足的时候,可能会导致系统产生oom(out of memory)
1.当系统内存不足时就会大量使用swap(虚拟内存)
2.当系统大量使用swap的时候,系统会特别卡

注意:有时可能内存还有剩余300M或者500M,但是swap依然被使用

[root@web02 ~]# dd < /dev/zero > /dev/null bs=2000M
[root@web02 ~]# tail -f /var/log/messages
Out of memory: Kill process 29957 (dd) score 366 or sacrifice child
Killed process 29957 (dd) total-vm:2532680kB, anon-rss:1416508kB, filers:0kB