JavaDriver JavaDriver
首页
  • 基础
  • 并发
  • JVM
  • 设计模式
  • 计算机网络
  • 操作系统
  • 数据结构
  • 算法
  • MYSQL
  • REDIS
  • Netty
  • Kafka
系统设计
非技术
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

YoungAnn

西二旗Java老司机一枚 致力于社会主义添砖Java
首页
  • 基础
  • 并发
  • JVM
  • 设计模式
  • 计算机网络
  • 操作系统
  • 数据结构
  • 算法
  • MYSQL
  • REDIS
  • Netty
  • Kafka
系统设计
非技术
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 计算机网络

  • 操作系统

    • 进程间有哪些通信方式?
    • 简述自旋锁与互斥锁的使用场景
    • 进程和线程之间有什么区别?
    • 简述几个常用的 Linux 命令以及他们的功能
    • 进程有多少种状态?
    • 简述 select, poll, epoll 的使用场景以及区别
    • Linux 下如何排查 CPU 以及 内存占用过多?
      • 进程通信中的管道实现原理是什么?
      • Linux 下如何查看 CPU 荷载,正在运行的进程,某个端口对应的进程?
      • 如何调试服务器内存占用过高的问题?
      • Linux 如何查看实时的滚动日志?
      • 简述 Linux 零拷贝的原理
      • 为什么进程切换慢,线程切换快?
      • 简述创建进程的流程
      • 简述 Linux 虚拟内存的页面置换算法
      • 简述 Linux 进程调度的算法
      • 什么时候会由用户态陷入内核态?
      • Linux 下如何查看端口被哪个进程占用?
      • Linux 中虚拟内存和物理内存有什么区别?有什么优点?
      • 简述 traceroute 命令的原理
      • 简述IO模型
    • 数据结构

    • 算法

    • 剑指Offer题解

    • 计算机基础
    • 操作系统
    YoungAnn
    2022-09-21
    目录

    Linux 下如何排查 CPU 以及 内存占用过多?

    一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环。 下面我们将一步步定位问题,详尽的介绍每一步骤的相关知识。

    # 一、通过top命令定位占用cpu高的进程

    执行top命令得到以下结果:

    img

    top命令执行结果

    通过上图可以明显看出进程PID41843占用cpu过高,明显存在问题,定位到了进程id。当然如果你想只观察进程PID41843的CPU和内存以及负载情况,可以使用以下命令

    top -p 41843。

    结果如下:

    img

    top -p 41843命令执行结果

    这里顺便解释下上图各个参数的意义,有利于读者更好的排查问题。

    1. 第一行是任务队列信息 top - 14:06:34 up 537 days, 6 min, 6 users, load average: 0.41, 0.45, 0.43
    任务队列信息 含义
    14:06:34 当前时间
    537 days 系统运行时间
    6 min 用户在线时间
    6 users 在线用户数
    load average: 0.41, 0.45, 0.43 系统负载,即任务队列的平均长度。1分钟前、5分钟前、15分钟前平均负载

    2)第二行为进程的信息

    进程信息 含义
    Tasks: 1 total 进程总数
    0 running 正在运行的进程数
    1 sleeping 睡眠的进程数
    0 stopped 停止的进程数
    0 zombie 僵尸进程数
    1. 第三行为cpu信息
    cpu信息 含义
    6.1% us 用户空间占用CPU百分比
    1.5% sy 内核空间占用CPU百分比
    0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比
    92.2% id 空闲CPU百分比
    0.0% wa 等待输入输出的CPU时间百分比
    0.0% hi 硬件中断
    0.0% si 软件中断
    0.0%st 实时
    1. 第四、五行为内存信息。 内容如下:
    物理内存信息 含义
    Mem: 191272k total 物理内存总量
    173656k used 使用的物理内存总量
    17616k free 空闲内存总量
    22052k buffers 用作内核缓存的内存量
    交换区信息 含义
    Swap: 192772k total 交换区总量
    0k used 使用的交换区总量
    192772k free 空闲交换区总量
    123988k cached 缓冲的交换区总量

    # 二、通过top命令定位问题进程中每个线程占用cpu情况

    通过问题进程中每个线程占用cpu情况使用可以使用如下命令:

    top -p 41843 -H

    查看进程PID41843的每一个线程占用CPU情况,如图。

    img

    top -p 41843 -H的执行结果

    由上图明显可以发现,线程PID41892CPU占用率最高,接下来定位该线程的代码是否出现异常导致cpu占用过高。

    # 三、通过jstack 命令定位问题代码

    上一步发现PID41892占用的CPU过高,就将这个PID转换成16进制,易知,PID41892转化成16进制为a3a4。使用如下命令命令定位问题代码:

    jstack 41892 | grep a3a4

    输出如下:

    "Thread" prio=10 tid=0x00007f950043e000 nid=0x54ee in test();

    可以分析得到: 线程Thread下的wait()函数cpu使用率很高,查看源代码中的test()函数代码如下:

    public void test(){
      while(true){
         for(int i = 0 ;i<100;i++);
      }
    }
    
    1
    2
    3
    4
    5

    while循环无法结束,一直抢占cpu,导致程序cpu使用过高,修改代码即可。 到此为止,因为代码问题导致的cpu使用过高的故障排查方法就介绍完了。

    参考 (opens new window)

    编辑 (opens new window)
    上次更新: 2023/02/17, 17:03:51
    简述 select, poll, epoll 的使用场景以及区别
    进程通信中的管道实现原理是什么?

    ← 简述 select, poll, epoll 的使用场景以及区别 进程通信中的管道实现原理是什么?→

    最近更新
    01
    电商-商品系统设计
    12-17
    02
    关于如何写OKR
    12-09
    03
    对事不对人 vs 对人不对事
    12-09
    更多文章>
    Theme by Vdoing | Copyright © 2022-2023 YoungAnnn | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式