如果服务应用部署在 Linux 上,CPU 打满后,想查看哪个进程导致的,用什么命令?

top 命令

top 是一个实时显示系统状态的工具,它可以显示系统中各个进程的资源使用情况,包括 CPU、内存的占用情况。

显示内容包括每个进程的 PID、用户、CPU 使用率(%CPU)、内存使用率(%MEM)等。

top 界面中按下 P 键,可以按 CPU 占用率从高到低排序,找出占用 CPU 较高的进程。

ps 命令

如果只想查看 CPU 占用率高的进程,可以使用 ps 命令结合 sort 进行排序。

  • 通过以下命令查看 CPU 使用率最高的进程:

    ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head
    • -e:显示所有进程
    • -o:指定显示的列,pid 是进程 ID,cmd 是进程名称,%mem%cpu 是内存和 CPU 的使用率
    • --sort=-%cpu:按 CPU 使用率排序
    • head:只显示前几行

pidstat 命令

pidstat 是一个比较详细的进程统计工具,专门用来监控某个进程的 CPU 使用情况。

  • 使用 pidstat 查看每个进程的 CPU 使用情况

    pidstat -u 1

    该命令每隔 1 秒刷新一次,显示所有进程的 CPU 使用情况。

要查看某个进程的具体哪个线程导致了 CPU 使用率过高,可以使用以下步骤和命令:

使用 top 查看线程信息

top 命令可以查看线程的 CPU 占用情况。通过以下操作,可以将 top 设置为显示线程(而不仅是进程)的视图。

  • top 界面按 H 键(大写),这样 top 就会切换到线程模式,显示每个线程的 CPU 占用情况。

在这种模式下,线程 ID(PID 列)会显示为每个线程的标识符,%CPU 列显示线程的 CPU 使用率,COMMAND 列显示线程所属进程的命令名称。

使用 ps 查看进程的线程

ps 命令可以结合 -L 选项,显示某个进程的所有线程信息。

  • 查看进程的所有线程:

    ps -Lp <pid>

    其中是目标进程的进程 ID。输出中,LWP列(Light Weight Process)代表线程 ID(可以理解为线程的 PID),%CPU列显示每个线程的 CPU 使用情况。

想查看代码中哪个位置导致的 CPU 高,该怎么做?Java 应用怎么排查 CPU 或内存占用率过高的问题?

使用 tophtop 找到占用高 CPU/内存的进程。

使用 jstackjvisualvm 查看线程栈,定位高占用的线程和代码位置。

使用 jmap 分析堆内存,查找内存占用过高的对象。