Linux系统监控、诊断工具之top命令详解

暂时没有写作灵感,就整理一些 Linux 基础知识好了,方便自己查阅,同时也是温故而知新嘛~!

在张戈博客,同样很有用的知识性博文还有以下几篇,也许你也会比较感兴趣:

详解 Linux 系统的 CPU 负载均值 教你如何查看 Linux 的 CPU 负载 Linux 服务器的进程查看命令详解 Llinux 文件目录权限及 chmod 命令简析 Linux 系统内存监控、性能诊断工具 vmstat 命令详解 Ps:更多相关博文,请访问系统运维 或 站内搜索,当然有其他 Linux 相关知识的需求也欢迎留言。

接触 linux 的人对于 top 命令可能不会陌生(不同系统名字可能不一样,如 IBM 的 aix 中叫 topas ),它的作用主要用来监控系统实时负载率、进程的资源占用率及其它各项系统状态属性是否正常。

下面我们先来看张 top 命令的截图:

(1)系统、任务统计信息:

前 8 行是系统整体的统计信息。第 1 行是任务队列信息,同 uptime 命令的执行结果。其内容如下:

01:06:48

当前时间

up 1:22

系统运行时间,格式为时:分

1 user

当前登录用户数

load average: 0.06, 0.60,0.48

系统负载,即任务队列的平均长度。 三个数值分别为 1 分钟、5 分钟、15 分钟前到现在的平均值。注意:这三个值可以用来判定系统是否负载过高——如果值持续大于系统 cpu 个数,就需要优化你的程序或者架构了。

(2)进程、 cpu 统计信息:

第 2~6 行为进程和 CPU 的信息。当有多个 CPU 时,这些内容可能会超过两行。内容如下:

Tasks: 29 total

进程总数

1 running

正在运行的进程数

28 sleeping

睡眠的进程数

0 stopped

停止的进程数

0 zombie

僵尸进程数

Cpu(s): 0.3% us

用户空间占用 CPU 百分比

1.0% sy

内核空间占用 CPU 百分比

0.0% ni

用户进程空间内改变过优先级的进程占用 CPU 百分比

98.7% id

空闲 CPU 百分比

0.0% wa

等待输入输出的 CPU 时间百分比

0.0% hi

Hardware IRQ 即“中断请求”的意思。

0.0% si

Software IRQ

(3)最后两行为内存信息:

Mem: 191272k total

物理内存总量

173656k used

使用的物理内存总量

17616k free

空闲内存总量

22052k buffers

用作内核缓存的内存量

Swap: 192772k total

交换区总量

0k used

使用的交换区总量

192772k free

空闲交换区总量

123988k cached

缓冲的交换区总量。 内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖, 该数值即为这些内容已存在于内存中的交换区的大小。 相应的内存再次被换出时可不必再对交换区写入。

PS:如何计算可用内存和已用内存?

除了 free -m 之外,也可以看 top:

Mem:    255592k total,   167568k used,    88024k free,    25068k buffers
Swap:   524280k total,        0k used,   524280k free,    85724k cached

3.1  实际的程序可用内存数怎么算呢?

The answer is: free + (buffers + cached)

88024k + (25068k + 85724k) = 198816k

3.2  程序已用内存数又怎么算呢?

The answer is: used – (buffers + cached)

167568k – (25068k + 85724k) = 56776k

3.3  怎么判断系统是否内存不足呢?

如果你的 swap used 数值大于 0 ,基本可以判断已经遇到内存瓶颈了,要么优化你的代码,要么加内存。

3.4  buffer 与 cache 的区别

A buffer is something that has yet to be “written” to disk. A cache is something that has been “read” from the disk and stored for later use 从应用程序角度来看,buffers/cached 是等于可用的,因为 buffer/cached 是为了提高文件读写的性能,当应用程序需在用到内存的时候,buffer/cached 会很快地被回收。

所以从应用程序的角度来说,【可用内存】=【系统 free memory】+【buffers】+【cached】

buffers 是指用来给块设备做的缓冲大小,他只记录文件系统的 metadata 以及 tracking in-flight pages. cached 是用来给文件做缓冲。

