GVKun编程网logo

Linux 系统如何查看 CPU 使用率?(linux怎样查看cpu使用率)

4

在本文中,我们将带你了解Linux系统如何查看CPU使用率?在这篇文章中,我们将为您详细介绍Linux系统如何查看CPU使用率?的方方面面,并解答linux怎样查看cpu使用率常见的疑惑,同时我们还将

在本文中,我们将带你了解Linux 系统如何查看 CPU 使用率?在这篇文章中,我们将为您详细介绍Linux 系统如何查看 CPU 使用率?的方方面面,并解答linux怎样查看cpu使用率常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的arthas async-profiler 方法级别 cpu 使用率、C# 获取 Windows 系统:Cpu 使用率,内存使用率,Mac 地址,磁盘使用率、CPU | 物理 CPU vs 逻辑 CPU vs 核心 vs 线程 vs Socket、CPU 使用率 100% 怎么办

本文目录一览:

Linux 系统如何查看 CPU 使用率?(linux怎样查看cpu使用率)

Linux 系统如何查看 CPU 使用率?(linux怎样查看cpu使用率)

  Linux 是一种开源操作系统,也被广泛应用于服务器和嵌入式设备上,那么作为一个服务器操作系统,监控系统资源的使用情况是非常重要的,那么该如何在 Linux 系统上查看 CPU 使用率呢?以下是详细的内容:

  1. 使用 top 命令

  top 命令是一个常用的 Linux 系统监控命令,可以实时查看系统的进程和资源使用情况。可以使用以下命令来查看 CPU 使用率:

  top

  启动 top 命令后,会显示当前系统的各项资源使用情况,包括 CPU 使用率。在 top 界面,可以看到一个 CPU 行,其中包含了 CPU 使用率的信息。例如:

  %Cpu(s): 5.0 us, 2.0 sy, 0.0 ni, 93.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

  其中,us 表示用户空间程序的 CPU 使用率,sy 表示系统内核的 CPU 使用率,id 表示 CPU 空闲的时间。

  2. 使用 mpstat 命令

  mpstat 命令是一个 Linux 系统监控命令,可以实时显示 CPU 使用率和其他 CPU 统计数据。mpstat 命令默认显示所有 CPU 的使用情况,可以使用以下命令来查看 CPU 使用率:

  mpstat

  启动 mpstat 命令后,会显示每个 CPU 核心的使用情况,包括用户空间程序、系统内核、空闲等相关信息。例如:

  02:40:01 AM CPU %user %nice %sys %iowait %irq %soft %steal %guest %idle

  02:40:01 AM all 5.42 0.02 2.09 0.04 0.00 0.01 0.00 0.00 92.42

  其中,% user 表示用户空间程序的 CPU 使用率,% sys 表示系统内核的 CPU 使用率,% idle 表示 CPU 空闲的时间。

  3. 使用 sar 命令

  sar 命令是一个 Linux 系统监控命令,可以实时查看 CPU 使用率以及其他系统性能指标。sar 命令需要安装 sysstat 工具包来使用。可以使用以下命令来查看 CPU 使用率:

  sar -u

  启动 sar 命令后,会显示 CPU 的使用情况,包括用户空间程序、系统内核、空闲等相关信息。例如:

  12:00:01 AM CPU %user %nice %system %iowait %steal %idle

  12:10:01 AM all 8.24 0.00 3.29 0.02 0.00 88.45

  其中,% user 表示用户空间程序的 CPU 使用率,% system 表示系统内核的 CPU 使用率,% idle 表示 CPU 空闲的时间。

  除了以上的命令外,还可以使用其他工具来查看 CPU 使用率,如 htop、nmon 等。这些工具提供了更丰富的界面和功能,能够更详细地显示系统资源的使用情况。

  总结

  在 Linux 系统上查看 CPU 使用率可以使用 top、mpstat、sar 等命令,也可以使用一些其他工具。根据实际需求选择合适的命令或工具来进行监控。通过实时查看 CPU 使用率,可以及时了解系统的运行情况,做出相应的优化和调整。

arthas async-profiler 方法级别 cpu 使用率

arthas async-profiler 方法级别 cpu 使用率

