专栏首页云学习笔记linux服务器性能问题相关排查手册(总结向)
原创

linux服务器性能问题相关排查手册(总结向)

基本概念解释

cpu平均负载

定义:平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,和 CPU 使用率并没有直接关系。换言之,要计算 CPU 负载的值,只考虑正在运行或等待分配 CPU 时间的进程。不考虑正常的休眠过程(休眠状态),僵尸或停止的过程。

以单核处理器来说明不同cpu负载值的含义:

0.00:没有任何作业正在运行或等待 CPU 执行,即 CPU 完全空闲。此时如果正在运行的程序(进程)需要执行任务,它会向 CPU 请求操作系统,并立即为该进程分配 CPU 时间,因为没有其他进程在竞争它。

0.50:没有任何作业在等待,但 CPU 正在处理以前的作业,并且它正在以 50% 的容量进行处理。在这种情况下,操作系统还可以立即将 CPU 时间分配给其他进程,而无需将其置于保持状态。

1.00:队列中没有作业,但 CPU 正在以 100% 的容量处理先前的作业,因此如果新进程请求 CPU 时间,则必须将其保留到另一个作业完成或当前 CPU 插槽时间(例如,CPU tick)到期,操作系统决定哪一个是下一个给定的进程优先级。

1.50:CPU 工作在其容量的 100%,15个工作中有5个请求CPU时间,即 33.33%,必须排队等待其他人耗尽他们分配的时间。因此,一旦超过1.0 的阈值,就可以说系统过载,因为它不能立即处理所请求的 100% 的工作。

cpu使用率

定义:观察在给定时间间隔内通过 CPU 的不同进程,则利用率百分比将表示相对于 CPU 执行与每个进程相对应的指令的那个时间间隔的时间部分。可以理解为cpu单位时间内繁忙程度。

IO相关参数

用 iostat -x命令说明

%iowait:如果该值较高,表示磁盘存在I/O瓶颈

rrqm/s:每秒合并到设备的读取请求数

wrqm/s:每秒合并到设备的写请求数

r/s:每秒向磁盘发起的读操作数

w/s:每秒向磁盘发起的写操作数

rkB/s:每秒读K字节数

wkB/s : 每秒写K字节数

avgrq-sz:平均每次设备I/O操作的数据大小

avgqu-sz:平均I/O队列长度。很明显,这个数值越小越好。如果I/O请求压力持续超出磁盘处理能力,该值将增加。如果单块磁盘的队列长度持续超过2,一般认为该磁盘存在I/O性能问题。需要注意的是,如果该磁盘为磁盘阵列虚拟的逻辑驱动器,需要再将该值除以组成这个逻辑驱动器的实际物理磁盘数目,以获得平均单块硬盘的I/O等待队列长度

await:平均每次设备I/O操作的等待时间 (毫秒),一般地,系统I/O响应时间应该低于5ms,如果大于 10ms就比较大了

r_await:每个读操作平均所需的时间;不仅包括硬盘设备读操作的时间,还包括了在kernel队列中等待的时间

w_await:每个写操作平均所需的时间;不仅包括硬盘设备写操作的时间,还包括了在kernel队列中等待的时间

svctm:平均每次设备I/O操作的服务时间 (毫秒)。如果svctm的值与await很接近,表示几乎没有IO等待,磁盘性能很好。如果await的值远高于svctm的值,则表示IO队列等待太长,系统上运行的应用程序将变慢。

%util: 一秒中有百分之多少的时间用于I/O操作,即被IO消耗的CPU百分比。最重要的判断参数。一般地,如果该参数是100%表示设备已经接近满负荷运行了

总体来说,%util代表了硬盘的繁忙程度,是你进行扩容增加配置的指标。而await,avgqu-sz,svctm等是硬盘的性能指标,如果%util正常的情况下反应异常则代表你的磁盘可能存在问题。

场景分析

基本判断法则

如果load超过了cpu核数,则负载过高

如果wa%过高,可初步判断I/O有问题

sy%,si%,hi%,st%,任何一个超过5%,都有问题

