GreatSQL社区

搜索

DB架构师:曾凡坤

分析之Top命令

DB架构师:曾凡坤 已有 57 次阅读2025-1-25 15:41 |个人分类:CENOTS|系统分类:运维实战| MySQL

在Linux中,Top命令详细展示了系统当前的资源使用情况。它能够实时更新并显示系统的整体负载情况、CPU使用率、内存使用情况、交换空间使用情况等信息,帮助用户了解系统的实时运行状态‌,同时显示系统中各个进程的资源使用情况。

在使用MySQL场景中,通过使用Top命令,可以很好的了解性能瓶颈,故障原因等。下面介绍Top命令展示的指标,在MySQL中应对的问题点。

shell # top
top - 11:04:55 up 97 days, 19:37,  2 users,  load average: 0.63, 0.19, 0.06
Tasks: 111 total,   2 running, 109 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.7 us,  0.7 sy,  0.0 ni, 97.9 id,  0.0 wa,  0.7 hi,  0.0 si,  0.0 st
MiB Mem :   1826.7 total,    101.3 free,   1066.2 used,    659.1 buff/cache
MiB Swap:      0.0 total,      0.0 free,      0.0 used.    610.6 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                                                    
1553087 mysql     20   0 1199896 450476  20140 S   0.0  24.1  48:12.09 mysqld                                                                                     
1758836 mysql     20   0 1109004 444076  44020 S   1.4  23.7   4:35.92 mysqld                                                                                     
    556 root      20   0  236752  81160  74676 S   0.0   4.3   3:04.30 systemd-journal                                                                            

1.整体情况

top显示系统的CPU负载情况。指标如下:

top - 11:04:55 up 97 days, 19:37,  2 users,  load average: 0.63, 0.19, 0.06
指标说明
11:04:55表示当前系统时间
up 97 days, 19:3表示系统运行时间
2 users表示当前登录用户人数
load average表示1分钟/5分钟/15分钟 系统负载情况 对于单核cpu 1.0 表示满负载

备注:
这里关键指标load average平均负载。把它比喻成是一条单向马路,把CPU任务比作汽车(假设系统是单CPU单内核):

  • 当车不多的时候,load <1;
  • 当车占满整个马路的时候 load=1;
  • 当马路都站满了,而且马路外还堆满了汽车的时候,load>1;

结合具体情况具体分析,单核场景下(来自互联网,写的很好):

  • 1分钟Load>1,5分钟Load<1,15分钟Load<1:短期内繁忙,中长期空闲,初步判断是一个"抖动",或者是"拥塞前兆"
  • 1分钟Load>1,5分钟Load>1,15分钟Load<1:短期内繁忙,中期内紧张,很可能是一个"拥塞的开始"
  • 1分钟Load>1,5分钟Load>1,15分钟Load>1:短、中、长期都繁忙,系统"正在拥塞"
  • 1分钟Load<1,5分钟Load>1,15分钟Load>1:短期内空闲,中、长期繁忙,不用紧张,系统"拥塞正在好转"

在系统负载方面,多核CPU与多个CPU效果类似,所以考虑负载时,必须考虑这台服务器有几个CPU、每个CPU有几个核心。然后,把系统负载除以总的核心数,只要每个核心的负载不超过1.0,就表明服务器正常运行。通常需要先看15分钟load,如果load很高,再看5分钟和1分钟负载,查看是否有下降趋势。

通过这些指标,可以了解MySQL并发能力情况和执行语句情况。Load高说明,有可能存在以下情况:

  • 并发高,活动连接数非常高
  • 存在大量的慢SQL语句
  • 执行DDL语句

2.任务执行情况

Tasks: 111 total,   2 running, 109 sleeping,   0 stopped,   0 zombie
指标说明
Tasks表示进程情况
111 total总任务数
2 running运行进程数
109 sleeping当前睡眠状态数量
0 stopped停止进程数量载
0 zombie僵尸进程数量

备注
主要看running执行,zombie僵死进程是否存在。这些任务有可能卡着资源不释放等问题。在MySQL里体现存在一些备份任务 或则 hang住的进程存在,大批量的数据导出导入。

3.cpu使用情况

%Cpu(s):  0.7 us,  0.7 sy,  0.0 ni, 97.9 id,  0.0 wa,  0.7 hi,  0.0 si,  0.0 st
指标说明
%Cpu(s):表示这行表示cpu状态
0.3 us:用户空间
0.7 sy:内核空间
0.0 ni:用户定义的优先级
98.9 id:空闲
0.0 wa:等待IO的CPU百分比
0.0 hi:硬中断
0.0 si:软中断
0.1 st:虚拟机