【直播预告】程序员逆袭 CEO 分几步?

profiler execute ''start''

profiler execute ''stop,tree,cstack=no,file=/application/arthas-output/20220927-1.html''

 

profiler execute 可以执行原生的 async-profiler 命令。

 

profiler start --duration 300 等同于  ./profiler.sh -d 300 

profiler.sh 是再脚本内部实现的,同理arthas 的 profiler start 也一样

        ;;
    collect)
        fdtransfer
        jattach "start,file=$FILE,$OUTPUT$FORMAT$PARAMS"
        echo Profiling for "$DURATION" seconds >&2
        set +e
        trap ''DURATION=0'' INT

        while [ "$DURATION" -gt 0 ]; do
            DURATION=$(( DURATION-1 ))
            check_if_terminated
            sleep 1
        done

        set -e
        trap - INT
        echo Done >&2
        jattach "stop,file=$FILE,$OUTPUT$FORMAT"
        ;;

 

调用树效果图(通过参数可以配置生成调用树,火焰图):

 

https://arthas.aliyun.com/doc/profiler.html#%E4%BD%BF%E7%94%A8execute%E6%9D%A5%E6%89%A7%E8%A1%8C%E5%A4%8D%E6%9D%82%E7%9A%84%E5%91%BD%E4%BB%A4

 

https://github.com/jvm-profiling-tools/async-profiler/blob/v2.5/src/arguments.cpp#L50

C# 获取 Windows 系统:Cpu 使用率,内存使用率,Mac 地址,磁盘使用率

C# 获取 Windows 系统:Cpu 使用率,内存使用率,Mac 地址,磁盘使用率

一、获取 CPU 使用率:

#region 获取CPU使用率

        #region AIP声明 
        [DllImport("IpHlpApi.dll")]
        extern static public uint GetIfTable(byte[] pIfTable, ref uint pdwSize, bool bOrder);

        [DllImport("User32")]
        private extern static int GetWindow(int hWnd, int wCmd);

        [DllImport("User32")]
        private extern static int GetWindowLongA(int hWnd, int wIndx);

        [DllImport("user32.dll")]
        private static extern bool GetWindowText(int hWnd, StringBuilder title, int maxBufSize);

        [DllImport("user32", CharSet = CharSet.Auto)]
        private extern static int GetWindowTextLength(IntPtr hWnd);
        #endregion
        
        public static float? GetCpuUsedRate()
        {
            try
            {
                PerformanceCounter pcCpuLoad;
                pcCpuLoad = new PerformanceCounter("Processor", "% Processor Time", "_Total")
                {
                    MachineName = "."
                };
                pcCpuLoad.NextValue();
                Thread.Sleep(1500);
                float CpuLoad= pcCpuLoad.NextValue();
                
             return CpuLoad;
            }
            catch
            {
            }
            return 0;
        }
        #endregion

二、获取内存使用率

其中 ManagementClass 类需要手动引用 System.Management,然后再 using System.Management。

  #region 获取内存使用率
        #region 可用内存

        /// <summary>
        ///     获取可用内存
        /// </summary>
        internal static long? GetMemoryAvailable()
        {
           
             long availablebytes = 0;
             var managementClassOs = new ManagementClass("Win32_OperatingSystem");
             foreach (var managementBaseObject in managementClassOs.GetInstances())
                 if (managementBaseObject["FreePhysicalMemory"] != null)
                   availablebytes = 1024 * long.Parse(managementBaseObject["FreePhysicalMemory"].ToString());
            return availablebytes / MbDiv;
            
        }

        #endregion
        internal static double? GetMemoryUsed()
        {
            float? PhysicalMemory = GetPhysicalMemory();
            float? MemoryAvailable = GetMemoryAvailable();
            double? MemoryUsed = (double?)(PhysicalMemory - MemoryAvailable);
            double currentMemoryUsed = (double)MemoryUsed ;
            return currentMemoryUsed ;
        }
        private static long? GetPhysicalMemory()
        {
            //获得物理内存
            var managementClass = new ManagementClass("Win32_ComputerSystem");
            var managementObjectCollection = managementClass.GetInstances();
            long PhysicalMemory;
            foreach (var managementBaseObject in managementObjectCollection)
                if (managementBaseObject["TotalPhysicalMemory"] != null)
                {
                   return long.Parse(managementBaseObject["TotalPhysicalMemory"].ToString())/ MbDiv;
                }
            return null;

        }
        public static double? GetMemoryUsedRate()
        {
            float? PhysicalMemory = GetPhysicalMemory();
            float? MemoryAvailable = GetMemoryAvailable();
            double? MemoryUsedRate =(double?)(PhysicalMemory - MemoryAvailable)/ PhysicalMemory;
            return MemoryUsedRate.HasValue ? Convert.ToDouble(MemoryUsedRate * 100) : 0;
        }
        #endregion

        #region 单位转换进制

        private const int KbDiv = 1024;
        private const int MbDiv = 1024 * 1024;
        private const int GbDiv = 1024 * 1024 * 1024;

        #endregion

