Linux系统下top命令的每个参数代表什么意思

Linux系统下top命令的每个参数代表什么意思,第1张

各参数含义

一、top前5行统计信息

第1行:top - 05:43:27 up 4:52, 2 users, load average: 0.58, 0.41, 0.30

第1行是任务队列信息,其参数如下:

内容 含义

05:43:27 表示当前时间

up 4:52 系统运行时间 格式为时:分

2 users 当前登录用户数

load average: 0.58, 0.41, 0.30 系统负载,即任务队列的平均长度。 三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。

load average: 如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。

第2行:Tasks: 159 total, 1 running, 158 sleeping, 0 stopped, 0 zombie

第3行:%Cpu(s): 37.0 us, 3.7 sy, 0.0 ni, 59.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

第2、3行为进程和CPU的信息

当有多个CPU时,这些内容可能会超过两行,其参数如下:

内容 含义

159 total 进程总数

1 running 正在运行的进程数

158 sleeping 睡眠的进程数

0 stopped 停止的进程数

0 zombie 僵尸进程数

37.0 us 用户空间占用CPU百分比

3.7 sy 内核空间占用CPU百分比

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

59.3 id 空闲CPU百分比

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

0.0 hi 硬中断(Hardware IRQ)占用CPU的百分比

0.0 si 软中断(Software Interrupts)占用CPU的百分比

0.0 st

第4行:KiB Mem: 1530752 total, 1481968 used, 48784 free, 70988 buffers

第5行:KiB Swap: 3905532 total, 267544 used, 3637988 free. 617312 cached Mem

第4、5行为内存信息

其参数如下:

内容 含义

KiB Mem: 1530752 total 物理内存总量

1481968 used 使用的物理内存总量

48784 free 空闲内存总量

70988 buffers 用作内核缓存的内存量

KiB Swap: 3905532 total 交换区总量

267544 used 使用的交换区总量

3637988 free 空闲交换区总量

617312 cached Mem 缓冲的交换区总量。

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

计算可用内存数有一个近似的公式:

第四行的free + 第四行的buffers + 第五行的cached

二、进程信息

列名 含义

PID 进程id

PPID 父进程id

RUSER Real user name

UID 进程所有者的用户id

USER 进程所有者的用户名

GROUP 进程所有者的组名

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

PR 优先级

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

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

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

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

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

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

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

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

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

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

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

SHR 共享内存大小,单位kb

nFLT 页面错误次数

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

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

COMMAND 命令名/命令行

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

Flags 任务标志

三、

1.top命令默认值显示前面一部分的进程,若是想要查看全部的进程信息,则需要使用命令:top -ab -n 1,在这个命令中,a表示按内存倒序排列,b表示将所有列输出,n表示只执行一次。

2.在使用top -ab -n 1将所有进程信息输出之后,可以使用AWK等类似工具统计信息,例如:统计出COMMAND为httpd的所有进程占用的内存。

3.也可以使用命令top -an -n 1 | grep httpd,查看所有httpd的进程信息,如下图:

linux

任务管理-后台运行与终止fg、bg、jobs、&、ctrl

+

z命令一、

&加在一个命令的最后,可以把这个命令放到后台执行

,如gftp

&,二、ctrl

+

z可以将一个正在前台执行的命令放到后台,并且处于暂停状态,不可执行

三、jobs查看当前有多少在后台运行的命令jobs

-l选项可显示所有任务的PID,jobs的状态可以是running,

stopped,

Terminated,但是如果任务被终止了(kill),shell

从当前的shell环境已知的列表中删除任务的进程标识;也就是说,jobs命令显示的是当前shell环境中所起的后台正在运行或者被挂起的任务信息;四、fg将后台中的命令调至前台继续运行如果后台中有多个命令,可以用

fg

%jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)五、bg将一个在后台暂停的命令,变成继续执行

(在后台执行)如果后台中有多个命令,可以用bg

%jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)将任务转移到后台运行:先ctrl

+

z;再bg,这样进程就被移到后台运行,终端还能继续接受命令。概念:当前任务如果后台的任务号有2个,[1],[2];如果当第一个后台任务顺利执行完毕,第二个后台任务还在执行中时,当前任务便会自动变成后台任务号码“[2]”

的后台任务。所以可以得出一点,即当前任务是会变动的。当用户输入“fg”、“bg”和“stop”等命令时,如果不加任何引号,则所变动的均是当前任务进程的终止后台进程的终止:方法一:通过jobs命令查看job号(假设为num),然后执行kill

%num方法二:通过ps命令查看job的进程号(PID,假设为pid),然后执行kill