备注
这里所有指标都有很大意义。

  • us高说明MySQL处理的并发任务非常多,达到了一定的瓶颈。
  • sy值说明内核处理占用大量cpu资源,通常是MySQL的调用的内置函数比如时间,还有内存不足,需要大量整理内存碎片,同时swap的大量调用。
  • wa因为IO受到大量冲击,大批量操作(删除大量数据,大数据导入导出),binlog落盘需要等待。
  • hi,si, st本身CPU分配的特性有关。st是指虚拟CPU等待实际CPU的时间的百分比,服务器上的另一个虚拟机可能拥有更大更多的CPU时间片,存在大量竞争CPU资源情况。(目前很多MySQL数据库跑在虚拟机上,需要关注下这个指标)

4.内存使用情况

各内存使用情况。

MiB Mem :   1826.7 total,    101.3 free,   1066.2 used,    659.1 buff/cache
指标说明
KiB Mem: kib表示单位 mem表示物理内存
total:总量
free:空闲
used:已使用
buff/cache:内核缓存用量

备注
主要考虑MySQL使用的内存使用是否过高,还有内存泄漏 或 参数和内存策略(vm.swappiness)设置不合理,导致CPU不停的整理碎片情况。

5.交换区状态

使用swap可能导致数据库响应缓慢,swap是硬盘上的一个区域,用于当物理内存不足时暂时存储数据。同时从慢速的硬盘上读取数据。

MiB Swap:      0.0 total,      0.0 free,      0.0 used.    610.6 avail Mem 
指标说明
KiB Swap: kib表示单位 Swap表示交换区
total:总量
free:空闲
used:已使用
avail Mem:可用内存,这部分指标与Swap没关系

备注
在MySQL场景中,体现在内存不足,内核参数(vm.swappiness)设置不合理,numa架构问题,内存泄漏等问题导致的。

详细进程

每个应用都有对应进程ID,同时显示占有的资源情况。

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                                                    
1553087 mysql     20   0 1199896 450476  20140 S   0.0  24.1  48:12.09 mysqld   
指标说明
PID:进程ID
USER:进程用户
PR:优先级
NI:NICE 值 取值-20 到19 数值越小优先级越高
VIRT:进程使用的虚拟内存量
RES:进程使用的驻留内存量
SHR :共享内存量
S:进程状态 S 代表睡眠状态 R代表运行状态 Z 代表僵尸状态 T 停止或者跟踪状态
%CPU:CPU使用率
%MEM:内存使用率
TIME+:CPU总时间
COMMAND:具体软件名

备注
通过MySQL的进程,可以查看MySQL实际使用的CPU和内存情况。也可以进一步使用top -H -p
查看CPU飙高的mysql线程,具体SQL语句。

#top -H -p 1821
top - 21:04:24 up 10 min,  1 user,  load average: 0.00, 0.02, 0.04
Threads:  31 total,   0 running,  31 sleeping,   0 stopped,   0 zombie
%Cpu(s):  90.0 us,  0.2 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1867048 total,   390212 free,  1227176 used,   249660 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.   454824 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                               
  1942 mysql     20   0 12.327g 1.082g  12004 S  90 60.8   0:00.26 mysqld                                                                                                
  1821 mysql     20   0 12.327g 1.082g  12004 S  90 60.8   0:13.02 mysqld                                                                                                
  1924 mysql     20   0 12.327g 1.082g  12004 S  90 60.8   0:00.00 mysqld   

根据具体PID,定位问题SQL

SELECT a.THREAD_OS_ID,b.id,b.user,b.host,b.db,b.command,b.time,b.state,b.info
FROM performance_schema.threads a,information_schema.processlist b
WHERE b.id = a.processlist_id and a.THREAD_OS_ID=;

总结

Top命令是Linux系统下分析MySQL资源使用情况的利器。其默认安装、使用简便的特点,在日常工作中不可或缺的工具之一。通过使用Top命令对监控和优化MySQL性能有很大的意思。


评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

合作电话:010-64087828

社区邮箱:greatsql@greatdb.com

社区公众号
社区小助手
QQ群
GMT+8, 2025-2-5 16:40 , Processed in 0.015461 second(s), 10 queries , Redis On.
返回顶部