三、获取 Mac 地址

#region 获取当前活动网络MAC地址
        /// <summary>  
        /// 获取本机MAC地址  
        /// </summary>  
        /// <returns>本机MAC地址</returns>  
        public static string GetMacAddress()
        {
            try
            {
                string strMac = string.Empty;
                ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
                ManagementObjectCollection moc = mc.GetInstances();
                foreach (ManagementObject mo in moc)
                {
                    if ((bool)mo["IPEnabled"] == true)
                    {
                        strMac = mo["MacAddress"].ToString();
                    }
                }
                moc = null;
                mc = null;
                return strMac;
            }
            catch
            {
                return "unknown";
            }
        }
        #endregion

四、获取磁盘使用率

   #region 获取磁盘占用率
        internal static double GetUsedDiskPercent()
        {
            float? usedSize = GetUsedDiskSize();
            float? totalSize = GetTotalSize();
            double? percent = (double?)usedSize / totalSize;
            return percent.HasValue ? Convert.ToDouble(percent * 100) : 0;
        }

        internal static float? GetUsedDiskSize()
        {
            var currentDrive = GetCurrentDrive();
            float UsedDiskSize =(long)currentDrive?.TotalSize - (long)currentDrive?.TotalFreeSpace;
            return UsedDiskSize / MbDiv;
        }

        internal static float? GetTotalSize()
        {
            var currentDrive = GetCurrentDrive();

            float TotalSize = (long)currentDrive?.TotalSize / MbDiv;
            return TotalSize;
        }

        /// <summary>
        /// 获取当前执行的盘符信息
        /// </summary>
        /// <returns></returns>
        private static DriveInfo GetCurrentDrive()
        {
            string path = Application.StartupPath.ToString().Substring(0, 3);
            return DriveInfo.GetDrives().FirstOrDefault<DriveInfo>(p => p.Name.Equals(path));
        }
        #endregion

 

CPU | 物理 CPU vs 逻辑 CPU vs 核心 vs 线程 vs Socket

CPU | 物理 CPU vs 逻辑 CPU vs 核心 vs 线程 vs Socket

