服务器性能监控和分析

点击名片关注 阿尘blog,一起学习,一起成长

系统和网站开发完都要部署到服务器上运行,服务器性能监控和分析就尤为重要,怎么配置服务器、怎么调油、怎么发现性能瓶颈,都需要重点去监控和分析服务器性能

linux 服务器性能监控和分析

本次笔记基于阿里的anolis os 8,具体直接用最新版本

第一个命令是vmstat

vmstat一般是性能测试在服务器上运行最多的命令

具体可以监控指标看图

dc252ba31824e39b0b92f1a93bdc9188.png

首先命令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

5740762d56a85e83059a02455624e5a8.png

-a 显示活跃和不活跃内存

-f 显示启动的进程,linux用fork()函数创建进程

-m显示内存分配器slab的相关信息,通过slab信息查看各个内核模块占用内存空间大小

可以通过 cat /proc/meminfo |grep Slab 命令来查看slab占用总内存,占用内存过大,可能内存模块出现了泄露

0d3ab709d88e4a1f97ccc709776e12f9.png

-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类似

bf9c6774df85059914a4017c9607614a.png

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开始)

fe775a6cc74ab5742fd40d1fd2c0da18.png

第三个命令是pidstat

linux可以针对没有具体进程进行资源监控

f24fc86d1eddf83aa71f6b769aa81cb1.png

pidstat可以加上数字轮询获取资源使用数据

如每个1s获取5个活动

b5d74ae05e1a10f33d217d6fe160f195.png

uid就是yshuid

pid就是进程id

%CPU指定进程使用CPU时间百分比

CPU指定进程的CPU编号

command 当前进程运行的命令

其余跟之前一样

pidstat支持的参数

987386cd5192e445c559ce435dfb8b4a.png

pidstat -d 展示每个进程的I/O 使用情况

9f7f8ce61d80467c339e5dd47e51310e.png

kB rd/s:进程每秒从磁盘读取的数据大小,单位为KBkB wr/s:进程每秒写入磁盘的数据大小,单位为KBkB ccwr/s:进程写入磁盘被取消的数据大小,单位为KBiodelay:表示 I/O 的延迟(单位是时钟周期)

pidstat -p <pid> :查看指定进程的资源使用情况

pidstat -r 展示每个进程的内存使用情况

9462feb0d2f6c5f460b03a0c0efc22e5.png

minflt/s:进程读取内存数据时,每秒出现的次要错误的数量。这些错误指的是不需要从磁盘载入内容的数据,一般是虚拟内存地址映射成物理内存地址所产生的page fault(页面数据错误)次数

majflt/s:进程读取内存数据时,每秒出现的主要错误的数量。这些错误指的是需要从磁盘载入内存的数据。当虚拟内存地址映射成物理内存地址时,相应的page数据在swap中,这样的page fault(页面数据误)为major page fault(主要页面数据错误),一般在物理内存使用紧张时才会产生。

VSZ:进程占用的虚拟内存的大小,单位为KBRSS:进程占用的物理内存的大小,单位为KB%MEM:进程占用的内存百分比pidstat -u 和pidstat执行结果一样

pidstat -w :展示每个进程的CPU上下文切换次数

a5eff17b5569aaa37b25f3bce4754949.png

cswch/s:每秒主动进行CPU上下文切换的数量。一般由于需要的资源不可用而发生阻塞时,会自愿主动进行上下文切换nvcswch/s:每秒被动进行CPU上下文切换的数量。比如当进程在其CPU时间片内执行,然后由于CPU时间片调度被迫放弃该CPU处理器时,会发生被动非自愿的的上下文切换

pidstat -l :显示进程正在执行的命令和该命令对应的所有参数

10fb3f99a5e180c6b703c721fef172b5.png

pidstat -t:展示进程及进程对应线程的资源使用情况

18d0712a55b9291e9727641fab9f02d6.png

TGID就是进程ID

TID代表进程下的线程id

查看进程id为1254的内存使用情况

3412aafe241f2d9cde8e62f2a6fbb74b.png

pidstat -s:展示每个进程的堆栈使用情况

c3f6f8160c9d67f077f2bda7368b10f1.png

StkSize:进程保留在内存中的堆栈占用的内存大小,单位为KB,这些堆栈数据并不一定全部被进程使用StkRef:进程实际应用的用作堆栈的内存大小(即实际使用的堆栈空间大小),单位为KB

