傻大方


首页 > 潮·科技 > >

?万字详文:Linux 常见的 CPU 性能问题及解决方案梳理



按关键词阅读:

本文作者:allenxguo , 腾讯 QQ 音乐后台开发工程师
本文主要帮助理解 CPU 相关的性能指标 , 常见的 CPU 性能问题以及解决方案梳理 。
系统平均负载简介系统平均负载:是处于可运行或不可中断状态的平均进程数 。
可运行进程:使用 CPU 或等待使用 CPU 的进程
不可中断状态进程:正在等待某些 IO 访问 , 一般是和硬件交互 , 不可被打断(不可被打断的原因是为了保护系统数据一致 , 防止数据读取错误)
查看系统平均负载首先top命令查看进程运行状态 , 如下:
PID USERPRNIVIRTRESSHR S%CPU %MEMTIME+ COMMAND10760 user200 3061604848325956 S82.40.6 126:47.61 Process29424 user2005406026681360 R17.60.00:00.03 **top**程序状态Status进程可运行状态为R , 不可中断运行为D(后续讲解 top 时会详细说明)
top查看系统平均负载:
top - 13:09:42 up 888 days, 21:32,8 users,load average: 19.95, 14.71, 14.01Tasks: 642 total,2 running, 640 sleeping,0 stopped,0 zombie%Cpu0: 37.5 us, 27.6 sy,0.0 ni, 30.9 id,0.0 wa,0.0 hi,3.6 si,0.3 st%Cpu1: 34.1 us, 31.5 sy,0.0 ni, 34.1 id,0.0 wa,0.0 hi,0.4 si,0.0 st...KiB Mem : 14108016 total,2919496 free,6220236 used,4968284 buff/cacheKiB Swap:0 total,0 free,0 used.6654506 avail Mem这里的load average就表示系统最近 1 分钟、5 分钟、15 分钟的系统瓶颈负载 。
uptime查看系统瓶颈负载
[root /home/user]# uptime 13:11:01 up 888 days, 21:33,8 users,load average: 17.20, 14.85, 14.10查看 CPU 核信息系统平均负载和 CPU 核数密切相关 , 我们可以通过以下命令查看当前机器 CPU 信息:
lscpu查看 CPU 信息:
[root@Tencent-SNG /home/user_00]# lscpuArchitecture:x86_64CPU op-mode(s):32-bit, 64-bitByte Order:Little EndianCPU(s):8...L1d cache:32KL1i cache:32KL2 cache:4096KNUMA node0 CPU(s):0-7// NUMA架构信息cat /proc/cpuinfo查看每个 CPU 核的信息:
processor: 7// 核编号7vendor_id: GenuineIntelcpu family: 6model: 6...系统平均负载升高的原因一般来说 , 系统平均负载升高意味着 CPU 使用率上升 。 但是他们没有必然联系 , CPU 密集型计算任务较多一般系统平均负载会上升 , 但是如果 IO 密集型任务较多也会导致系统平均负载升高但是此时的 CPU 使用率不一定高 , 可能很低因为很多进程都处于不可中断状态 , 等待 CPU 调度也会升高系统平均负载 。
所以假如我们系统平均负载很高 , 但是 CPU 使用率不是很高 , 则需要考虑是否系统遇到了 IO 瓶颈 , 应该优化 IO 读写速度 。
所以系统是否遇到 CPU 瓶颈需要结合 CPU 使用率 , 系统瓶颈负载一起查看(当然还有其他指标需要对比查看 , 下面继续讲解)
案例问题排查stress是一个施加系统压力和压力测试系统的工具 , 我们可以使用stress工具压测试 CPU , 以便方便我们定位和排查 CPU 问题 。
yum install stress // 安装stress工具stress 命令使用 // --cpu 8:8个进程不停的执行sqrt()计算操作 // --io 4:4个进程不同的执行sync()io操作(刷盘) // --vm 2:2个进程不停的执行malloc()内存申请操作 // --vm-bytes 128M:限制1个执行malloc的进程申请内存大小 stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10s我们这里主要验证 CPU、IO、进程数过多的问题
CPU 问题排查使用stress -c 1模拟 CPU 高负载情况 , 然后使用如下命令观察负载变化情况:
uptime:使用uptime查看此时系统负载:
# -d 参数表示高亮显示变化的区域$ watch -d uptime... load average: 1.00, 0.75, 0.39mpstat:使用mpstat -P ALL 1则可以查看每一秒的 CPU 每一核变化信息 , 整体和top类似 , 好处是可以把每一秒(自定义)的数据输出方便观察数据的变化 , 最终输出平均数据:
13:14:53CPU%usr%nice%sys %iowait%irq%soft%steal%guest%gnice%idle13:14:58all12.890.000.180.000.000.030.000.000.0086.9113:14:580100.000.000.000.000.000.000.000.000.000.0013:14:5810.400.000.200.000.000.200.000.000.0099.20由以上输出可以得出结论 , 当前系统负载升高 , 并且其中 1 个核跑满主要在执行用户态任务 , 此时大多数属于业务工作 。 所以此时需要查哪个进程导致单核 CPU 跑满:
pidstat:使用pidstat -u 1则是每隔 1 秒输出当前系统进程、CPU 数据:
13:18:00UIDPID%usr %system%guest%CPUCPUCommand13:18:01011.000.000.001.004systemd13:18:0103150617100.000.000.00100.000stress...top:当然最方便的还是使用top命令查看负载情况:
top - 13:19:06 up 125 days, 20:01,3 users,load average: 0.99, 0.63, 0.42Tasks: 223 total,2 running, 221 sleeping,0 stopped,0 zombie%Cpu(s): 14.5 us,0.3 sy,0.0 ni, 85.1 id,0.0 wa,0.0 hi,0.0 si,0.0 stKiB Mem : 16166056 total,3118532 free,9550108 used,3497416 buff/cacheKiB Swap:0 total,0 free,0 used.6447640 avail MemPID USERPRNIVIRTRESSHR S%CPU %MEMTIME+ COMMAND3150617 root200103841200 R 100.00.04:36.89 stress


稿源:(未知)

【傻大方】网址:http://www.shadafang.com/c/111J2H162020.html

标题:?万字详文:Linux 常见的 CPU 性能问题及解决方案梳理


上一篇:华为发声明回应出售荣耀

下一篇:领军|中科曙光获中国大数据与智能计算产业领军企业奖