pid前台进程的终止:ctrl+ckill的其他作用kill除了可以终止进程,还能给进程发送其它信号,使用kill

-l

可以察看kill支持的信号。SIGTERM是不带参数时kill发送的信号,意思是要进程终止运行,但执行与否还得看进程是否支持。如果进程还没有终止,可以使用kill

-SIGKILL

pid,这是由内核来终止进程,进程不能监听这个信号。进程的挂起后台进程的挂起:在solaris中通过stop命令执行,通过jobs命令查看job号(假设为num),然后执行stop

%num;在redhat中,不存在stop命令,可通过执行命令kill

-stop

PID,将进程挂起;当要重新执行当前被挂起的任务时,通过bg

%num

即可将挂起的job的状态由stopped改为running,仍在后台执行;当需要改为在前台执行时,执行命令fg

%num即可;前台进程的挂起:ctrl+Z

Linux新手,个人认为首先就应该了解一下top命令各项的含义.

不用有事就问什么搜索引擎,先看看man top.

top - 16:12:56 up 1 day, 22 min, 4 users, load average: 0.02, 0.04, 0.05

Tasks: 158 total, 1 running, 156 sleeping, 0 stopped, 1 zombie

%Cpu(s): 0.7 us, 0.3 sy, 0.0 ni, 98.8 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st

KiB Mem: 1017912 total, 895892 used, 122020 free,15312 buffers

KiB Swap: 1045500 total,19608 used, 1025892 free. 230012 cached Mem

PID USER PR NIVIRTRESSHR S %CPU %MEM TIME+ COMMAND

5761 eechen20 0 32144 1548 1076 R 6.2 0.2 0:00.01 top

16:12:56 up 1 day, 22 min, 4 users, load average: 0.02, 0.04, 0.05

这句等同于执行 uptime 命令返回的内容.

16:12:56 是当前时间(date).

up 1 day, 22 min 表示系统已经运行1天又22分钟(uptime -p).

4 users 表示当前登录系统的用户(w,who).

load average 表示系统负载,分别是1分钟,5分钟,15分钟前到现在的负载平均值.

Tasks: 158 total 表示系统的进程数(数目等于ps -ef|wc -l的值减去2),按大写H可以切换到线程模式.

running表示正在运行的进程,sleeping表示睡眠的进程,stopped表示暂停的进程,zombie表示已结束但还没有从进程表中删除的僵尸进程.

total表示总内存,used表示已经使用的内存,free表示空闲的内存,按E可以切换单位.

buffers(Buffer Cache)表示块设备的读写缓冲区占用的内存,cached(Page Cache)表示文件系统缓存占用的内存.

buffers:块设备缓冲 cached:文件系统缓存

如果cached的值很大,说明cache住的文件数很多.如果频繁访问到的文件都能被cache住,那么磁盘的读I/O就非常小.

所谓块设备是指对其信息的存取以"块"为单位,如通常的光盘,硬磁盘,软磁盘,磁带等,块长取512字节或1024字节或4096字节.

块设备可以直接通过块设备特别文件来访问,为了提高数据传输效率,块设备驱动程序内部采用块缓冲技术.

Swap是交换空间,交换空间在物理内存(RAM)被充满时被使用.

如果系统需要更多的内存资源,而物理内存已经充满,内存中不活跃的页就会被移到交换空间去.

虽然交换空间可以为带有少量内存的机器提供帮助,但是这种方法不应该被当做是对内存的取代.

交换空间位于硬盘驱动器上,它比进入物理内存要慢.

load average的理解:

load average指的是处于task_running或task_uninterruptible状态的进程(或线程)数的平均值.

处于task_running状态的进程(或线程),可能正在使用CPU或排队等待使用CPU.

处于task_uninterruptible状态的进程(或线程),可能正在等待I/O,比如等待磁盘I/O.这时I/O等待占用的CPU时间百分比iowait(wa)可能会比较高.

sudo strace -p `pidof top` 可见top从/proc读取了很多信息.

man proc 查看 /proc/loadavg 的说明:

man proc | col -b >proc.txt

/proc/loadavg 内容:

0.22 0.13 0.14 2/374 5306

0.22 0.13 0.14表示在过去的1分钟,5分钟,15分钟,

正在运行(task_running)或等待IO(task_uninterruptible)的任务的数量.

2/374中的2表示当前运行的线程数,374则表示系统当前存在的内核调度实体(进程/线程)的数量.

5306是系统最近创建的进程PID编号.

又比如:

load average: 31.09, 29.87, 29.92

