HelloCoder HelloCoder
首页
《Java小白求职之路》
《小白学Java》
计算机毕设
  • 一些免费计算机资源
  • 脚手架工具
  • 《从0到1学习Java多线程》
  • 《从0到1搭建服务器》
随笔
关于作者
首页
《Java小白求职之路》
《小白学Java》
计算机毕设
  • 一些免费计算机资源
  • 脚手架工具
  • 《从0到1学习Java多线程》
  • 《从0到1搭建服务器》
随笔
关于作者
  • Linux

    • 10个实用的Linux技巧
    • Centos使用教程
    • Linux三剑客之awk命令
    • Linux三剑客之grep命令
    • Linux三剑客之seq命令
    • Linux之用户管理
    • Linux保姆级入门详细教程
    • Linux入门到进阶路线
    • centos开机流程详解
    • shell编程学习
    • vim快捷键
    • 八个能提升效率的Linux快捷键
    • 占用几分钟时间,让你掌握top命令
  • 其他
  • Linux
#top #命令
码农阿雨
2022-05-26
目录

占用几分钟时间,让你掌握top命令

服务器负载过高,排查问题一定离不开top命令。

这篇文章就来教大家如何使用top命令看top命令的结果。

# 1、使用top命令

[root@VM-8-8-centos ~]# top
top - 23:17:16 up  7:54,  1 user,  load average: 1.73, 1.70, 1.71
Tasks:  95 total,   1 running,  94 sleeping,   0 stopped,   0 zombie
%Cpu(s): 50.0 us, 50.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1882056 total,    69588 free,  1255116 used,   557352 buff/cache
KiB Swap:        0 total,        0 free,        0 used.   478816 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
 1953 root      20   0  101080   2248   1732 S  0.3  0.1   0:01.89 YDLive
 2310 root      20   0 2369316 246988  13760 S  0.3 13.1   0:22.47 java
 5082 root      20   0  154808  10500   3248 S  0.3  0.6   0:11.14 YDService
    1 root      20   0   43444   3872   2580 S  0.0  0.2   0:01.27 systemd
    2 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kthreadd
    4 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kworker/0:0H
    5 root      20   0       0      0      0 S  0.0  0.0   0:00.07 kworker/u2:0
    6 root      20   0       0      0      0 S  0.0  0.0   0:00.02 ksoftirqd/0
    7 root      rt   0       0      0      0 S  0.0  0.0   0:00.00 migration/0

然后键盘按 1 表示进入第1个CPU核心(如果是多核需要分别查看不同的CPU),按 2 表示进入第2个CPU核心,要取决你要多少个CPU核心。

上面一堆密密麻麻的数字和单词,下面来慢慢看。

# 2、Load Average

有经验的老运维们,单从Load Average 就可以判断系统负载高低。

看到右上角:

load average: 1.73, 1.70, 1.71

— load average后面的三个数分别是1分钟、5分钟、

15分钟的负载情况。 指的是处于可运行状态和不可中断状态的平均进程数。数字越大,CPU负载越大。

如果 小于 CPU数 * 每个CPU的核心数 , 则表示负载是合理的,比如上面我的服务器 CPU 是 1 个,只有 1 个核心,那么现在1.7的负载大于1,就很不合理了。

但是,这个数值高了也并不能直接代表这台机器的性能有问题。可能是因为正在进行CPU密集型的计算,也有可能是因为I/O问题导致运行队列堵了(证明有很多任务在等待中)。

所以,当我们看到这个数值飙升的时候,还得具体问题具体分析。

如何查CPU和CPU核心?

  • 查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"| wc -l
  • 查看物理CPU个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
  • 查看逻辑CPU数目:
cat /proc/cpuinfo | grep "model name" 
  • 查看CPU核心:(每个物理CPU中core的个数(即核数))
cat /proc/cpuinfo | grep "cpu cores"

演示一下:

[root@VM-8-8-centos ~]# cat /proc/cpuinfo |grep "processor"|wc -l  
1
[root@localhost ~]# cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l
1
[root@VM-8-8-centos ~]# cat /proc/cpuinfo | grep "model name"
model name      : AMD EPYC 7K62 48-Core Processor
[root@VM-8-8-centos ~]# cat /proc/cpuinfo | grep "cpu cores"
cpu cores       : 1

表示我的服务器只有 1 个CPU, 1 个CPU只有 1 个核心,只有 1 个 线程。

这里是题外话了,我们一般需要关注model name 和 cpu cores 就可以了。

# 3、一行一行看

# 第一行:

top - 23:17:16 up  7:54,  1 user,  load average: 1.73, 1.70, 1.71

top:当前时间
up:机器运行了多少时间
users:当前有多少用户
load average:分别是过去1分钟,5分钟,15分钟的负载

这里最重要的就是load average 了。

# 第二行:

Tasks:  95 total,   1 running,  94 sleeping,   0 stopped,   0 zombie

Tasks:当前有多少进程
running:正在运行的进程
sleeping:正在休眠的进程
stopped:停止的进程
zombie:僵尸进程

running线程越多,服务器自然压力越大。

zombie表示僵尸线程,借用官方解释:

一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程 (opens new window)(Zombie)的数据结构(系统调用exit, 它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。

一般可以使用以下两个命令找到 父进程的Id,然后 kill 掉:

ps -e -o stat,ppid,pid,cmd|egrep '^[Zz]'
ps -ef | grep "defunct"

注:

  • '^[Zz]':这是正则表达式,^表示第一个字符的位置,[Zz],表示z或者大写的Z字母,即表示第一个字符为Z或者z开头的进程数据,只所以这样是因为僵尸进程的状态信息以Z或者z字母开头。
  • 多数linux系统,也会将僵尸进程标识为defunct

# 第三行:

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


us: 用户进程占CPU的使用率
sy: 系统进程占CPU的使用率
ni: 用户进程空间改变过优先级
id: 空闲CPU占用率
wa: 等待输入输出的CPU时间百分比
hi: 硬件的中断请求
si: 软件的中断请求
st: steal time

这里表示了CPU的使用情况。

us长期过高,表明用户进程占用了大量的CPU时间。

us+sy如果长期超过80或者90,可能就代表了CPU性能不足,需要加CPU了。

可以看到我这里 us占了 50%,sy占了50%,ni 为0,CPU的剩余空闲率已经没有了,说明CPU资源不足。

# 第四行+第五行

KiB Mem :  1882056 total,    69588 free,  1255116 used,   557352 buff/cache
KiB Swap:        0 total,        0 free,        0 used.   478816 avail Mem

KiB Mem 物理内存
KiB Swap 交换区总量
total:内存总量
free:空闲内存
used:使用的
buffer/cache:写缓存/读缓存

这里解释一下,所谓缓冲的交换区总量-KiB Swap,即内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,该数值即为这些内容已存在于内存中的交换区的大小。

其实使用 free 命令也是一样可以得出这样的结果。

为什么会有Swap?

当Linux的物理内存快要被耗尽时,系统会把一些进程占用的内存转移到 swap 区,当物理内存被释放一部分时,swap 区的一些内存占用又慢慢回到 mem 区,但是 mem 区却不再是之前的满负荷状态,而是有一部分 free 的内存!

【总结】

1)当物理内存快被耗尽时,系统并没有崩溃,而是拿 swap 做临时内存,当两者都耗尽,系统 OutofMemory

2)物理内存达到峰值,系统中一些不常用的进程内存占用被提到 swap 区

3)当 Men 区的资源进行释放时,被挪到 swap 的内存并不会全部回来,随着系统或者程序的唤醒才会慢慢回到 men 区

4)swap 是内存不够时,磁盘虚拟出来的内存,磁盘主要是 I/O 级别的操作,并不是系统内核级别的操作,处理速度跟 mem 区不是一个等级。

这部分参考自:https://www.cnblogs.com/lili-xia/p/11506188.html

所以说这么多,简单一句就是 :当物理内存不够用的时候,操作系统才会把暂时不用的数据放到Swap中。所以当这个数值变高的时候,说明内存不足了,需要充钱升级内存了

# 第五行下面

 PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
 1953 root      20   0  101080   2248   1732 S  0.3  0.1   0:01.89 YDLive
 2310 root      20   0 2369316 246988  13760 S  0.3 13.1   0:22.47 java
 5082 root      20   0  154808  10500   3248 S  0.3  0.6   0:11.14 YDService
    1 root      20   0   43444   3872   2580 S  0.0  0.2   0:01.27 systemd
    2 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kthreadd
    4 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kworker/0:0H
    5 root      20   0       0      0      0 S  0.0  0.0   0:00.07 kworker/u2:0
    6 root      20   0       0      0      0 S  0.0  0.0   0:00.02 ksoftirqd/0
    7 root      rt   0       0      0      0 S  0.0  0.0   0:00.00 migration/0
    
PID:进程id
USER:进程所有者
PR:优先级。数值越大优先级越高
NI:nice值,负值表示高优先级,正值表示低优先级
VIRT:进程使用的虚拟内存总量
SWAP:进程使用的虚拟内存中被换出的大小
RES:进程使用的、未被换出的物理内存大小
SHR:共享内存大小
SHR:共享内存大小
S:进程状态。D表示不可中断的睡眠状态;R表示运行;S表示睡眠;T表示跟踪/停止;Z表示僵尸进程。
%CPU:上次更新到现在的CPU占用百分比 ;
%MEM:进程使用的物理内存百分比 ;
TIME+:进程使用的CPU时间总计,单位1/100秒;
COMMAND:命令名/命令行(进程启动的命令,可以使用 top -c 打印完整的命令)

这个就像是Windows的资源管理器一样。

键盘按下 x 键 ,就会把CPU的占用率进行降序排序。

借助 %CPU、%MEM 这两个一般就可以找出占用CPU、内存 最高的的进程ID,再借助ps、jstack、vmstat、iostat 这些常用的命令,就很容易定位出问题了。

阅读全文
×

(为防止恶意爬虫)
扫码或搜索:HelloCoder
发送:290992
即可永久解锁本站全部文章

解锁
#top#命令
上次更新: 2025-02-21 06:04:57
最近更新
01
《LeetCode 101》
02-21
02
IDEA、Golang、Pycharm破解安装
02-21
03
《LeetCode CookBook》
02-21
更多文章>
Theme by Vdoing | Copyright © 2020-2025 码农阿雨
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式