【拔苗计划】linux学习笔记——top命令学习

来源:互联网 发布:实体店客源流失数据 编辑:程序博客网 时间:2024/04/27 19:19

写笔记不为了别的,一是好记性不如烂笔头,泛泛看了过去很容易忘,通过自己的语言组织一下会加强记忆;二是对学习情况做个记录,毕竟事情太多很容易忘,写笔记能做到有迹可循。

今天学习的主题是:linux的top命令

从别的地方找来的top命令显示数据

【在正式分析前,先八卦一下,为什么这个命令叫top】
度娘告诉我,top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况。比较准确地说,top命令提供了实时的对系统处理器的状态监视。它将显示系统中CPU最“敏感”的任务列表。该命令可以按CPU内存使用和执行时间对任务进行排序。这一串描述看下来,我八卦的结果是——因为这个命令可以把服务器的最重要的信息展示出来——top作为英文单词,有一个含义是“最重要的事物”。

【八卦结束,进入正题】
输入top命令后,服务器显示结果是动态更新的,但固定的是一堆列表前面是五行,下面是按CPU内存使用和执行时间排序的服务器上运行的任务。
前五行中,需要重点关注的有:
1. load average
2. tasks
3. Cpu(s)
4. Mem
5. Swap
咦?怎么好像前五行的内容全都列出来了(⊙﹏⊙)b不管了
关注第一的一定是load average(负载),我们常说负载负载,负载到底是啥东东呢?对linux服务器来说,负载是任务队列的平均长度。列出来了三个值,分别为 1分钟、5分钟、15分钟前到现在的平均值。这里的单位是什么我翻了几篇文章都没有提到,但可以确定的是,1.0指的是服务器刚好承受的情况,超过这个值指服务器超负荷了,没到这个值说明服务器还有余力处理更多的任务。一般来说,服务器的负载超过了5,就比较严重了。
Tasks展示出来的就是服务器上正在进行的任务的各种数目。如果有僵尸进程的话应该要处理一下。
Cpu(s)就是各种CPU占比,Mem是内存信息,总共多少内存用了多少内存空余多少内存等等。
Swap是交换区信息,总量多少,用了多少,空闲多少。

一列列的进程信息列出来进程ID、CPU使用占比、MEM使用占比,默认排序是CPU从高到低。

Q&A【自问自答】

  1. load average列了三个值,那哪个更加能衡量系统的健康状况呢?
    个人觉得,5分钟的值相对于1分钟和15分钟更有价值一些。
  2. 负载在什么数值是比较理想的?
    • “需要进行调查法则”: 如果长期你的系统负载在 0.70 上下,那么你需要在事情变得更糟糕之前,花些时间了解其原因。
    • “现在就要修复法则”:1.00 。 如果你的服务器系统负载长期徘徊于 1.00,那么就应该马上解决这个问题。否则,你将半夜接到你上司的电话,这可不是件令人愉快的事情。
    • “凌晨三点半锻炼身体法则”:5.00。 如果你的服务器负载超过了 5.00 这个数字,那么你将失去你的睡眠,还得在会议中说明这情况发生的原因,总之千万不要让它发生。
  3. 进程列表排序原则?
    默认CPU从高到低,如果在top命令后加参数,大写M切换为内存。
  4. 常用参数
    • top -d 2 含义:每隔2秒显示所有进程的资源占用情况,-d delay,默认5秒
    • top -p 12 含义:显示pid是12进程的资源占用情况, -p process
    • top -c 含义:显示进程的命令行参数(默认进程名),-c command, 可带-p参数,也可不带

—————-11月7日更新——————————-
补充下对进程状态的一些学习
进程情况的第8列表头S,指的是status,就是进程状态。具体到各个进程,状态就多种多样了,常见的状态有R、S、D,不常见的有T、Z、X,挨个了解一下。
R=Task_Running运行中
S=Task_Interruptible可中断的睡眠状态
D=Task_Uninterruptible不可中断的睡眠状态
T=Task_Traced暂停状态或跟踪状态
X=Task_Dead即将被销毁状态
Z=Exit_Zombie退出状态,进程成为僵尸进程
上面截图中,一溜S的,即睡眠状态(不加不可中断的就认为是可中断的),一开始我还以为S是Sleep呢。一般情况下,进程列表中的绝大多数进程都处于TASK_INTERRUPTIBLE状态(除非机器的负载很高),毕竟CPU就这么多(无非就是几个最多几十个),进程动辄几十上百个,如果不是绝大多数进程都在睡眠,CPU又怎么响应得过来。处于这个状态的进程因为等待某某事件的发生(比如等待socket连接、等待信号量)从而被挂起。这些进程的task_struct结构被放入对应事件的等待队列中。当这些事件发生时(由外部中断触发、或由其他进程触发),对应的等待队列中的一个或多个进程将被唤醒。
D和S类似,都是睡眠状态,但D有个修饰语,不可中断的。一般来说,进程处于睡眠状态都是可以中断的,即可以随时响应异步信号从S状态转换为R状态。那D状态有什么存在的意义呢?D状态存在的意义就在于,内核的某些处理流程是不能被打断的。如果响应异步信号,程序的执行流程中就会被插入一段用于处理异步信号的流程(这个插入的流程可能只存在于内核态,也可能延伸到用户态),于是原有的流程就被中断了。在进程对某些硬件进行操作时(比如进程调用read系统调用对某个设备文件进行读操作,而read系统调用最终执行到对应设备驱动的代码,并与对应的物理设备进行交互),可能需要使用D状态对进程进行保护,以避免进程与设备交互的过程被打断,造成设备陷入不可控的状态。这种情况下的D状态总是非常短暂的,基本上不可能捕捉到。
其他状态平时碰到也比较少,比如Z状态的僵尸进程,需要有专门的研究,放在这里太勉为其难了。今天就在这里结束吧。

0 0