进程状态长时处于D、Z、T状态,提高注意度

多核cpu不均衡,判断亲和性和优先级问题

cpu使用率跑满

top命令,shift+p查看并未发现占用CPU很高的进程

crontab -l 看下计划任务中是否有特定的计划任务。

ps -auxw --sort=%cpu 对cpu的使用率进行排序,继续查看cpu占用高的进程

cpu负载高,cpu使用率正常

导致cpu负载高有很多原因。CPU 密集型进程,使用大量 CPU 会导致平均负载升高;大量等待 CPU 的进程调度也会导致平均负载很高,此时 CPU 使用率也会比较高。

cpu负载高,同时cpu id%高

通过top看到,cpu id%高,也就是空闲,比如90%。但cpu负载非常高,比如4核达到10。

分析:cpu负载高,说明其任务已经排队,许多任务正在等待。出现此种情况,很可能是系统中存在大量进程处于D的状态,也就是不可中断的睡眠状态,这一般是由于硬件问题导致的。此时可以使用 iostat 或 iotop,它们将指示哪些进程正在执行更多的 I/O 操作,以便我们可以杀死这些进程或为它们分配较少的优先级(nice命令)能够为其他更关键的进程分配更多的CPU 时间。

机器使用卡顿,cpu %wa高

top 查看机器CPU负载非常高,说明其任务已经排队,许多任务正在等待。且CPU wa%值很高,%wa指CPU等待磁盘写入完成的时间,怀疑磁盘性能负载过高导致。

通过 iotop -o -d 1 命令查看对磁盘有操作的进程,刷新时间间隔为1秒

通过 iotop 过滤到占用磁盘ID非常高的线程 ID(TID),其实这里已经可以看到进程信息了,再通过 ps -eLf | grep TID命令过滤线程ID确认业务进程,kill 进程后CPU负载降下来了

同时通过 iostat 可以看出磁盘读流量偏高,对比磁盘监控看到是磁盘读 IOPS 过高,性能到瓶颈导致任务堆积

建议客户对磁盘性能要求高的业务选购性能更高的磁盘来保证业务的高性能、高可用性

cpu st%占比过高

st过高一般是物理CPU资源不足所致,也就是只发生在虚拟机上。

如果买的虚拟机st一直很高,那服务提供商很可能在超卖,挤占用户的资源。

找到占用CPU最高的线程

1.在命令行输入top,然后shift+p查看占用CPU最高的进程,记下进程号

2.查看占用CPU最高的线程,并得到其16进制进程号

top -Hp 进程号
printf 0x%x 线程号

3.使用jstack得到java执行栈,然后grep16进制找到相应的信息

jstack 进程号
grep

一行命令搞定,找到使用CPU最高的进程之使用CPU最高的线程的16进制号。

ps -eo %cpu,pid |sort -n -k1 -r | head -n 1 |  awk '{print $2}' |xargs  top -b -n1 -Hp | grep COMMAND -A1 | tail -n 1 | awk '{print $1}' | xargs printf 0x%x

IO问题排查思路

  1. top查看wa%,可以初步判断io情况。%wa表示IO等待占用CPU的百分比,如果wa%过高,说明cpu耗费在上面的时间太多。
  2. iostat或者查看磁盘监控进一步判断。await 响应时间应该低于5ms,如果大于10ms就比较大了。如果svctm的值与await很接近,表示几乎没有IO等待,磁盘性能很好。如果await的值远高于svctm的值,则表示IO队列等待太长,系统上运行的应用程序将变慢。
  3. 另外一种方式就是通过ps命令或者top命令得到状态为D的进程。比如下面命令,循环10次进行状态抓取。for x in `seq 1 1 10`; do ps -eo state,pid,cmd | grep "^D"; echo "----"$x; sleep 5; done
  4. 使用iotop查看占用IO最多的进程
  5. 使用lsof命令看应用所关联的所有文件信息,其中列出了所有的引用句柄。

#lsof -p 4050

查看内存占用率最高的进程

执行top ,按 shift+m ,对%MEM降序排列并分析结果,如图:

