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),则可能表明资源设备的计算能力不足。在这种情况下,我们可以尝试执行以下操作:升级设备的容量,可尝试将应用服务转移到更好的资源实例环境);减少该设备上运行的进程数;联机负载即,借助横向扩容方式分担压力

相关文章
|
8月前
|
Ubuntu Linux Anolis
Linux系统禁用swap
本文介绍了在新版本Linux系统(如Ubuntu 20.04+、CentOS Stream、openEuler等)中禁用swap的两种方法。传统通过注释/etc/fstab中swap行的方式已失效,现需使用systemd管理swap.target服务或在/etc/fstab中添加noauto参数实现禁用。方法1通过屏蔽swap.target适用于新版系统,方法2通过修改fstab挂载选项更通用,兼容所有系统。
705 3
Linux系统禁用swap
|
8月前
|
Linux
Linux系统修改网卡名为eth0、eth1
在Linux系统中,可通过修改GRUB配置和创建Udev规则或使用systemd链接文件,将网卡名改为`eth0`、`eth1`等传统命名方式,适用于多种发行版并支持多网卡配置。
1259 3
|
Ubuntu Linux 网络安全
Linux系统初始化脚本
一款支持Rocky、CentOS、Ubuntu、Debian、openEuler等主流Linux发行版的系统初始化Shell脚本,涵盖网络配置、主机名设置、镜像源更换、安全加固等多项功能,适配单/双网卡环境,支持UEFI引导,提供多版本下载与持续更新。
778 3
Linux系统初始化脚本
|
9月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
618 18
|
8月前
|
安全 Linux Shell
Linux系统提权方式全面总结:从基础到高级攻防技术
本文全面总结Linux系统提权技术,涵盖权限体系、配置错误、漏洞利用、密码攻击等方法,帮助安全研究人员掌握攻防技术,提升系统防护能力。
954 1
|
8月前
|
监控 安全 Linux
Linux系统提权之计划任务(Cron Jobs)提权
在Linux系统中,计划任务(Cron Jobs)常用于定时执行脚本或命令。若配置不当,攻击者可利用其提权至root权限。常见漏洞包括可写的Cron脚本、目录、通配符注入及PATH变量劫持。攻击者通过修改脚本、创建恶意任务或注入命令实现提权。系统管理员应遵循最小权限原则、使用绝对路径、避免通配符、设置安全PATH并定期审计,以防范此类攻击。
1292 1
|
9月前
|
缓存 监控 Linux
Linux系统清理缓存(buff/cache)的有效方法。
总结而言,在大多数情形下你不必担心Linux中buffer与cache占用过多内存在影响到其他程序运行;因为当程序请求更多内存在没有足够可用资源时,Linux会自行调整其占有量。只有当你明确知道当前环境与需求并希望立即回收这部分资源给即将运行重负载任务之前才考虑上述方法去主动干预。
2321 10
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
1311 29
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
532 4
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

热门文章

最新文章

推荐镜像

更多