<html> <head></head> <body> <div> <div> <p > 当我们试着通过 Linux 命令 nproc 和 lscpu 了解一台计算机 CPU 级的架构和性能时,我们总会发现无法正确地理解相应的结果,因为我们会被好几个术语搞混淆:物理 CPU、逻辑 CPU、虚拟 CPU、核心、线程和 Socket 等等。如果我们又增加了超线程(不同于多线程),我们就会开始不知道计算机里面到底有多少核心,我们搞不明白为什么像 htop 这样的命令会在我们认为买的是一台单核计算机上返回拥有 8 个 CPU 的结果。这样的情况一片混乱。</p> <p><br /></p> <div> <img src="http://p1.pstatp.com/large/pgc-image/58f9425657f94522a8011e3deb7c0e7e" img_width="914" img_height="545" alt="物理 CPU vs 逻辑 CPU vs 核心 vs 线程 vs Socket" inline="0" /> <p></p> </div> <p><br /></p> <h1><strong > 起源:单核 CPU 和超线程 </strong></h1> <p > 在诸如多核、虚拟 CPU 和逻辑 CPU 这样的概念诞生前,在奔腾系列处理器的年代,大部分计算机在它们的主板上装备了一块不大不小的芯片,我们把它叫做微处理器、处理器或直接叫 CPU。只有很少数需要更强处理能力的企业能够负担得起同一块主板上安装 2 块以上的处理器的费用:这些就是多处理器系统。这些处理器与主板上其它元件的通信通过一个连接器或 Socket 来完成。那我们很容易能计算得到一块主板上有多少连接器或 Socket,那么这块主板上最多就能有相同数量的 CPU。如果你需要更多的计算能力,你只需要寻找一块能够支持更多处理器的主板即可。</p> <p > 但是后来 Intel 意识到多处理器系统里,处理器之间通过系统总线进行通信是非常低效的,因为总线传输速度较慢。这样就会经常发生的性能瓶颈,无法最大化利用 CPU 的计算能力。</p> <p><br /></p> <div> <img src="http://p3.pstatp.com/large/pgc-image/815647be4c1e4d4c806535bba7aef56c" img_width="713" img_height="517" alt="物理 CPU vs 逻辑 CPU vs 核心 vs 线程 vs Socket" inline="0" /> <p></p> </div> <p><br /></p> <p > 为了改善这个处境于是诞生了超线程技术。超线程的大意是复制一些 CPU 单元到同一块芯片上,比如寄存器或者一级缓存,这样可以在两个执行线程里共享这些数据,而无需经由系统总线和避免因为访问速度导致的性能下降问题。超线程还带来另外一个好处是可以当一个进程在等待中断的时候,另一进程仍然可以使用同一个 CPU 进行执行而且无需停止。</p> <p > 这种方式可以加速多个被处理的进程,比传统的单个核心(未开启超线程)提供更高的整体性能。操作系统有点像被欺骗的意思,因为它被提供了两个虚拟 CPU 或者逻辑 CPU 并且可以 “同时” 执行两个进程。但是要非常注意的是,它并不能带来两倍的处理能力,也不提供完全并行计算能力。</p> <p > 这样, 从 Linux 或者其他操作系统的视角来看,一个单核 CPU 计算机通过超线程技术呈现出双核 CPU 的效果,但两个逻辑 CPU 实际上在同一个物理 CPU 中执行。</p> <h1><strong > 又一点复杂:多核架构的出现 </strong></h1> <p > 正如我在前面部分所说的,尽管开启了超线程的 CPU 能够提供更强的计算能力,但并不能提供 2 倍的处理能力和 2 个独立的 CPU,所以我打算进一步缩小 CPU 元件的视角,并且把它们都安装到统一块芯片上。如此一来每个被压缩的处理器都叫做核心,并且允许使用同一块硅晶的内部共享总线进行更快的通信。从那一刻开始再也不需要较慢的系统总线了。</p> <p><br /></p> <div> <img src="http://p1.pstatp.com/large/pgc-image/182645578ed44ed4b3c28d9de160b829" img_width="655" img_height="433" alt="物理 CPU vs 逻辑 CPU vs 核心 vs 线程 vs Socket" inline="0" /> <p></p> </div> <p><br /></p> <p > 不同于超线程技术,我们现在拥有多个完全独立的 CPU 服务于任何任务,每个任务可以分配一个核心。确实,从性能的角度来看,拥有单个多核芯片要比同一个主板上拥有多个单核芯片提供更好的性能。当然,拥有一个双数核心要比单数核心更好。</p> <p > 在操作系统层,一个物理的四核处理器可以看做是四个 CPU。但这些可能是四个逻辑 CPU 或者非物理的 LCPU。如果处理器还提供了超线程支持,那么像 htop 和 nproc 的命令会看到系统里有八个 CPU,但是可能在一个八核 CPU 上看到少于八核的结果。</p> <h1><strong>1LCPU = 1 线程 </strong></h1> <p > 最后我们通常发现支持四线程的处理器,每个核心两个线程这样,这仅仅表示同时可以执行任务的线程,并且与一个 LCPU 能够提供的处理能力等价。如果一个处理器每个核心能够支持两个线程说明它启用了超线程,否则正常来说线程数与核心数一致。</p> <p><br /></p> <div> <img src="http://p3.pstatp.com/large/pgc-image/43bab08ac6a64cd5ab70ac36fdc6ca58" img_width="556" img_height="508" alt="物理 CPU vs 逻辑 CPU vs 核心 vs 线程 vs Socket" inline="0" /> <p></p> </div> <p><br /></p> <p><strong > 逻辑 CPU vs 虚拟 CPU</strong></p> <p > 虚拟 CPU 这个术语通常会被与逻辑 CPU 进行比较,但是有一点细微的差别:虚拟 CPU 更加被局限在计算虚拟化的领域里,它表示那些与从底层硬件(可以是物理 CPU 也可以是逻辑 CPU、开启超线程与否)映射到虚拟机的处理器。一般情况下,宿主机上一个逻辑 CPU 映射到虚拟机里的一个虚拟 CPU,所以它们可以看做是相同含义的术语。</p> </div> </div> </body> </html>