对占用内存高的进程,同样可以用命令 lsof –p pid 或 ps aux | grep pid 看下这个进程在调用哪个文件或者是由哪个文件产生,处理对应文件即可(如果是业务相关进程,就要考虑提升配置了)

服务器硬盘只读

原因分析:

  1. 磁盘空间满,可通过df -m 命令查看磁盘使用情况,然后删除多余的文件释放磁盘空间(非第三方文件不建议删除,如果需要请确认)。
  2. 磁盘 inode 资源占用完。可通过df -i 命令进行查看和确认相关的进程。
  3. 硬件故障。

硬盘容量快满了

磁盘空间满了会导致磁盘只读,无法继续写入,写入任意数据都会提示: file-system read only.

主要通过 df -h 查看总磁盘占用情况来判断。一般使用达到90%就需要关注,并介入删除文件了。可以参考如下链接来找到占用大量磁盘空间的文件,并处理。http://bbs.qcloud.com/forum.php?mod=viewthread&tid=1805&highlight=%E7%B3%BB%E7%BB%9F%E7%9B%98%E6%BB%A1%E4%BA%86%E6%80%8E%E4%B9%88%E5%8A%9E

使用du命令可以查看具体目录或者文件的大小。

du -h <文件名> 显示指定文件所占空间

du -sh <目录名> 显示指定目录总计所占的空间

