目录
数据库运维监控
1、系统资源监控
CPU
top
load average 表示系统平均负载,3 个数值分别统计最近一分钟、五分钟、十五分钟的平均进程数量
进程信息:VIRT表示使用的虚拟内存,RES表示使用的物理内存,SHR表示使用的共享内存,进程状态(S 表示休眠,R 表示正在运行, Z 表示僵死状态,N 表示该进程优先值为负数,I 表示空闲状态),%CPU:占用的 CPU 使用率,%MEM:使用的物理内存占总内存的百分比,TIME+:使用的 CPU 时间总计(单位 1/100 秒)
逻辑CPU个数:
# cat /proc/cpuinfo | grep "processor" | wc -l
物理CPU个数:
# cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l
# cat /proc/cpuinfo | grep physical | uniq -c
每个物理CPU中Core的个数:
# cat /proc/cpuinfo | grep "cpu cores" | wc -l
vmstat 2
r 表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。
b 表示阻塞的进程,这个不多说,进程阻塞,大家懂的。
swpd 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。
free 空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。
buff Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多M
cache cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)
si 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。
so 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。
bi 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒
bo 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。
in 每秒CPU的中断次数,包括时间中断
cs 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。
us 用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。
sy 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
id 空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。
wt 等待IO CPU时间。
内存
free -m
一般情况下,物理内存不足会用到交换分区,需要考虑增加物理内存。
Mem | total | 物理总内存大小 |
used | 已用内存大小 | |
free | 可用物理内存大小 | |
shared | 共享内存大小 | |
buff/cache | 磁盘缓存大小 | |
available | 可分配的物理内存大小 | |
Swap | total | 总交换分区大小 |
used | 已用交换分区大小 | |
free | 可用交换分区大小 |
磁盘
df -h
./dmasmtool
lsdg
total_size 为磁盘组总大小,free_size 为磁盘组空闲大小
IO
iostat -xmd
rrqm/s:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge);
wrqm/s:每秒这个设备相关的写入请求有多少被Merge了。
rsec/s:每秒读取的扇区数;
wsec/:每秒写入的扇区数。
rKB/s:The number of read requests that were issued to the device per second;
wKB/s:The number of write requests that were issued to the device per second;
avgrq-sz 平均请求扇区的大小
avgqu-sz 是平均请求队列的长度。毫无疑问,队列长度越短越好。
await: 每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。 这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。
svctm 表示平均每次设备I/O操作的服务时间(以毫秒为单位)。如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长, 系统上运行的应用程序将变慢。
%util: 在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度
。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。
网络
ethtool ens32
显示网卡速率为 1000Mb/s
2、实例状态监控
以下内容的监控查询语句,见“常用sql总结”
会话监控
线程监控
SQL 监控
内存资源监控
表空间监控
集群状态监控
检查点监控
作业运行状态监控
日志监控与分析
数据库健康检查
1、系统健康检查
系统配置
网卡
防火墙
Selinux
CPU
内存
磁盘空间
服务器时间
系统资源
Core文件设置
磁盘状态
操作系统资源
cpu、内存、磁盘、IO、网络等
2、实例健康检查
见“日志总结”和“常用sql总结”
日志健康
数据库参数
表空间
死锁与阻塞
内存池信息
统计信息
备份作业
用户权限
3、集群健康检查
守护集群检查
1.参数检查
dmarch.ini 配置文件
dmmal.ini 配置文件
dmwatcher.ini 配置文件
dmmonitor.ini 配置文件
2.集群运行状况检查
监视器集群检查:输入 show 命令。可以查看集群的运行状态,如下图所示,WSTATUS 显示为 open 表示守护进程处于开启状态,INST_OK 为 OK 表示数据库处于正常运行状态,ISTATUS 为 open 表示数据库处于开启状态。
3.日志检查
例如过滤 dm_watcher_202404.log 中的 ERROR 信息,并输出到 error.log 文件中,可参考如下命令:
cat dm_watcher_202404.log | grep "ERROR" >error.log
DSC集群检查
1、网络环境检查
使用 ifconfig 命令可查看网卡情况。集群环境建议有两块网卡,一个是业务 IP,一个是心跳 IP。DMDSC 集群建议是万兆网卡,若带宽过低,会影响数据传输和 mal 通信,网卡信息可用 ethtool 命令查看。
2、节点间时间检查
使用命令 date 查看服务器节点时间是否与当前时间符合,在正式生产环境中,建议添加 NTP 服务器进行时间同步,确保系统各节点时间保持一致。
3、配置文件检查
共享存储集群涉及到的配置文件主要有:dm.ini、dmdcr_cfg.ini、dmasvrmal.ini、dmdcr.ini、dmarch.ini、dmcssm.ini、dmmal.ini 等。
4.集群运行状态检查
DMCSSM 监视器输入 show 命令后可以监视集群的运行状态,is_ok 为 OK 状态表示实例正常,active 为 true 表示实例处于活动状态,inst_status 说明了实例处于开启状态,vtd_status 说明了集群处于 working 状态。
5.日志检查
例如过滤 dm_DMSERVER_202404.log 中的 ERROR 信息,并输出到 error.log 文件中,可参考如下命令:
cat dm_DMSERVER_202404.log | grep -E "ERROR|FATAL" >error.log
故障排查与优化
1 SQL类故障
SQL长时间等待
锁等待
性能问题
SQL执行出现异常
进程异常
SQL结果集异常
物化视图没有更新
非一致性读
应用逻辑BUG
2 实例故障
数据库内部故障
操作系统故障
3 人为故障
数据库的大多数严重故障是人为操作失误导致。
文件误删除或破坏
数据误删除或修改