那就是说:buffers 是用来存储,目录里面有什么内容,权限等等。而 cached 直接用来记忆我们打开的文件,如果你想知道他是不是真的生效,你可以试一下,先后执行两次 cat 一个比较大的日志文件,比如 nginx 的 access.log,你就可以明显的感觉到第二次的开打的速度快很多。

因为 Linux 将你暂时不使用的内存作为文件和数据缓存,以提高系统性能,当你需要这些内存时,系统会自动释放(不像 windows 那样,即使你有很多空闲内存,他也要访问一下磁盘中的 pagefiles)

(4)进程信息区:

统计信息区域的下方显示了各个进程的详细信息。首先来认识一下各列的含义。

序号

列名

含义

a

PID

进程 id

b

PPID

父进程 id

c

RUSER

Real user name

d

UID

进程所有者的用户 id

e

USER

进程所有者的用户名

f

GROUP

进程所有者的组名

g

TTY

启动进程的终端名。不是从终端启动的进程则显示为 ?

h

PR

优先级

i

NI

nice 值。负值表示高优先级,正值表示低优先级

j

P

最后使用的 CPU,仅在多 CPU 环境下有意义

k

%CPU

上次更新到现在的 CPU 时间占用百分比

l

TIME

进程使用的 CPU 时间总计,单位秒

m

TIME+

进程使用的 CPU 时间总计,单位 1/100 秒

n

%MEM

进程使用的物理内存百分比

o

VIRT

进程使用的虚拟内存总量,单位 kb。VIRT=SWAP+RES

p

SWAP

进程使用的虚拟内存中,被换出的大小,单位 kb。

q

RES

进程使用的、未被换出的物理内存大小,单位 kb。RES=CODE+DATA

r

CODE

可执行代码占用的物理内存大小,单位 kb

s

DATA

可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位 kb

t

SHR

共享内存大小,单位 kb

u

nFLT

页面错误次数

v

nDRT

最后一次写入到现在,被修改过的页面数。

w

S

进程状态。 D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程

x

COMMAND

命令名/命令行

y

WCHAN

若该进程在睡眠,则显示睡眠中的系统函数名

z

Flags

任务标志,参考 sched.h

(5)查看指定列

默认情况下仅显示比较重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。 可以通过下面的快捷键来更改显示内容:

5.1 f 键选择显示内容

通过 f 键可以选择显示的内容。按 f 键之后会显示列的列表,按 a-z 即可显示或隐藏对应的列,最后按回车键确定。

5.2 o 键改变显示顺序

按 o 键可以改变列的显示顺序。按小写的 a-z 可以将相应的列向右移动,而大写的 A-Z 可以将相应的列向左移动。最后按回车键确定。

5.3 F/O 键将进程按列排序

按大写的 F 或 O 键,然后按 a-z 可以将进程按照相应的列进行排序。而大写的 R 键可以将当前的排序倒转。

(6)常用交互命令

从使用角度来看,熟练的掌握这些命令比掌握选项还重要一些。这些命令都是单字母的,如果在命令行选项中使用了 s 选项,则可能其中一些命令会被屏蔽掉。

Ctrl+L 擦除并且重写屏幕。
h或者? 显示帮助画面,给出一些简短的命令总结说明。
k 终止一个进程。系统将提示用户输入需要终止的进程PID,以及需要发送给该进程什么样的信号。一般的终止进程可以使用15信号;如果不能正常结束那就使用信号9强制结束该进程。默认值是信号15。在安全模式中此命令被屏蔽。
i 忽略闲置和僵死进程。这是一个开关式命令。
q 退出程序。
r 重新安排一个进程的优先级别。系统提示用户输入需要改变的进程PID以及需要设置的进程优先级值。输入一个正值将使优先级降低,反之则可以使该进程拥有更高的优先权。默认值是10。
S 切换到累计模式。
s 改变两次刷新之间的延迟时间。系统将提示用户输入新的时间,单位为s。如果有小数,就换算成m s。输入0值则系统将不断刷新,默认值是5 s。需要注意的是如果设置太小的时间,很可能会引起不断刷新,从而根本来不及看清显示的情况,而且系统负载也会大大增加。
f或者F 从当前显示中添加或者删除项目。
o或者O 改变显示项目的顺序。
l 切换显示平均负载和启动时间信息。
m 切换显示内存信息。
t 切换显示进程和CPU状态信息。
c 切换显示命令名称和完整命令行。
M 根据驻留内存大小进行排序。
P 根据CPU使用百分比大小进行排序。
T 根据时间/累计时间进行排序。
W 将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法。