表示在过去的1分钟,5分钟,15分钟的时间里,CPU任务队列中平均有30个程序(这里应该是30个Java线程)在使用CPU.

PID USER PR NIVIRTRESSHR S %CPU %MEM TIME+ COMMAND

20248 root 20 0 0.227t 0.012t 18748 S 3090 5.2 29812:58 java

Java进程的CPU使用率%CPU达到3090%,表示这个Java进程正在使用31个CPU核心,

这样对上了上面load average得出的数据,也就是有30个左右的Java线程正在使用30个CPU核心.

按H(区分大小写)切换到线程模式,因为一个线程最多只能使用一个核心,所以线程模式下显示的CPU使用率不会超过100%.

当CPU和磁盘都忙不过来的时候,开再多的进程也没有任何意义,只会徒增CPU上下文切换和磁盘I/O等待,得不偿失.

系统负载高,普遍是因为系统进程数太多,I/O太多导致的.

load average小于1表示系统空闲,大于1表示系统开始繁忙.

Linux服务器的任务(进程)数量保持在200个以下是比较好的,最好不要超过300个.

us, user : time running un-niced user processes 用户空间进程占用CPU时间百分比

sy, system : time running kernel processes 内核进程占用CPU时间百分比

ni, nice : time running niced user processes 用户空间内改变过优先级的进程占用CPU时间百分比

id, idle : time spent in the kernel idle handler 空闲CPU时间百分比(100%表示系统完全空闲)

wa, iowait : time waiting for I/O completion I/O等待占用的CPU时间百分比

hi : time spent servicing hardware interrupts 硬件中断占用CPU时间百分比

si : time spent servicing software interrupts 软件中断占用CPU时间百分比

st : time stolen from this vm by the hypervisor 虚拟化hypervisor从当前虚拟机vm偷走的时间

如果st这个值很高的话,说明你的VPS提供商的CPU资源有限,而你没能抢过别人,很有可能就是VPS提供商超售了.

按F选择要显示的列和查看每列的含义,默认有下面这些列:

PID = Process Id

USER= Effective User Name

PR = Priority PR和NI的值越高越友好即越不竞争资源,比如PR 20和NI 0,另外,PR=NI+20.

NI = Nice Value 负值表示高优先级,正值表示低优先级,比如kworker的NI为-20,PR为0.

VIRT= Virtual Image (KiB)

RES = Resident Size (KiB) 常驻内存,按E切换单位.

SHR = Shared Memory (KiB)

S = Process Status

%CPU= CPU Usage 四核处理器在Tasks模式下满载为400%,在Threads模式(按H切换)下满载为100%(一个线程最多只能使用一个核心).按Shift+P按CPU使用率排序.

%MEM= Memory Usage (RES) 满载为100%,按Shift+M按RES内存排序.

TIME+ = CPU Time, hundredths 进程使用的CPU时间总计.比如2:32.45代表2分钟32.45秒.

COMMAND = Command Name/Line

按F进入域管理窗口后按A可以切换显示模式,按空格选中要显示的列,按S按指定列排序,用向右方向键选中列后可以调整顺序.修改后按Shift+W保存设置到~/.toprc文件.

top里面按Shift+M是按内存排序,按E是切换内存单位,按Shfit+W保存设置.

然后执行top -n1 -b可以看到按内存排序的所有进程的信息.

或者ps后用sort排序:

ps aux | sort -k4nr | head -n5

top里按C或者使用-c参数可以看到进程的绝对路径和启动参数,就可以得到类似ps -ef和ps aux提供的信息了.

看进程路径: top -p `pidof firefox` -c -n1

看进程线程: top -p `pidof firefox` -H -n1

Linux Process Status:

http://blog.csdn.net/tianlesoftware/article/details/6457487

R (task_running) : 可执行状态

S (task_interruptible): 可中断的睡眠状态

D (task_uninterruptible): 不可中断的睡眠状态

T (task_stopped or task_traced): 暂停状态或跟踪状态

Z (task_dead - exit_zombie): 退出状态,进程成为僵尸进程

X (task_dead - exit_dead): 退出状态,进程即将被销毁

running进程:

只有在该状态的进程才可能在CPU上运行。

而同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的可执行队列中(一个进程最多只能出现在一个CPU的可执行队列中)。

进程调度器的任务就是从各个CPU的可执行队列中分别选择一个进程在该CPU上运行。

很多 *** 作系统教科书将正在CPU上执行的进程定义为RUNNING状态、而将可执行但是尚未被调度执行的进程定义为READY状态,这两种状态在Linux下统一为TASK_RUNNING状态。

