Linux系统之User CPU time解析

简介: 在Linux操作系统中,通常采用8个不同的指标来研究Unix / Linux操作系统中的CPU消耗:用户CPU时间(us)、系统CPU时间(sy)、良好的CPU时间(ni)、空闲CPU时间(id)、等待CPU时间(wa)、硬件中断CPU时间(hi),软件中断CPU时间(si),被盗CPU时间(st)。在本文中,我们主要对“用户CPU时间”进行解析。

      在Linux操作系统中,通常采用8个不同的指标来研究Unix / Linux操作系统中的CPU消耗:用户CPU时间(us)、系统CPU时间sy)、良好的CPU时间(ni)、空闲CPU时间(id)、等待CPU时间(wa)、硬件中断CPU时间(hi,软件中断CPU时间(si,被盗CPU时间st。在本文中,我们主要对“用户CPU时间”进行解析。  

什么是“用户” CPU时间?

      为了了解“用户CPU时间”,我们也应该同时了解“系统CPU时间”。用户CPU时间是处理器运行应用程序代码所花费的时间。系统CPU时间是处理器在运行连接到您的应用程序的操作系统(即内核)功能上花费的时间。假设我们的应用程序正在处理数组中的元素;然后,它将被计为“用户” CPU时间。假设我们的应用正在对外部应用组件进行网络调用。要进行网络调用,它必须将数据读/写到套接字缓冲区中,这是操作系统代码的一部分。这将被视为“系统CPU”时间。  

如何找到“用户” CPU时间?

      通常可以从以下来源找到用户CPU时间:

      1、可以使用基于网络的分析工具来报告“用户” CPU时间。如果“用户” CPU时间超出阈值,该工具便能够生成警报。

      2、Unix / Linux命令行工具“顶部”在“我们”字段中也报告了“用户” CPU时间,如下图命令行返回结果所示:


[administrator@JavaLangOutOfMemory nacos-docker ]%top
top - 14:06:23 up 70 days, 16:44,  2 users,  load average: 1.25, 1.32, 1.35
Tasks: 206 total,   1 running, 205 sleeping,   0 stopped,   0 zombie
Cpu(s):  5.9%us,  3.4%sy,  0.0%ni, 90.4%id,  0.0%wa,  0.0%hi,  0.2%si,  0.0%st
Mem:  32949016k total, 14411180k used, 18537836k free,   169884k buffers
Swap: 32764556k total,        0k used, 32764556k free,  3612636k cached
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                
28894 root      22   0 1501m 405m  10m S 52.2  1.3   2534:16 java                                                                   
18249 root      18   0 3201m 1.9g  11m S 35.9  6.0 569:39.41 java    
... ...


如何模拟较高的“用户” CPU时间?

      为了模拟高“用户” CPU报告,我们写个简单的Demon。将其打成jar包,使其运行以模拟各种性能问题。当我们启动此应用jar包时,它将导致主机上的“用户” CPU消耗激增。具体如下:


[administrator@JavaLangOutOfMemory cpu %]java  -jar devopsDemo.jar PROBLEM_CPU

      针对此应用jar包,我们看下其部分代码如下:


public class DevopsDemo {
  public static void start() {
    new DevopsrThread().start();
    new DevopsrThread().start();
    new DevopsrThread().start();
    new DevopsrThread().start();
    new DevopsrThread().start();
    new DevopsrThread().start();
    new DevopsrThread().start();
    new DevopsrThread().start();
    System.out.println("8 threads launched!");
  }
}
public class DevopsrThread extends Thread {
  @Override
  public void run() {
    while (true) {
      doSomething();
    }
  }
  public static void doSomething() {
    // Does nothing
  }  
}

      可以看到devopsDemo应用在“ DevopsDemo”类中启动8个“ DevopsrThread”。同时,我们会注意到“ DevopsrThread”正在进行无限的while循环,并一次又一次地调用“ doSomething()”函数。这个doSomething()方法没有任何作用。

      因此,如果线程在应用程序级代码上无限循环,那么“用户” CPU时间将开始增加。  

如何解决“用户” CPU时间过长的问题?

     通常主要有以下策略:

      1、重新启动CPU消耗很大的过程。此策略为临时方案

      2、借助相关工具,例如,jstatck之类的根本原因分析工具,识别导致CPU大量启动的应用程序中的代码行,并加以修复。

      具体可参考文章:Java ThreadDump 生成解析

      3、如果CPU消耗始终很高(即 7 x 24),则可能表明资源设备的计算能力不足。在这种情况下,我们可以尝试执行以下操作:升级设备的容量,可尝试将应用服务转移到更好的资源实例环境);减少该设备上运行的进程数;联机负载即,借助横向扩容方式分担压力

相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
相关文章
|
16天前
|
缓存 监控 Linux
|
18天前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
52 4
|
19天前
|
缓存 负载均衡 算法
Linux内核中的进程调度算法解析####
本文深入探讨了Linux操作系统核心组件之一——进程调度器,着重分析了其采用的CFS(完全公平调度器)算法。不同于传统摘要对研究背景、方法、结果和结论的概述,本文摘要将直接揭示CFS算法的核心优势及其在现代多核处理器环境下如何实现高效、公平的资源分配,同时简要提及该算法如何优化系统响应时间和吞吐量,为读者快速构建对Linux进程调度机制的认知框架。 ####
|
21天前
|
缓存 Linux
揭秘Linux内核:探索CPU拓扑结构
【10月更文挑战第26天】
35 1
|
21天前
|
缓存 运维 Linux
深入探索Linux内核:CPU拓扑结构探测
【10月更文挑战第18天】在现代计算机系统中,CPU的拓扑结构对性能优化和资源管理至关重要。了解CPU的核心、线程、NUMA节点等信息,可以帮助开发者和系统管理员更好地调优应用程序和系统配置。本文将深入探讨如何在Linux内核中探测CPU拓扑结构,介绍相关工具和方法。
19 0
|
1月前
|
弹性计算 网络协议 Ubuntu
如何在阿里云国际版Linux云服务器中自定义配置DNS
如何在阿里云国际版Linux云服务器中自定义配置DNS
|
2月前
|
KVM 虚拟化
计算虚拟化之CPU——qemu解析
【9月更文挑战10天】本文介绍了QEMU命令行参数的解析过程及其在KVM虚拟化中的应用。展示了QEMU通过多个`qemu_add_opts`函数调用处理不同类型设备和配置选项的方式,并附上了OpenStack生成的一个复杂KVM参数实例。
|
3月前
|
图形学 开发者 存储
超越基础教程:深度拆解Unity地形编辑器的每一个隐藏角落,让你的游戏世界既浩瀚无垠又细节满满——从新手到高手的全面技巧升级秘籍
【8月更文挑战第31天】Unity地形编辑器是游戏开发中的重要工具,可快速创建复杂多变的游戏环境。本文通过比较不同地形编辑技术,详细介绍如何利用其功能构建广阔且精细的游戏世界,并提供具体示例代码,展示从基础地形绘制到植被与纹理添加的全过程。通过学习这些技巧,开发者能显著提升游戏画面质量和玩家体验。
153 3
|
13天前
|
弹性计算 Kubernetes Perl
k8s 设置pod 的cpu 和内存
在 Kubernetes (k8s) 中,设置 Pod 的 CPU 和内存资源限制和请求是非常重要的,因为这有助于确保集群资源的合理分配和有效利用。你可以通过定义 Pod 的 `resources` 字段来设置这些限制。 以下是一个示例 YAML 文件,展示了如何为一个 Pod 设置 CPU 和内存资源请求(requests)和限制(limits): ```yaml apiVersion: v1 kind: Pod metadata: name: example-pod spec: containers: - name: example-container image:
|
22天前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
195 2

热门文章

最新文章