[Linux]常用命令之【top/uptime/w/vmstat/free】

2023-05-18,,

1 top

语法:top [-s time] [-d count] [-q] [-u] [-h] [-n number] [-f filename]
-s time 设置屏幕刷新的延时,单位为秒,默认值 5 秒 命令功能:
top 监控工具可以显示 CPU占用率为前几位的进程,并提供 CPU 的实时活动情况

查看 Linux 负载

查看所有进程的USER/CPU/内存/Swap/PID/Command情况

按住 shift + M 可按内存大小排序
按住 shift + P 可按CPU占用率大小排序
按住数字1 可监控每个逻辑CPU的状况(若不按1,则:在top视图里面显示的是所有cpu的平均值)

[root@es1 ~]# top
top - 14:05:43 up 61 days, 38 min, 2 users, load average: 0.11, 0.10, 0.13
Tasks: 220 total, 1 running, 219 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.2%us, 0.1%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 32880208k total, 26979156k used, 5901052k free, 509528k buffers
Swap: 16777212k total, 68k used, 16777144k free, 6755296k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4358 elastics 20 0 35.8g 17g 86m S 2.0 54.5 3428:50 java
4606 sdc 20 0 13.9g 1.0g 15m S 0.3 3.3 179:04.36 java
1 root 20 0 19232 1328 1128 S 0.0 0.0 0:13.40 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root RT 0 0 0 0 S 0.0 0.0 0:16.02 migration/0
4 root 20 0 0 0 0 S 0.0 0.0 0:32.50 ksoftirqd/0
5 root RT 0 0 0 0 S 0.0 0.0 0:00.00 stopper/0
6 root RT 0 0 0 0 S 0.0 0.0 0:07.29 watchdog/0
7 root RT 0 0 0 0 S 0.0 0.0 0:01.35 migration/1
8 root RT 0 0 0 0 S 0.0 0.0 0:00.00 stopper/1
9 root 20 0 0 0 0 S 0.0 0.0 0:06.38 ksoftirqd/1
10 root RT 0 0 0 0 S 0.0 0.0 0:06.91 watchdog/1
11 root RT 0 0 0 0 S 0.0 0.0 0:01.47 migration/2
12 root RT 0 0 0 0 S 0.0 0.0 0:00.00 stopper/2
13 root 20 0 0 0 0 S 0.0 0.0 0:05.49 ksoftirqd/2
14 root RT 0 0 0 0 S 0.0 0.0 0:06.41 watchdog/2
15 root RT 0 0 0 0 S 0.0 0.0 0:00.73 migration/3
16 root RT 0 0 0 0 S 0.0 0.0 0:00.00 stopper/3
17 root 20 0 0 0 0 S 0.0 0.0 0:04.71 ksoftirqd/3
18 root RT 0 0 0 0 S 0.0 0.0 0:06.19 watchdog/3
19 root RT 0 0 0 0 S 0.0 0.0 0:01.34 migration/4
20 root RT 0 0 0 0 S 0.0 0.0 0:00.00 stopper/4
21 root 20 0 0 0 0 S 0.0 0.0 0:03.63 ksoftirqd/4
22 root RT 0 0 0 0 S 0.0 0.0 0:06.13 watchdog/4
23 root RT 0 0 0 0 S 0.0 0.0 0:00.82 migration/5
24 root RT 0 0 0 0 S 0.0 0.0 0:00.00 stopper/5
25 root 20 0 0 0 0 S 0.0 0.0 0:04.76 ksoftirqd/5
26 root RT 0 0 0 0 S 0.0 0.0 0:05.96 watchdog/5
27 root RT 0 0 0 0 S 0.0 0.0 0:01.47 migration/6
28 root RT 0 0 0 0 S 0.0 0.0 0:00.00 stopper/6
29 root 20 0 0 0 0 S 0.0 0.0 0:03.99 ksoftirqd/6
30 root RT 0 0 0 0 S 0.0 0.0 0:05.96 watchdog/6
31 root RT 0 0 0 0 S 0.0 0.0 0:00.64 migration/7
32 root RT 0 0 0 0 S 0.0 0.0 0:00.00 stopper/7
33 root 20 0 0 0 0 S 0.0 0.0 0:03.76 ksoftirqd/7

top 解释:

【第1行】 top - 14:05:43 up 61 days, 38 min,  2 users,  load average: 0.11, 0.10, 0.13
14:05:43 # 系统当前时间
up 61 days, 38min # 系统已启用时间: 系统开机到现在已达61天38分钟
2 users # 当前2个用户在线
load average: 0.11, 0.10, 0.13 # 系统1分钟、5分钟、15分钟的CPU负载值。
单位时间段内CPU活动进程数。
如果你的机器为单核,那么只要这几个值均<1,代表系统就没有负载压力;
如果你的机器为N核,那么必须是这几个值均<N才可认为系统没有负载压力;
"单CPU系统1-3和SMP系统6-10都是可能接受的。" 【第2行#任务/进程#】Tasks: 220 total, 1 running, 219 sleeping, 0 stopped, 0 zombie
220 total:当前有220个任务
1 running:1个任务正在运行
219 sleeping:219个进程处于睡眠状态
0 stopped:停止的进程数
0 zombie:僵死的进程数 【第3行#CPU#】Cpu(s): 0.2%us, 0.1%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
0.2%us:"user CPU time" / 用户态进程占用CPU时间百分比
0.1%sy:"system CPU time" / 内核占用CPU时间百分比
0.0%ni:" nice CPU time" / 用户进程空间内改变过优先级的进程占用CPU百分比。renice值为负的任务的用户态进程的CPU时间百分比。nice是优先级的意思.
99.7%id:"idle" / 空闲CPU时间百分比
0.0%wa:"io wait" / 等待I/O的CPU时间百分比
0.0%hi:"hardware irq" / CPU硬中断时间百分比
0.0%si:"software irq" / CPU软中断时间百分比
0.0%st: "steal time" / 虚拟机偷取(steal)的时间。
一台物理是可以虚拟化出多台虚拟机,在其中一台虚拟机上用top查看发现st不为0,就说明本来有这么多个cpu时间是安排给我这个虚拟机的;
但是由于某种虚拟技术,把这个cpu时间分配给了其他的虚拟机了。这就叫做偷取。
详见: http://melody-dc.com/2015/11/21/%E7%90%86%E8%A7%A3CPU-steal-time/ 【第4行#内存#】 Mem: 32880208k total, 26979156k used, 5901052k free, 509528k buffers
32880208k total:物理内存总数
26979156k used: 已使用的物理内存
5901052k free: 空闲的物理内存
509528k buffers: 用作缓冲区的内存 [缓存] 【第5行#交换空间#】 Swap: 16777212k total, 68k used, 16777144k free, 6755296k cached
16777212k total:交换空间的总量
68kk used: 使用的交换空间
16777144k free:空闲的交换空间
6755296k cached:缓存的交换空间 【第6行#进程#】PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
PID:进程ID
USER:进程的所有者
PR:进程的优先级
NI:nice值
VIRT:占用的虚拟内存
RES:占用的物理内存
SHR:使用的共享内存
S:进行状态 S:休眠 R运行 Z僵尸进程 N nice值为负
%CPU:占用的CPU
%MEM:占用内存
TIME+: 占用CPU的时间的累加值
COMMAND:启动命令

top -Hp <pid> # 查看某个进程下所有线程的信息