sleeping进程:

处于这个状态的进程因为等待某某事件的发生(比如等待socket连接、等待信号量),而被挂起。

这些进程的task_struct结构被放入对应事件的等待队列中。当这些事件发生时(由外部中断触发、或由其他进程触发),对应的等待队列中的一个或多个进程将被唤醒。

通过ps命令我们会看到,一般情况下,进程列表中的绝大多数进程都处于task_interruptible状态(除非机器的负载很高)。

毕竟CPU就这么一两个,进程动辄几十上百个,如果不是绝大多数进程都在睡眠,CPU又怎么响应得过来。

stopped进程:

向进程发送一个sigstop信号,它就会因响应该信号而进入task_stopped状态,除非该进程本身处于task_uninterruptible状态而不响应信号。

sigstop与sigkill信号一样,是非常强制的。不允许用户进程通过signal系列的系统调用重新设置对应的信号处理函数。

向进程发送一个sigcont信号,可以让其从task_stopped状态恢复到task_running状态。

当进程正在被跟踪时,它处于task_traced这个特殊的状态。“正在被跟踪”指的是进程暂停下来,等待跟踪它的进程对它进行 *** 作。

比如在gdb中对被跟踪的进程下一个断点,进程在断点处停下来的时候就处于task_traced状态。而在其他时候,被跟踪的进程还是处于前面提到的那些状态。

对于进程本身来说,task_stopped和task_traced状态很类似,都是表示进程暂停下来。

而task_traced状态相当于在task_stopped之上多了一层保护,处于task_traced状态的进程不能响应sigcont信号而被唤醒。

只能等到调试进程通过ptrace系统调用执行ptrace_cont、ptrace_detach等 *** 作(通过ptrace系统调用的参数指定 *** 作),或调试进程退出,被调试的进程才能恢复task_running状态。

zombie进程:

在Linux进程的状态中,僵尸进程是非常特殊的一种,它是已经结束了的进程,但是没有从进程表中删除。

太多了会导致进程表里面条目满了,进而导致系统崩溃,倒是不占用其他系统资源。

它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,

仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。

进程在退出的过程中,处于TASK_DEAD状态。在这个退出过程中,进程占有的所有资源将被回收,除了task_struct结构(以及少数资源)以外。

于是进程就只剩下task_struct这么个空壳,故称为僵尸。

之所以保留task_struct,是因为task_struct里面保存了进程的退出码、以及一些统计信息。

而其父进程很可能会关心这些信息。比如在shell中,$?变量就保存了最后一个退出的前台进程的退出码,而这个退出码往往被作为if语句的判断条件。

当然,内核也可以将这些信息保存在别的地方,而将task_struct结构释放掉,以节省一些空间。

但是使用task_struct结构更为方便,因为在内核中已经建立了从pid到task_struct查找关系,还有进程间的父子关系。

释放掉task_struct,则需要建立一些新的数据结构,以便让父进程找到它的子进程的退出信息。

子进程在退出的过程中,内核会给其父进程发送一个信号,通知父进程来“收尸”。

父进程可以通过wait系列的系统调用(如wait4、waitid)来等待某个或某些子进程的退出,并获取它的退出信息。

然后wait系列的系统调用会顺便将子进程的尸体(task_struct)也释放掉。

这个信号默认是SIGCHLD,但是在通过clone系统调用创建子进程时,可以设置这个信号。

如果他的父进程没安装SIGCHLD信号处理函数调用wait或waitpid()等待子进程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态,子进程的尸体(task_struct)也就无法释放掉。

如果这时父进程结束了,那么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。

但是如果如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是为什么系统中有时会有很多的僵尸进程。

当进程退出的时候,会将它的所有子进程都托管给别的进程(使之成为别的进程的子进程)。

托管的进程可能是退出进程所在进程组的下一个进程(如果存在的话),或者是1号进程。

所以每个进程、每时每刻都有父进程存在。除非它是1号进程。1号进程,pid为1的进程,又称init进程。

Linux系统启动后,第一个被创建的用户态进程就是init进程。它有两项使命:

1、执行系统初始化脚本,创建一系列的进程(它们都是init进程的子孙);

2、在一个死循环中等待其子进程的退出事件,并调用waitid系统调用来完成“收尸”工作;

init进程不会被暂停、也不会被杀死(这是由内核来保证的)。它在等待子进程退出的过程中处于task_interruptible状态,“收尸”过程中则处于task_running状态。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7333697.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-04
下一篇2023-04-04

发表评论

登录后才能评论

评论列表(0条)

    保存