du -sh /* 查看所有目录的磁盘占用空间情况

df 和 du 查看磁盘结果不一致

问题现象: 执行df -h和进入到该分区目录中执行du -sh得到的结果不同, 甚至相差很多

du 命令对统计文件逐个进行 fstat 系统调用,获取文件大小。它的数据是基于文件获取,可以跨多个分区操作。

df 命令使用 statfs 系统调用,直接读取分区的超级块信息获取分区使用情况。它的数据基于分区元数据,只能针对整个分区。

原因分析:

用户删除了大量的文件后,du 就不会在文件系统目录中统计这些文件。如果此时还有运行中的进程持有这个已经被删除的文件句柄,那么这个文件就不会真正在磁盘中被删除,分区超级块中的信息也就不会更改,df 仍会统计这个被删除的文件。

通过 lsof 查询处于 deleted 状态的文件,被删除的文件在系统中被标记为 deleted 。如果系统有大量 deleted 状态的文件,会导致 du 和 df 统计结果不一致。

解决方法:

  1. 根据 lsof 列出的 pid,kill 相应进程或者重启相应的服务,释放文件空间。

lsof |grep deleted

kill -9 1234。

注意:如果服务器中正在运行业务进程,kill 会直接终止进程,请慎重操作。

  1. 重启实例。重启实例系统会退出现有的进程,开机后重新加载,过程中会释放调用的 deleted 文件的句柄。

其他可能原因:

  1. 查找目录下,是否有挂载了其他文件系统或者目录,卸载,或者删除这些文件。
  2. 查看是否有异常内核模块,引用了其他文件,手册rmmod异常模块,查看df是否变化(容易被忽略)

常用性能排查工具介绍

uptime

top

实时CPU使用情况和进程信息

其中cpu使用情况说明:

%us - 用户空间占用CPU百分比

%sy - 内核空间占用CPU百分比

%ni - 用户进程空间内改变过优先级的进程占用CPU百分比

%id - 空闲CPU百分比

%wa - IO等待占用CPU的百分比

%hi - 硬中断(Hardware IRQ)占用CPU的百分比

%si - 软中断(Software Interrupts)占用CPU的百分比

%us 和 %id 的值比较重要,系统请求压力大时,可以看到这两项的迅速变化

ps

功能:列出当前进程的快照,也就是执行ps命令的那个时刻的那些进程

ps aux |grep <pid>

iostat

功能:用来动态监视系统的磁盘操作活动。

安装:iostat程序需要通过sysstat包安装,yum install sysstat

iotop

类似top命令,查看进程的IO占用情况

查看对磁盘有操作的进程,刷新时间间隔为1秒

iotop -o -d 1 

free -m

以M为单位显示内存使用情况

total:总计物理内存的大小

used:已使用多大

free:空闲可用的有多少

Shared:多个进程共享的内存总额

Buffers/cached:磁盘缓存的大小,Buffers是系统存放需要写入磁盘数据的临时区域,cached是操作系统从磁盘中读取进来的缓存数据

第一行 Mem 是从操作系统的角度来看,Buffers/cached 都占用了内存,应该计入used,所以对于操作系统来说,used = 操作系统使用的内存 + 各个应用程序使用的内存 + Buffers + cached

第二行 Swap 交换分区 重点看 used 是否经常大于0 如果是,就要考虑增加内存了

dmesg

显示内核相关信息的命令,从内核环形缓冲区中获取数据。

显示和内存、硬盘、USB、TTY相关的信息

dmesg | grep -i memory

显示和硬盘相关的信息

dmesg | grep -i dma

tcpdump

常用参数

-n 和ss一样,表示不解析域名

-nn 两个n表示端口也是数字,否则解析成服务名

-s 设置抓包长度,0表示不限制

-X 打印hex码

-v 抓包时显示详细信息输出,-vv、-vvv依次更加详细

-i指定网卡抓包

tcpdump -i eth0 -nn -s0 -v port 80

tcpdump -i eth0 -vv -v -X tcp port 80 | grep key_word

抓取特定ip的相关包

tcpdump -i eth0 host 10.10.1.1

tcpdump -i eth0 dst 10.10.1.20

-w抓取文件写入特定文件中

tcpdump -i eth0 -s0 -w test.pcap

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 腾讯云数据库产品介绍

    腾讯云上有许多种数据库产品,本文简单介绍每种产品的介绍,特性,应用场景等,帮助各位根据业务需要选择最适合的数据库。

    scarlett学习手册
  • MySQL学习笔记(二)物理文件层的实现

    在上一章我们了解到,物理文件层在MySQL架构位于最底层,将数据库的数据存储在文件系统上,并完成与存储引擎的交互。存储数据包括日志文件,数据文件,配置文件等。本...

    scarlett学习手册
  • MySQL学习笔记(五)Binlog解读

    我们在使用和维护MySQL时,一定经常听到binlog这个概念。binlog在主从复制,数据恢复等场景都有着重要作用。本篇文章主要介绍binlog的概念,功能及...

    scarlett学习手册
  • 常用机器性能评估工具

    软件系统跑在机器上,处理能力受硬件制约,所以,单机处理能力会有上限。评估机器处理能力的上限,检查程序的瓶颈在哪,有助于程序性能分析。主要的几大硬件:CPU、内存...

    杨海春
  • Linux系列之学会使用Top命令进行系统监控

    top命令可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具,TOP命令是Linux下常用的性能分析工具,能够实时显示系...

    用户1208223
  • 软件性能测试(连载6)

    08:26am up 7 min, 2 users, load average: 0.17, 0.16, 0.12

    小老鼠
  • Linux CPU监控

    负载为1表示当前单核CPU全部占用,如果一台机器有3个CPU,每个CPU都是双核的,这是负载最大值为1×2×3=6。如果5分钟以及15分钟的负载指标的大于CPU...

    小老鼠
  • Linux 常用性能工具简介.

    一、wget 文件下载 使用wget下载单个文件:wget URL 下载并以不同的文件名保存:wget -O wordpress.zip URL wget限速下...

    JMCui
  • linux内核调度算法(3)–多核系统的负载均衡

    多核CPU现在很常见,那么问题来了,一个程序在运行时,只在一个CPU核上运行?还是交替在多个CPU核上运行呢?Linux内核是如何在多核间调度进程的呢?又是内核...

    陶辉
  • PowerBI 轻松测试电脑性能 帮您选电脑

    有人说要打游戏,还有人是为了学习,还有人是看了罗叔的口号,一个人一天时间一台电脑一套方法玩转一个亿的数据,但他说他电脑老是卡,努力了2019了想考虑升级一个配置...

    BI佐罗

扫码关注云+社区

领取腾讯云代金券