[root@node-a opt]# top -Hp 7774
top - 15:10:26 up 3:37, 2 users, load average: 0.04, 0.07, 0.08
Threads: 38 total, 0 running, 38 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.8 sy, 0.0 ni, 99.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1863032 total, 76188 free, 1382496 used, 404348 buff/cache
KiB Swap: 2097148 total, 2077428 free, 19720 used. 261972 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
7794 root 20 0 4048128 130740 13800 S 0.7 7.0 0:00.21 java
7774 root 20 0 4048128 130740 13800 S 0.0 7.0 0:00.00 java
7780 root 20 0 4048128 130740 13800 S 0.0 7.0 0:01.25 java
7782 root 20 0 4048128 130740 13800 S 0.0 7.0 0:00.02 java
7783 root 20 0 4048128 130740 13800 S 0.0 7.0 0:00.01 java
7784 root 20 0 4048128 130740 13800 S 0.0 7.0 0:00.02 java
7785 root 20 0 4048128 130740 13800 S 0.0 7.0 0:00.01 java
7786 root 20 0 4048128 130740 13800 S 0.0 7.0 0:00.06 java
7787 root 20 0 4048128 130740 13800 S 0.0 7.0 0:00.00 java
7788 root 20 0 4048128 130740 13800 S 0.0 7.0 0:00.00 java
7789 root 20 0 4048128 130740 13800 S 0.0 7.0 0:00.00 java
7790 root 20 0 4048128 130740 13800 S 0.0 7.0 0:01.47 java
7791 root 20 0 4048128 130740 13800 S 0.0 7.0 0:01.44 java
7792 root 20 0 4048128 130740 13800 S 0.0 7.0 0:01.02 java
7793 root 20 0 4048128 130740 13800 S 0.0 7.0 0:00.00 java
7795 root 20 0 4048128 130740 13800 S 0.0 7.0 0:00.02 java
7796 root 20 0 4048128 130740 13800 S 0.0 7.0 0:00.00 java
7797 root 20 0 4048128 130740 13800 S 0.0 7.0 0:00.01 java
7798 root 20 0 4048128 130740 13800 S 0.0 7.0 0:00.01 java
7801 root 20 0 4048128 130740 13800 S 0.0 7.0 0:00.02 java
7802 root 20 0 4048128 130740 13800 S 0.0 7.0 0:00.01 java
7803 root 20 0 4048128 130740 13800 S 0.0 7.0 0:00.01 java
7804 root 20 0 4048128 130740 13800 S 0.0 7.0 0:00.00 java
7805 root 20 0 4048128 130740 13800 S 0.0 7.0 0:00.01 java
7806 root 20 0 4048128 130740 13800 S 0.0 7.0 0:00.01 java
7807 root 20 0 4048128 130740 13800 S 0.0 7.0 0:00.01 java
7808 root 20 0 4048128 130740 13800 S 0.0 7.0 0:00.00 java
7809 root 20 0 4048128 130740 13800 S 0.0 7.0 0:00.01 java
7810 root 20 0 4048128 130740 13800 S 0.0 7.0 0:00.09 java
7812 root 20 0 4048128 130740 13800 S 0.0 7.0 0:00.05 java
7814 root 20 0 4048128 130740 13800 S 0.0 7.0 0:00.06 java
7823 root 20 0 4048128 130740 13800 S 0.0 7.0 0:00.01 java
7824 root 20 0 4048128 130740 13800 S 0.0 7.0 0:00.01 java
7825 root 20 0 4048128 130740 13800 S 0.0 7.0 0:00.00 java
7826 root 20 0 4048128 130740 13800 S 0.0 7.0 0:00.01 java
7827 root 20 0 4048128 130740 13800 S 0.0 7.0 0:00.00 java
7828 root 20 0 4048128 130740 13800 S 0.0 7.0 0:00.00 java

[shell格式]

top -Hp <pid>
# -H 是线程模式的意思
# -p 指定pid VIRT 表示 Virtual Memory 虚拟内存
RES 表示 Resident Memory 驻留内存;进程实际占用的物理内存数(而非申请的内存数)
SHR 表示 shared memory 共享内存

2 uptime

查看 Linux 负载

[root@xxx ~]# uptime
09:21:06 up 47 days, 15:48, 2 users, load average: 0.45, 0.33, 0.27

uptime解释: 参考top命令的第1行解释

3 w

查看 Linux 负载

[root@xxx ~]# w
09:21:48 up 47 days, 15:49, 2 users, load average: 0.52, 0.36, 0.28
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 10.0.11.244 14Sep20 16:51m 0.25s 0.25s -bash
root pts/1 10.0.11.119 09:00 0.00s 0.00s 0.00s w

w解释

USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
USER — 登录的用户名
TTY — 登录后系统分配的终端号
FROM — 远程主机名,即从哪儿登录来的
LOGIN@ — 何时登录
IDLE — 空闲了多长时间,表示用户闲置的时间。这是一个计时器,一旦用户执行任何操作,该计时器便会被重置
JCPU — 和该终端(tty)连接的所有进程占用的时间,这个时间里并不包括过去的后台作业时间,但却包括当前正在运行的后台作业所占用的时间
PCPU — 指当前进程(即在WHAT项中显示的进程)所占用的时间
WHAT — 当前正在运行进程的命令行

4 vmstat

查看 Linux 负载

