平常处理服务器的问题遇到的最多的是负载高了,内存高了,io高了等问题,这里最明显的表现就是相关的监控指标了,对于诊断这种问题起到事半功倍的效果。
又因为监控指标也仅仅是指标,并看到具体是什么导致的,所以常用的linux 内部的相关系统命令也是有必要了解和掌握的
1、腾云cvm监控信息
关于cvm的监控指标都是根据云监控侧的一个监控脚本来进行采集的,如果说机器上没有这个脚本或者说用了非腾讯云cvm默认的dns的话,这里我们就看不到其监控信息了,所以如果我们没有特殊需求的话,建议是用腾讯云cvm自己的dns和监控脚本
具体的各种指标含义,见这个文档
https://cloud.tencent.com/document/product/248/6843
这里有个基础cpu利用率,这个是通过宿主机来采集的监控信息,服务器如果挂了,这个监控信息我们还是可以在控制台看到的
2、常用的监控命令
除了以上云上的监控指标介绍外,其实我们还是要重点看下系统内的相关指标是什么意思,才可以更加清楚去排查问题,处理问题。
2.1、top/atop系统监控命令
1)、第一排参数
up:机器已经运行了多长时间
1 user:当前有多少用户存活
load average:cpu平均负载表示在某段时间内正在处理(占有cpu时间)的进程以及等待处理(等待唤醒的进程)的进程数,上面三个数分别表示1分钟、5分钟、15分钟的平均负载,一般关注5分钟或者15分钟的指标就行,可以代表机器的真正压力。
一核就好比一座桥,假如一个cpu可以同时处理100个进程,就好比一座桥可以同时过100个人,如果同时过20个人,那么cpu的负载就是0.2,过100个人的时候,正好达到瓶颈负载1,如果说现在有150个人在过桥,其中有50个人在等待中,那么此时cpu负载就是1.5,虽然100的并发没有变,但是cpu已经无法支撑这么多任务了,会拖长整体的处理速度,如果长时间高负载的话就需要考虑升级配置来增加处理效率了
tasks:总进程数 running:正在运行的进程数 sleeping:睡眠中的任务数 stopped:停止的进程数 zombie:僵尸进程(已经不占用cpu和内存了,但是还未被销毁的进程数,这个状态是每个进程必须经历的,子进程释放掉资源后,但是父进程没有及时回收或者处理,就会出现这种‘Z’状态的进程,如果说父进程在子进程结束之前结束,就会交由系统处理掉了或者说直接kill掉父进程)
2)、第二排参数
%Cpu(s):cpu使用率
us, user: 运行(未调整优先级的) 用户进程的CPU时间
sy,system: 运行内核进程的CPU时间
ni,niced:运行已调整优先级的用户进程的CPU时间
wa,IO wait: 用于等待IO完成的CPU时间
hi:处理硬件中断的CPU时间
si: 处理软件中断的CPU时间
st:底层虚拟系统占用的cpu时间
cpu使用率是最常见的了,可以直接体现cpu的繁忙度,表示某段时间内每个进程所占用的cpu时间百分比,平常碰到最多的就是高cpu使用率了,就拿java进程来说吧,如果java进程长期占用cpu导致高使用率的话,其实就要考虑我的配置能否跟上我的程序了,如果是某个时间段或者某个瞬间出现高使用率的情况,此时需要针对具体情况来分析,比如是否当时有个计算型的操作或者循环类操作等,一般对于java来说有结合linux的相关命令有比较容易定位的步骤
1.jps 获取Java进程的PID。
2.jstack pid >> java.txt 导出CPU占用高进程的线程栈。
3.top -H -p PID 查看对应进程的哪个线程占用CPU过高。
4.echo “obase=16; PID” | bc 将线程的PID转换为16进制,大写转换为小写。
5.在第二步导出的Java.txt中查找转换成为16进制的线程PID。找到对应的线程栈。
6.分析负载高的线程栈都是什么业务操作。优化程序并处理问题
3)竖排参数
PID :进程id
USER :进程所有者
PR :进程优先级
NI :nice值。负值表示高优先级,正值表示低优先级
VIRT (kb): 进程起来时分配的内存,加载的代码、数据等申请的内存,如果进程申请了100M,但实际用了50M,这里就会增加100M,此指标实际并不是真正使用的内存量,VIRT=SWAP RES
RES(kb) :进程使用的、未被换出的物理内存大小,进程实际在用的进程,如果申请了100M,这个值就会直接增加100M。
SHR :共享内存大小,单位kb
S :进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU : 上次更新到现在的CPU时间占用百分比
%MEM : 进程使用的物理内存百分比
TIME :进程使用的CPU时间总计,单位1/100秒
COMMAND : 进程名称(命令名/命令行)
3、atop
因为top是展示实时的动态监控,无法获取历史监控信息,而atop可以做到历史监控信息的保存,如果自己本身有监控系统其实也不用安装atop
3.1、atop安装:
yum install -y atop
今天安装atop的时候居然卡住了。。
卡在这不动了
没办法,不重启机器的情况下处理吧
先把这个进程调度到后台,通过ctrl z调度到后台,然后执行 ps -aux | grep yum 找到卡住的yum进程,然后kill -9 pid 杀掉
至此认为可以正常启动了,但是还是有报错,如下
通过报错显示看似乎是rpmdb进程挂了,然后去找吧,当时正好在/usr/bin目录下,直接执行了这个rpmdb脚本,但是发现不让这么用,尴尬了··
正好看到提醒,有初始化、有重建,就想重建下吧
rpmdb --rebuilddb
执行后,发现没有报错,然后在去验证yum命令,发现正常了,然后再次安装atop就可以了
3.2、atop配置定时任务,间隔某时间段来拉取监控信息,便于后续查看
启动atop服务
systemctl start atop
配置间隔时间
cat /etc/sysconfig/atop
LOGINTERVA主要用于调整atop监控周期,默认600s采集一次,建议改到1分钟采集一次
日志存储目录(默认)/var/log/atop
默认定时任务如下
/usr/share/atop/atop.daily配置日志保留时间,默认是28天,因为我们有时需要让客户按照这个命令,所以一般情况下为避免长时间运行占用太多磁盘空间,建议改小到7天左右或者直至问题复现后关掉
atop在启动之后,会将采集记录在 /var/log/atop目录中,可执行如下命令查看日志文件
atop -r 日志文件
3.3、atop常用指令
c 按照进程cpu使用率进行降序筛选
m按照进程内存使用率进行降序筛选
d 按照进程磁盘使用率进行降序筛选
a 按照进程资源综合使用率进行降序筛选
n 按照进程网络使用率进行降序筛选(需要额外安装内核模块才支持,默认不支持)
t 跳转到下一个监控采集点
T 跳转到上一个监控采集点
B 指定时间点,格式 hh:mm:ss
3.4、系统资源监控字段含义
详细字段解释参考大佬文档:https://baijiahao.baidu.com/s?id=1658884324200587364&wfr=spider&for=pc
ATOP列:该列显示了主机名、信息采样日期和时间点
PRC列:该列显示进程整体运行情况
sys, user 表示 CPU 在内核态和用户态的运行时间比例
1、proc 为当前总进程数
2、trun表示 running 状态线程数
3、tslpi表示 sleeping interruptible 状态的进线程数
4、tslpu表示 sleeping uninterruptible 状态线程数
5、zombie表示僵尸进程数
6、clones 表示在监控周期(默认10s)内 clone() 系统调用次数
linux 中进程有两种 sleep 状态:
interruptible sleep: 进程接收系统信号,可以被系统信号中断,uninterruptible sleep: 进程不接收系统信号,不可被系统信号中断,包括kill -9 (SIGKILL 信号)。此状态的进程通常在等待系统资源,如磁盘IO或网络IO。
CPU列:该列显示CPU整体(即多核CPU作为一个整体CPU资源)的使用情况,我们知道CPU可被用于执行进程、处理中断,也可处于空闲状态(空闲状态分两种,一种是活动进程等待磁盘IO导致CPU空闲,另一种是完全空闲)
- sys、usr字段指示CPU被用于处理进程时,进程在内核态、用户态所占CPU的时间比例
- irq字段指示CPU被用于处理中断的时间比例
- idle字段指示CPU处在完全空闲状态的时间比例
- wait字段指示CPU处在“进程等待磁盘IO导致CPU空闲”状态的时间比例
CPU列各个字段指示值相加结果为N00%,其中N为cpu核数。
cpu列:该列显示某一核cpu的使用情况,各字段含义可参照CPU列,各字段值相加结果为100%
CPL列:该列显示CPU负载情况
- avg1、avg5和avg15字段:过去1分钟、5分钟和15分钟内运行队列中的平均进程数量
- csw字段指示上下文交换次数
- intr字段指示中断发生次数
MEM列:该列指示内存的使用情况
- tot字段指示物理内存总量
- free字段指示空闲内存的大小
- cache字段指示用于页缓存的内存大小
- buff字段指示用于文件缓存的内存大小
- slab字段指示系统内核占用的内存大小
- dirty字段指示需要写回磁盘的脏页用量,这部分内存使用已包含在cache中
SWP列:该列指示交换空间的使用情况
- tot字段指示交换区总量
- free字段指示空闲交换空间大小
PAG列:该列指示虚拟内存分页情况
swin、swout字段:换入和换出内存页数
DSK列:该列指示磁盘使用情况,每一个磁盘设备对应一列,如果有sdb设备,那么增多一列DSK信息
- sda字段:磁盘设备标识
- busy字段:磁盘忙时比例
- read、write字段:读、写请求数量
NET列:多列NET展示了网络状况,包括传输层(TCP和UDP)、IP层以及各活动的网口信息
- XXXi 字段指示各层或活动网口收包数目
- XXXo 字段指示各层或活动网口发包数目
4、sar监控命令
这个命令监控的系统组件很多而且很全,是一个全面的监控系统,虽然这些不要求售后掌握,但是客户有很多用这个命令的,而且腾讯云的后端监控有部分也是靠sar来监控的,所以我们要知道这个命令的常用指标的含义,具体可以参考这位大佬写,写的很全,很详细
https://www.jellythink.com/archives/483