(7)最后的技能:top 命令小技巧

1、输入大写P,则结果按CPU占用降序排序。
2、输入大写M,结果按内存占用降序排序。
3、按数字 1 则可以显示所有CPU核心的负载情况。
4、top -d 5    每隔 5 秒刷新一次,默认 1 秒
5、top -p 4360,4358    监控指定进程
6、top -U johndoe    ‘U’为 真实/有效/保存/文件系统用户名。
7、top -u 500    ‘u’为有效用户标识
8、top -bn 1    显示所有进程信息,top -n 1 只显示一屏信息,供管道调用
9、top -M   #show memory summary in megabytes not kilobytes
10、top -p 25097 -n 1 -b    # -b 避免输出控制字符,管道调用出现乱码
11、top翻页:top -bn1 | less

12、增强版的 top:htop ,一个更加强大的交互式进程管理器:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据之美

linux 系统监控、诊断工具之 top 详解

接触 linux 的人对于 top 命令可能不会陌生(不同系统名字可能不一样,如 IBM 的 aix 中叫 topas ),它的作用主要用来监控系统实时负载率、...

3065
来自专栏蓝天

Linux下共享库(SO)有关的几个环境变量

Linux支持共享库已经有悠久的历史了,不再是什么新概念了。大家都知道如何编译、连接以及动态加载(dlopen/dlsym/dlclose) 共享库。但是,...

1541
来自专栏Golang语言社区

goroutine背后的系统知识

Go语言从诞生到普及已经三年了,先行者大都是Web开发的背景,也有了一些普及型的书籍,可系统开发背景的人在学习这些书籍的时候,总有语焉不详的感觉,网上也有若干流...

3504
来自专栏瓜大三哥

Matlab基本语法8

程序调试和编程技巧 在编写matlab程序时,难免会出现错误,这时就需要对程序进行调试。matlab中,m文件调试主要有两种方法:直接调试法和工具调试法。 拼写...

2277
来自专栏逆向技术

32位汇编第一讲x86和8086的区别,以及OllyDbg调试器的使用

32位汇编第一讲x86和8086的区别,以及OllyDbg调试器的使用 一丶32位(x86也称为80386)与8086(16位)汇编的区别 1.寄存器的改变  ...

2879
来自专栏Golang语言社区

goroutine背后的系统知识

Go语言从诞生到普及已经三年了,先行者大都是Web开发的背景,也有了一些普及型的书籍,可系统开发背景的人在学习这些书籍的时候,总有语焉不详的感觉,网上也有若干...

3518
来自专栏Java3y

Hibernate面试题大全

Hibernate常见面试题 Hibernate工作原理及为什么要用? Hibernate工作原理及为什么要用? 读取并解析配置文件 读取并解析映射信息,创建...

4155
来自专栏Golang语言社区

Goroutine背后的系统知识

Go语言从诞生到普及已经三年了,先行者大都是Web开发的背景,也有了一些普及型的书籍,可系统开发背景的人在学习这些书籍的时候,总有语焉不详的感觉,网上也有若干流...

3536
来自专栏Java架构师历程

IntelliJ IDEA 类代码模板注解自定义

本篇内容为大家提供的是IntelliJ IDEA 使用教程中的文件代码模板的使用,IntelliJ IDEA是java语言开发的集成环境,IntelliJ在业界...

2.1K3
来自专栏Puppeteer学习

一步一步学Vue(七)

1673

扫码关注云+社区

领取腾讯云代金券