[root@xxx ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 593508 961904 336788 2067244 0 0 0 4 0 0 0 0 99 0 0 [root@xxx ~]#vmstat 5 5 【在5秒时间内进行5次采样】
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 593508 958208 336960 2067472 0 0 0 4 0 0 0 0 99 0 0
0 0 593508 958216 336964 2067476 0 0 0 48 857 1668 0 0 99 0 0

vmstat解释:

[procs]
r - 运行队列中进程数。多少个进程真的分配到CPU;当这个值超过了CPU数目,就会出现CPU瓶颈。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。
b - 阻塞队列中进程数。 [memory]
swpd - 虚拟内存已使用的大小(KB)[593508/1024=579.59MB]。如果大于0,表示当前机器的物理内存不足了;如果不是程序内存泄露的原因,那么该升级内存了或者把耗内存的任务迁移到其他机器。
free - 空闲的物理内存的大小(KB)[961904/1024=939.36MB]。
buff - 缓冲区大小(KB)[336788/1024=328.89MB]。
cache - 缓存大小(KB)[2067244/1024=2018.79]。 [swap]
si - 每秒从磁盘读入虚拟内存的大小。如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。
so - 每秒虚拟内存写入磁盘的大小。如果这个值大于0,同上。 [io]
bi - 块设备每秒接收的块数量。这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024Byte。
bo - 块设备每秒发送的块数量。例如读取文件时,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。 [system]
in - interrupt / 每秒CPU的中断次数,包括时间中断。
cs - count/second / 每秒上下文切换次数。例如: 我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。 [cpu]
us - user time / 用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。
sy - system time / 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
id - 空闲 CPU时间,一般来说,id + us + sy = 100,一般认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。
wa - 等待IO CPU时间。

vmstat命令使用,更多详见: Linux vmstat命令详解 - 博客园/小a玖拾柒

5 free

查看当前系统的【内存、缓存】及使用状况

[root@es1 elasticsearch]# free -h
total used free shared buffers cached
Mem: 31G 8.8G 22G 160K 497M 6.5G
-/+ buffers/cache: 1.8G 29G
Swap: 15G 68K 15G

buffers 即 缓存

手动清理缓存/手动释放buffers/cache内存

/proc是一个虚拟文件系统。我们可通过对它的读写操作作为与kernel实体间进行通信的一种手段。也就是说,可通过修改/proc中的文件,来对当前kernel的行为做出调整。也就是说我们可以通过调整/proc/sys/vm/drop_caches来释放内存

0 – 不释放
1 – 释放页缓存
2 – 释放dentries和inodes
3 – 释放所有缓存

# echo 1 > /proc/sys/vm/drop_caches
数字1是用来清空最近放问过的文件【页面缓存】 # echo 2 > /proc/sys/vm/drop_caches
数字2是用来清空文件【节点缓存】和【目录项缓存】 # echo 3 > /proc/sys/vm/drop_caches
数字3是用来清空1和2【所有内容】的缓存。
或者: sync; echo 3 > /proc/sys/vm/drop_caches
由于这是一个非破坏性的操作,并且脏对象是不可释放的,用户应该首先运行“sync”以确保所有缓存的对象都被释放。
Linux sync 指令会将存于 buffer 中的资料强制刷入/写入硬盘中。
Linux sync命令用于数据同步,sync命令是在关闭Linux系统时使用的。
Linux 系统中欲写入硬盘的资料有的时候为了效率起见,会写到 filesystem buffer 中,这个 buffer 是一块记忆体空间,如果欲写入硬盘的资料存于此 buffer 中,而系统又突然断电的话,那么资料就会流失了,sync 指令会将存于 buffer 中的资料强制写入硬盘中。

关于drop_caches的官方说明如下:

Writing to this file causes the kernel to drop clean caches,dentries and inodes from memory, causing that memory to becomefree.
To free pagecache, use echo 1 > /proc/sys/vm/drop_caches;
to free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches;
to free pagecache, dentries and inodes, use echo 3 >/proc/sys/vm/drop_caches.
Because this is a non-destructive operation and dirty objects are not freeable, the user should run sync first.

Linux内核会将它最近访问过的文件页面缓存在内存中一段时间,这个文件缓存被称为pagecache(页面缓存)

Inode是linux/unix操作系统中的一种数据结构,包含了各文件相关的一些重要信息。在创建文件系统时,就会同时创建大量的inode。一般inode表会占用文件系统磁盘空间的1%。

X 推荐文献

[Linux]查看硬件及操作系统信息 - 博客园
[Linux]常用命令之【nl/sed/awk/wc/xargs】
[Linux]常用命令之【netstat/ps/lsof/ss/kill/】
[Linux]常用命令之【vi/grep/find】
[Linux]常用命令之【systemctl/service】
Linux查看系统负载常用命令 - CSDN
Linux vmstat命令详解 - 博客园/小a玖拾柒
linux清理缓存 - 博客园
Linux sync命令 - 菜鸟教程
Linux的文件系统及文件缓存知识点整理 - 博客园 【推荐】

[Linux]常用命令之【top/uptime/w/vmstat/free】的相关教程结束。

《[Linux]常用命令之【top/uptime/w/vmstat/free】.doc》

下载本文的Word格式文档,以方便收藏与打印。