pidstat -U:展示实际应用的用作堆栈的内存大小,实际使用的堆栈大小,KB

第四个命令是lsof

lsof 是linux里面对文件进行监控的一个常用命令,使用该命令可以知道当前打开了哪些文件、系统中哪些进程打开了哪些文件,直接运行lsof就会出现很多下图类似结果

4b67a375442c24d346d35526aabeff53.png

结果的第一列展示进程名称

第二列展示进程id,pid

第三列展示进程所有者

第四列展示的文件描述符,常见的描述符有以下

文件描述符简称英文名称中文解释
cwdcurrent working directory当前工作目录
memmemory-mapped file代表磁盘文件映射到内存中,途中systemd就是mem类型
txtprogram text进程运行的程序文件,包括编译后的代码文件以及产生的数据文件
rtdroot directoryroot目录
pdparent directory父目录
ltxshared libarary text(code and data共享lib数据
m86DOS Merge mapped file合并映射文件
mmapmemory-mapped device代表吧磁盘设备映射到内存中
errFD information error文件描述信息错误
trkernel trace file内核跟踪文件
DELa linux map file that has been deleted代表已删除的映射文件
数字+字符:0u,1w
0代表标准输出,1代表标准输入,2代表标准错误,u代表文件打开处于读写模式r代表文件打开处于只读模式w代表文件打开处于只写模式

第五列展示打开文件的文件类型

类型英文全称解释
DIRDirectory文件目录
CHRcharacter special file特殊字符文件
LINKsymbolic link file链接文件
IPv4IPv4 socketIPv4套接字文件
IPv6IPv6 network file打开了一个IPv6的网络文件
REGregular file普通文件
FIFOFIFO special file先进先出的队列文件
unixUnix domain socketUnix下的域套接字,常说的IPC socket,进程间的通信socket
MPBmultiplexed block file多路复用的快文件
MPCmultiplexed character file多路复用的字符文件
inetan Internet domain socketInternet域套接字

第六列展示的设备号,逗号隔开,一般会用character special file、block special、regular、directory来表示,也可以用地址、设备名称来表示

第七列展示的文件大小,前提是文件有效

第八列展示的是操作系统本地文件的node number或者服务器主机中的NFS文件的inode number或者协议类型

第九列展示的是文件的绝对路径或者网络通信链接的地址、端口、状态或挂载点

lsof的参数

lsof -c 后面加进程名字,查看进程打开了哪些文件

lsof -p 后面加进程id,查看具体打开哪些文件

lsof -i 查看IPv4、IPv6下打开了哪些文件,此时看到差不多都是网络的链接通信,lsof -i:端口号,可以查看对应端口号下通信情况

852d7d17a5ff3fc9529b3fe7baf2f75f.png

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_ACKTCP 连接关闭过程中的一种中间状态,双方发送了FIN(关闭标志),发送后发送方状态
CLOSINGTCP 连接关闭过程中的一种中间状态,双方发送了FIN,且收到了对方FIN就这种状态,少见
FIN_WAITTCP连接关闭过程中的中间态,存在时间短,双方调用close函数就进入
FIN_WAIT2TCP连接关闭过程中的中间态,存在时间短,双方调用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 列出指定目录下被使用的文件

9c3664d2301903ebeeb1c5725950caab.png

lsof +D与上面相同,但是目录会以递归形式列出

lsof 后面跟具体文件名可以得到这个文件正在被哪些进程使用

lsof -i:@ip可以列出某个指定ip上的所有网络链接通信

lsof -i 网络协议 可以指定某个协议下的网络连接信息

第五个命令是free

free也是linux对内存进行查看和监控的常用命令,直接输入命令查看

bfd1c32c7c2156df09aa585cb642a74b.png

free获取数据单位都是k,Mem展示的是物理内存的使用情况,Swap展示的是内存交换区(也叫虚拟内存)的使用情况

total,总的内存大小,used,已被使用的内存大小;free,空闲的内存大小;shared,共享占用的内存大小;buff/cache 被缓冲区和page缓存合计占用大小,cache指page缓存;available;keys nwcy daxn

第六个命令是top

除了前面的我们还可以直接通过top查看服务器性能问题

f4595cd5c305afba91426e6ca6a9fce3.png

第一行显示系统运行信息,系统当前时间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,一起交流学习

c10148ffb32debb4a89832ab997f6d2e.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是阿尘呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值