点击名片关注 阿尘blog,一起学习,一起成长
系统和网站开发完都要部署到服务器上运行,服务器性能监控和分析就尤为重要,怎么配置服务器、怎么调油、怎么发现性能瓶颈,都需要重点去监控和分析服务器性能
linux 服务器性能监控和分析
本次笔记基于阿里的anolis os 8,具体直接用最新版本
第一个命令是vmstat
vmstat一般是性能测试在服务器上运行最多的命令
具体可以监控指标看图
首先命令vmstat 1 10 意思是每个1s获取一次服务器资源使用数据,一共获取10次
指标:
r 为第一列监控数据,代表目前实际运行的指令队列(有多少任务需要CPU来执行)一般还会结合最后五列指标来看,超过了服务器已有的CPU核数3个就比较高,超过5个就very 高了,超过10个,veryvery不正常了
b第二列监控数据,代表因等待资源而阻塞的命令个数,如果这个高,就要检查一下I/O,内存,CPU是不是出现了瓶颈
swpd 第三列监控数据,代表虚拟内存使用大小,物理内存运行不够的时候会把物理内存中的部分空间释放出来,以供急需物理内存来运行的的程序使用,释放的一般就是长时间不用的保存到虚拟内存里面,要用的时候才恢复到物理内存,虚拟内存读写比物理内存慢,大量虚拟读写交换就会影响程序运行,单位(K)如果大于0,不好意思,内存不够用了,通常结合si和so看
free 第四列监控数据,代表空间物理内存大小(单位k)不包含buff和cache
buff 第五列监控数据,代表缓冲区内存大小,对块设备一般才会读写缓冲区,内存大,缓冲区也大
cache 第六列监控数据,代表直接用于缓存已打开的文件,一般把部分空闲的物理内存拿来缓存文件和目录,这个一般也比较大
si 第七列监控数据,每秒从虚拟磁盘读入数据到内存中的大小,大于0,不好意思内存不够用了
so 第八列监控数据,与si相反,每秒从内存写入到虚拟内存
bi 第九列监控数据,代表数据块block设备每秒读取块数量,一般块大小,1024byte
bo 第十列监控数据,代表每秒写入block的数量,有多少个block写入磁盘,bi和bo越大,比如超出1024k,那么CPU I/O等待也越大
in 第11列监控数据,每秒CPU中断次数,包括时钟中断
cs 第12列监控数据,CPU每秒切换上下文次数,调用系统函数会导致上下文切换,线程或进程切换,这个值越小越好,太大了就弄低一点,减少线程进程数,太高消耗系统资源,也要避免频繁调用系统函数
us 第13列监控数据,user time 代表用户模式CPU使用百分比,越高说明CPU被正常利用得越好
sy 第14列监控数据代表系统内核进程执行时间百分比,这个越高说明系统内耗CPU资源多,in,cs,I/O频繁操作都会导致sy过高,该去找原因了
id 第15列监控数据,代表空闲CPU时间占比,一般来说id+us+sy=100,id是空闲CPU使用比例
wa 第16列监控数据,代表I/O等待时间占比,wa值越高说明I/O等待比较严重,这是由于磁盘大量进行随机访问造成
st 第17列监控数据,代表CPU等待虚拟机调度的时间占比,在虚拟机中才会有,物理机一般为0,如果有多个虚拟机同时运行,就会争抢CPU,一台占用,其他就要等待CPU释放
vmstat其他参数可以参考命令vmstat --help
-a 显示活跃和不活跃内存
-f 显示启动的进程,linux用fork()函数创建进程
-m显示内存分配器slab的相关信息,通过slab信息查看各个内核模块占用内存空间大小
可以通过 cat /proc/meminfo |grep Slab 命令来查看slab占用总内存,占用内存过大,可能内存模块出现了泄露
-n 只显示头部第一行信息
-s 显示内存相关统计信息及多种系统操作活动发生次数的统计,比如CPU时钟中断次数,CPU上下文切换次数
-d 显示每一块磁盘I/O相关明细信息
-D 显示磁盘I/O相关汇总信息
-p 显示磁盘中某个分区的I/O读写信息 举个栗子:vmstat -p /dev/sdal 就是显示/dev/sdal分区的I/O读写信息
-S 使用指定单位显示,有k,K,m,M,分别对应1000、1024、1000000、1048576字节,默认K
-w 调整命令输出结果显示格式,更宽显示
-t 增加获取数据的时间戳
-V 显示命令版本信息
第二个命令是mpstat
mpstat与vmstat类似
mpstat有些没有默认安装,直接安装即可
%usr 代表用户模式下CPU使用时间百分比
%nice 代表CPU在进程优先级跳读下CPU占用时间百分比,进程是可以设置优先级的,设置默认优先级,%nice就会产生占用时间百分比,top,ps会有PRI/PR 、NI、%ni/%nice三个指标
PRI,表示进程执行优先级,值越小,优先级越高,NI表示进程nice值,可被执行进程优先级的修正值,加入之后,PRI会改变
%sys 表示系统内核进程执行时间百分比,与sy数据基本一致
%iowait 与wa一致
%irq 表示处理系统中断的CPU百分比,与in类似
%soft 表示用于软件中断的CPU本分比
%steal 与st数据基本一致
%guest表示运行vCPU(虚拟处理器)时所消耗的CPU时间本分比
%gnice表示运行降级虚拟程序所使用的的CPU百分比
%idle 表示空闲CPU时间占比,与id一致
mpstat加上-P可以查看具体CPU核的资源使用情况(编号从0开始)
第三个命令是pidstat
linux可以针对没有具体进程进行资源监控
pidstat可以加上数字轮询获取资源使用数据
如每个1s获取5个活动
uid就是yshuid
pid就是进程id
%CPU指定进程使用CPU时间百分比
CPU指定进程的CPU编号
command 当前进程运行的命令
其余跟之前一样
pidstat支持的参数
pidstat -d 展示每个进程的I/O 使用情况
kB rd/s:进程每秒从磁盘读取的数据大小,单位为KBkB wr/s:进程每秒写入磁盘的数据大小,单位为KBkB ccwr/s:进程写入磁盘被取消的数据大小,单位为KBiodelay:表示 I/O 的延迟(单位是时钟周期)
pidstat -p <pid> :查看指定进程的资源使用情况
pidstat -r 展示每个进程的内存使用情况
minflt/s:进程读取内存数据时,每秒出现的次要错误的数量。这些错误指的是不需要从磁盘载入内容的数据,一般是虚拟内存地址映射成物理内存地址所产生的page fault(页面数据错误)次数
majflt/s:进程读取内存数据时,每秒出现的主要错误的数量。这些错误指的是需要从磁盘载入内存的数据。当虚拟内存地址映射成物理内存地址时,相应的page数据在swap中,这样的page fault(页面数据误)为major page fault(主要页面数据错误),一般在物理内存使用紧张时才会产生。
VSZ:进程占用的虚拟内存的大小,单位为KBRSS:进程占用的物理内存的大小,单位为KB%MEM:进程占用的内存百分比pidstat -u 和pidstat执行结果一样
pidstat -w :展示每个进程的CPU上下文切换次数
cswch/s:每秒主动进行CPU上下文切换的数量。一般由于需要的资源不可用而发生阻塞时,会自愿主动进行上下文切换nvcswch/s:每秒被动进行CPU上下文切换的数量。比如当进程在其CPU时间片内执行,然后由于CPU时间片调度被迫放弃该CPU处理器时,会发生被动非自愿的的上下文切换
pidstat -l :显示进程正在执行的命令和该命令对应的所有参数
pidstat -t:展示进程及进程对应线程的资源使用情况
TGID就是进程ID
TID代表进程下的线程id
查看进程id为1254的内存使用情况
pidstat -s:展示每个进程的堆栈使用情况
StkSize:进程保留在内存中的堆栈占用的内存大小,单位为KB,这些堆栈数据并不一定全部被进程使用StkRef:进程实际应用的用作堆栈的内存大小(即实际使用的堆栈空间大小),单位为KB
pidstat -U:展示实际应用的用作堆栈的内存大小,实际使用的堆栈大小,KB
第四个命令是lsof
lsof 是linux里面对文件进行监控的一个常用命令,使用该命令可以知道当前打开了哪些文件、系统中哪些进程打开了哪些文件,直接运行lsof就会出现很多下图类似结果
结果的第一列展示进程名称
第二列展示进程id,pid
第三列展示进程所有者
第四列展示的文件描述符,常见的描述符有以下
文件描述符简称 | 英文名称 | 中文解释 |
---|---|---|
cwd | current working directory | 当前工作目录 |
mem | memory-mapped file | 代表磁盘文件映射到内存中,途中systemd就是mem类型 |
txt | program text | 进程运行的程序文件,包括编译后的代码文件以及产生的数据文件 |
rtd | root directory | root目录 |
pd | parent directory | 父目录 |
ltx | shared libarary text(code and data | 共享lib数据 |
m86 | DOS Merge mapped file | 合并映射文件 |
mmap | memory-mapped device | 代表吧磁盘设备映射到内存中 |
err | FD information error | 文件描述信息错误 |
tr | kernel trace file | 内核跟踪文件 |
DEL | a linux map file that has been deleted | 代表已删除的映射文件 |
数字+字符:0u,1w | 0代表标准输出,1代表标准输入,2代表标准错误,u代表文件打开处于读写模式r代表文件打开处于只读模式w代表文件打开处于只写模式 |
第五列展示打开文件的文件类型
类型 | 英文全称 | 解释 |
---|---|---|
DIR | Directory | 文件目录 |
CHR | character special file | 特殊字符文件 |
LINK | symbolic link file | 链接文件 |
IPv4 | IPv4 socket | IPv4套接字文件 |
IPv6 | IPv6 network file | 打开了一个IPv6的网络文件 |
REG | regular file | 普通文件 |
FIFO | FIFO special file | 先进先出的队列文件 |
unix | Unix domain socket | Unix下的域套接字,常说的IPC socket,进程间的通信socket |
MPB | multiplexed block file | 多路复用的快文件 |
MPC | multiplexed character file | 多路复用的字符文件 |
inet | an Internet domain socket | Internet域套接字 |
第六列展示的设备号,逗号隔开,一般会用character special file、block special、regular、directory来表示,也可以用地址、设备名称来表示
第七列展示的文件大小,前提是文件有效
第八列展示的是操作系统本地文件的node number或者服务器主机中的NFS文件的inode number或者协议类型
第九列展示的是文件的绝对路径或者网络通信链接的地址、端口、状态或挂载点
lsof的参数
lsof -c 后面加进程名字,查看进程打开了哪些文件
lsof -p 后面加进程id,查看具体打开哪些文件
lsof -i 查看IPv4、IPv6下打开了哪些文件,此时看到差不多都是网络的链接通信,lsof -i:端口号,可以查看对应端口号下通信情况
TCP通信连接是在做性能测试经常需要关注的,尤其高并发下连接数量和快速释放需要重点关注,可以看到22端口监听到ip为192.168.31.131的电脑和22端口进行TCP连接,占用了端口号50383,TCP的通信连接状态为ESTABLISHED
通信连接常用状态及简单说明
状态 | 说明 |
---|---|
LISTEN | 监听状态,应用启用就会监听 |
ESTABLISHED | 通信中,连接已建立 |
CLOSE_WAIT | 客户端主动关闭连接或网络异常导致中断,需要服务端主动关闭 |
TIME_WAIT | 服务端主动断开连接,客户端收到确认后的状态,2MSL后彻底关闭,处于这个状态占用资源不会释放,分析原因,不建议服务器主动断开连接 |
SYN_SENT | 请求正在连接中 |
SYN_RECV | 服务端收到客户端SYN请求后,给的恢复 |
LAST_ACK | TCP 连接关闭过程中的一种中间状态,双方发送了FIN(关闭标志),发送后发送方状态 |
CLOSING | TCP 连接关闭过程中的一种中间状态,双方发送了FIN,且收到了对方FIN就这种状态,少见 |
FIN_WAIT | TCP连接关闭过程中的中间态,存在时间短,双方调用close函数就进入 |
FIN_WAIT2 | TCP连接关闭过程中的中间态,存在时间短,双方调用close函数就进入,收到ACK确认进入,没有发送FIN就会一直这样,出现大量这种状态就检查网络和程序是否存在泄露,bug |
CLOASED | 连接初始状态 |
TCP协议层有FLAGS字段,包含SYN(建立连接标志)、FIN(关闭连接标志)、ACK(响应确认标志)、PSH(DATA数据传输标志)、RST(连接重置标志)、URG(紧急标志)每种代表一种连接信号
任何状态连接都会占用资源
Linux服务器TCP、UDP端口有限(0-65535)
出现大量CLOSE_WAIT和TIME_WAIT需要查找原因进行优化,CLOSE_WAIT大多是自己编码原因
优化方式:
①vim /etc/sysctl.conf 然后执行sysctl -p让参数生效
net.ipv4.tcp_syncookies = 1 #开启syn cookies 出现syn等待队列溢出用cookies处理
net.ipv4.tcp_tw_reuse = 1 # 开启连接重用,允许TIME-WAIT socket的连接重新用于新的TCP
net.ipv4.tcp_tw_recycle = 1 # 开启TIME-WAIT socket连接快速回收
net.ipv4.tcp_fin_timeout = 30 # 设置服务器主动关闭连接时间
net.ipv4.tcp_keepalive_time=600
# 表示请求开启keepalive(http请求一般都开启了)时,TCP发送keepalive消息间隔时间,默认7200s
net.ipv4.tcp_max_tw_buckets = 5000 # 连接为TIME-WAIT,linux操作系统允许接受的套接字数量最大值
fs.file-max = 900000 # linux可以同时打开最大句柄数
net.ipv4.tcp_max_syn_backlog = 2000 # 表示服务器能够接受SYN同步宝的最大客户端连接数,默认128
net.core.somaxconn=2048 # 服务器能处理的最大客户端连接数,同时完成建立连接的数量
net.ipv4.tcp_synack_retries = 1 # 表示服务器在发送SYN+ACK,没有收到恢复重新尝试发送的次数
net.ipv4.ip_local_port_range =2048 65535
# 修改key用于和客户端建立连接的端口范围,默认32768-61000
net.core.rmem_max=2187154 # linux内核接受socket缓冲区最大值,单位字节
net.core.wmem_max=2187154 # linux内核发送socket缓冲区最大值
net.core.rmem_default = 250000 # linux内核接受socket缓冲区默认值
net.core.wmem_default = 250000 # linux内核发送socket缓冲区默认值
②vi /etc/security/limits.conf编辑limits.conf,修改进程能够打开最大句柄数
soft nofile 65535
hard nofile 65535
lsof +d 列出指定目录下被使用的文件
lsof +D与上面相同,但是目录会以递归形式列出
lsof 后面跟具体文件名可以得到这个文件正在被哪些进程使用
lsof -i:@ip可以列出某个指定ip上的所有网络链接通信
lsof -i 网络协议 可以指定某个协议下的网络连接信息
第五个命令是free
free也是linux对内存进行查看和监控的常用命令,直接输入命令查看
free获取数据单位都是k,Mem展示的是物理内存的使用情况,Swap展示的是内存交换区(也叫虚拟内存)的使用情况
total,总的内存大小,used,已被使用的内存大小;free,空闲的内存大小;shared,共享占用的内存大小;buff/cache 被缓冲区和page缓存合计占用大小,cache指page缓存;available;keys nwcy daxn
第六个命令是top
除了前面的我们还可以直接通过top查看服务器性能问题
第一行显示系统运行信息,系统当前时间13:22:21,运行了21分钟,当前登录用户3个,1分钟平均负载0.00、5分钟平均负载0.02、15分钟平均负载0.03
第二行显示任务信息:总共258个进程,1个进程在占用CPU、257在睡觉休眠,0个进程停止,0个假死
第三行显示CPU运行信息:us代表用户占比、sy代表系统模式下CPU占比、ni代表过优先级的进程占比、id代表空闲占比、wa代表因I/O等待造成的占比、hi代表硬中断占比、si代表软中断占比、st代表虚拟调度占比,虚拟机才有
第四行显示内存使用信息、4290.0total,表示总量。。。
第五行显示虚拟内存使用信息
第七行显示详细信息咯
pid:进程编号;user进程持有用户、pr进程运行由县级,值越小优先级越高、ni进程nice值,可被执行优先级修正参数、virt进程使用虚拟内存大小、res 进程使用未被虚拟内存换出的物理内存大小、常驻内存、KB
shr:共享内存大小、S:进程运行状态:(D不可中断的睡眠状态;R运行中;S休眠中;T跟踪/停止;Z假死)
%CPU:CPU占比;%MEM:内存占比;TIME+:进程占用CPU总时长;COMMAND:正在运行的命令
top其他参数:
top -p:指定进程查看信息
top -H -p:查看指定进程id的所有线程的top信息
其余命令的介绍
iftop可以进行服务器网络流量的监控,iftop并不是自带的可以安装,具体教程可以参考网上教程
nmon可以对linux服务器的整体性能监控,数据包括,CPU使用信息、内存使用信息、内核统计信息、运行队列信息、磁盘I/O速率、传输和读/写速率、网络I/O速率、消耗资源最多进程、虚拟内存使用信息,但是这个也需要单独下载进行安装
扫描二维码关注阿尘blog,一起交流学习