CPU 使用率 100% 怎么办

CPU 使用率 100% 怎么办

CPU 使用率 100% 怎么办

独家号 码上实战 作者 flyhero原文链接

工作中遇到CPU使用率100%,不要慌,一起来找出原因并fix掉它。

记住这里大致流程,当线上突然遇到时,也不必手足无措。

总体流程

找出CPU比较高的进程PID

top

打印该进程下线程的CPU占用比较高的tid

top -Hp {PID}

将该tid进行16进制转换id

printf "%x\n" {tid}

打印线程的堆栈信息

jstack {PID} |grep {id} -A 100

当然这四步的执行需要时间,但我们可以将这几步写成shell脚本来执行。

安装JDK命令行工具

服务器上安装的OpenJDK ,是否有常用的命令行工具?

验证是否安装

[root@op-system ~]$ jstack -h
Usage:
    jstack [-l] <pid>
        (to connect to running process)
    jstack -F [-m] [-l] <pid>
        (to connect to a hung process)
    jstack [-m] [-l] <executable> <core> (to connect to a core file) jstack [-m] [-l] [server_id@]<remote server IP or hostname> (to connect to a remote debug server) 

如果输出如上内容表明,已经拥有工具,倘若没有,那么继续下面。

安装

  • 查看JDK版本
[root@op-system ~]$ java -version
openjdk version "1.8.0_201"
OpenJDK Runtime Environment (build 1.8.0_201-b09)
OpenJDK 64-Bit Server VM (build 25.201-b09, mixed mode) 
  • 看openJDK有jstack的yum源
[root@op-system ~]$ yum whatprovides ''*/jstack''
1:java-1.8.0-openjdk-devel-debug-1.8.0.201.b09-2.el7_6.x86_64 : OpenJDK Development Environment 8 with full debug on Repo : @updates Matched from: Filename : /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.201.b09-2.el7_6.x86_64-debug/bin/jstack 

找到和JDK版本对应的yum源。

  • 安装
[root@op-system ~]$ sudo yum install java-1.8.0-openjdk-devel-debug-1.8.0.201.b09-2.el7_6.x86_64

寻找问题所在

  • 查出使用率最高的进程

[root@op-system ~]$ top

发现 123067 这个进程特别消耗CPU。

 

  • 查看进程中线程情况
[root@op-system ~]$ top -p 123067 -H

发现 127510 这个线程特别消耗CPU,那么我们来看看这个线程到底是做什么的。

  • 十进制id转十六进制

[root@op-system ~]$ printf "%x\n" 127510
1eaec 
  • 使用jstack打印出线程的堆栈信息
[root@op-system ~]$ jstack 123067 |grep 1eaec -A 100

从打印出来的信息中发现了很熟悉的代码,对,就是这里。

解决问题

那么既然找到了问题,我们就只能通过,数据库索引、SQL优化、算法优化、快速返回等方法来最这段代码优化了。

CPU
 

关于Linux 系统如何查看 CPU 使用率?linux怎样查看cpu使用率的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于arthas async-profiler 方法级别 cpu 使用率、C# 获取 Windows 系统:Cpu 使用率,内存使用率,Mac 地址,磁盘使用率、CPU | 物理 CPU vs 逻辑 CPU vs 核心 vs 线程 vs Socket、CPU 使用率 100% 怎么办的相关信息,请在本站寻找。

本文标签: