不得不说的top命令

写在前面:本文内容借鉴于其他博主的经验贴(拜谢),重新整理以便查阅。首先解释top命令查询结果,然后介绍top的常用操作指令及参数,最后对top中的负载load average进行详细介绍。

1.top命令结果解释

  • 统计信息区

1)第一行 当前时间15:19:09; up:运行了865天21小时41分钟; user:当前用户数1位; load average(重点) 系统负载:任务队列不同时间段内的平均长度,分别为1分钟,5分钟,15分钟内的运行队列中(在CPU上运行或者等待运行多少进程)的平均进程数。如果是单核CPU,需要平均负载值小于1,越小代表系统越闲置。

2)第二行 tasks:当前进程总数 167个,2个正在运行,165个睡眠状态的进程,0个停止的进程,0个僵尸进程。需要注意僵尸进程数,如果不是0,需要进一步查看哪个进程变为了僵尸进程。

备注:僵尸进程的排查方法:

在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程。子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束。 当一个进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。

  孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

  僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。

  如何统计僵尸进程信息:现在大多数linux系统,会将僵尸进程标识为defunct,所以你也可以通过如下命令ps -ef | grep "defunct"来获取僵尸进程信息。

  通常直接通过kill -9 [pid]很难直接杀掉僵尸进程,我们可以通过杀掉其父进程,父进程死后,僵尸进程成为”孤儿进程”,过继给1号进程init,init始终会负责清理僵尸进程.它产生的所有僵尸进程也跟着消失。

  如下为处理僵尸进程的方法:

  • 直接kill掉僵尸进程的父进程

ps -e -o stat,ppid,pid,cmd | grep -e  '^[Zz]'| cut -d” ” -f2 | xargs kill -9

参数说明:

ps:ps命令用于获取当前系统的进程信息.

-e:参数用于列出所有的进程

-o:参数用于设定输出格式,这里只输出进程的stat(状态信息)、ppid(父进程pid)、pid(当前进程的pid),cmd(即进程的可执行文件。

grep -e:-e参数,后边接正则表达式

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

  • 但有时候通过结束父进程从而结束僵尸进程,这只能算是一个比较理想的情况 ,很多时候遇到僵尸进程我们不能结束父进程,比如父进程是init进程,那一旦结束父进程,整个系统就挂掉了,这时候则可以考虑挂起子进程,一个进程一旦挂起就相当于“什么都不做了”。可以通过执行如下命令来挂起进程。

kill -HUP 进程pid

kill -HUP `ps -A -o stat,ppid,pid,cmd | grep -e ’^[Zz]‘ | awk -F " " ’{print $2}’`

//以上ps -e -o stat,ppid,pid,cmd | grep -e  '^[Zz]'| cut -d” ” -f2  和 ps -A -o stat,ppid,pid,cmd | grep -e ’^[Zz]‘ | awk -F " " ’{print $2}’结果是一样的,ps -A也是用于列出所有进程,后边的cut和awk -F " " '{print $2}'的效果也是一样的。

3)第三行 cpu信息

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

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

ni: 用户进程空间内改变过优先级的进程占用CPU百分比
id: 空闲CPU
wa: 等待输入输出的CPU时间百分比
hi: 硬中断
si: 软中断
st: 实时
备注:(英文解释)
%us: is meaning of "user CPU time"
%sy: is meaning of "system CPU time"
%ni: is meaning of" nice CPU time"
%id: is meaning of "idle"
%wa: is meaning of "iowait" 
%hi:is meaning of "hardware irq"si : is meaning of "software irq"
%st : is meaning of "steal time

这里需要注意的是%wa,这个项目代表的是I/O wait,通常如果这个值较大系统就会变慢

4)第四行 MEM物理内存

total,内存总容量
used,使用的物理内存总量
free,空闲内存总量
buffers,用做内核缓存的内存量

5)第五行 SWAP交换分区虚拟内存

total,交换分区总量
used,使用的交换分区总量
free,空闲的交换分区总量
cached,缓冲的交换区总量

当swap分区使用量used值较大的时候,说明物理内存不足才会使用到虚拟内存。

备注:

关于cache和buffer的澄清

cache是高速缓存,是位于CPU与主内存间的一种容量较小但速度很高的存储器。由于CPU的速度远高于主内存,CPU直接从内存中存取数据要等待一定时间周期,Cache中保存着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据时可从Cache中直接调用,这样就减少了CPU的等待时间,提高了系统的效率。Cache又分为一级Cache(L1 Cache)和二级Cache(L2 Cache),L1 Cache集成在CPU内部,L2 Cache早期一般是焊在主板上,现在也都集成在CPU内部,常见的容量有256KB或512KB L2 Cache。如果 cache 的值很大,说明cache住的文件数很多。如果频繁访问到的文件都能被cache住,那么磁盘的读IO bi会非常小(可通过vmstat命令查看bi)。
buffer是I/O缓存,用于内存和硬盘的缓冲。一个用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据时,速度快的设备的操作进程不发生间断。

linux内存计算方法

多数的linux系统在free命令后会发现free(剩余)的内存很少,而自己又没有开过多的程序或服务。linux的内存管理机制的思想包括(不敢说就是)内存利用率最大化。内核会把剩余的内存申请为cached,而cached不属于free范畴。当系统运行时间较久,会发现cached很大,对于有频繁文件读写操作的系统,这种现象会更加明显。
直观的看,此时free的内存会非常小,但并不代表可用的内存小,当一个程序需要申请较大的内存时,如果free的内存不够,内核会把部分cached的内存回收,回收的内存再分配给应用程序。所以对于linux系统,可用于分配的内存不只是free的内存,还包括cached的内存(其实还包括buffers)。即:
可用内存=free的内存+cached的内存+buffers的内存
所以,真正的内存利用率 = 可用内存 / 总内存(注意此处 可用内存 由上述公式计算而来,其实这个计算结果在free命令回显中已有,即回显结果第三行"-/+ buffers/cached",此行第二个数值即为加上了buffers和cached之后的内存,即为上述公式所算的可用内存,如下所示:

//方框里的是真正可用内存,也是上面3个椭圆free+buffers+cached的和。

  • 进程信息区

PID:进程ID
USER: 真实用户名称
PR: 优先级
NI: Nice值,负值表示高优先级,正值表示低优先级
VIRT:进程使用的虚拟内存总量,单位kb VIRT=SWAP+RES
RES:进程使用的、未被换出的物理内存大小,单位kb RES=CODE+DATA
SHR:共享内存大小,单位kb
S:进程状态  D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU  上次更新到现在的CPU时间占用百分比
%MEM  进程使用的物理内存百分比
TIME+  进程使用的CPU时间总计,单位1/100秒
COMMAND 命令名/命令行 进程名称

2.top命令的常见命令参数以及交互命令说明

1)常见的命令参数

top [-] [d][u][p][n][b][q]

d 指定每两次屏幕信息刷新之间的时间间隔。后面可以接秒数,就是整个程序画面更新的描述,预设是5秒。
u 只查看指定用户名的进程
p 通过指定监控进程ID来仅仅监控某个进程的状态
n 设置退出前屏幕刷新的次数,与-b搭配,意义是需要进行几次top的输出结果。
b 将top输出编排成适合输出到文件的格式,可以使用这个选项创建进程日志。通常会搭配数据流重定向来将批次的结果输出成为档案。
q 该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行
c 显示整个命令行而不只是显示命令名
S 指定累计模式
s 使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。
i 使top不显示任何闲置或者僵死进程。

举例:

top查看进程中的线程:

top -H -p <pid>

top -H -p 156736

156736这个进程有9个线程数

top -d 5    更新延时设置为5秒(默认3秒)

top -u mysql    只查看有效用户名为mysql的进程
top -p 200,2000    只查看进程200和2000
top -n 8    退出前屏幕再刷新10次
top -b    以非交互和非全屏模式运行
top -b -n 12000 > plog 运行top并记录命令输出,时长10小时,保存到plog文件

2)交互命令说明

按1可以看到每个逻辑cpu的cpu使用情况,同时还能看到各个进程的情况。

Shift+n    按PID排序
Shift+p    按CPU排序
Shift+m    按内存使用排序
Shift+t    按该Process使用的CPU时间积累(TIME+)排序。
u 输入用户名只显示指定用户的进程

3.负载load average

引自 https://blog.csdn.net/zhangchenglikecc/article/details/52103737以下命令均可获取load average系统平均负载

1)获取系统负载的命令

# top

# uptime

# cat /proc/loadavg

/proc文件系统是一个虚拟的文件系统,不占用磁盘空间,它反映了当前操作系统在内存中的运行情况.其实,我们之前提到的所谓的程序都是在内存当中嘛!而内存当中的数据又都是写入到 /proc/* 这个目录下的。查看/proc下的文件可以了解到系统的运行状态。查看系统平均负载使用“cat /proc/loadavg”命令,输出结果如下:

# cat /proc/loadavg
0.28 0.44 0.49 1/486 125751

前三个数字是1、5、15分钟内的平均进程数。后面的 1/486 一个的分子是正在运行的进程数,分母是进程总数;另一个是最近运行的进程ID号。
top获取:

2)系统平均负载被定义为:在特定时间间隔内运行队列中(在CPU上运行或者等待运行多少进程)的平均进程数。

如果一个进程满足以下条件则其就会位于运行队列中:
上面top结果红方框部分的3个数值分别表示系统在过去1分钟、5分钟、15分钟内运行进程队列中的平均进程数量。
运行队列嘛,没有等待IO,没有WAIT,没有KILL的进程通通都进这个队列。
  - 它没有在等待I/O操作的结果
  - 它没有主动进入等待状态(也就是没有调用'wait')
  - 没有被停止(例如:等待终止)
我们可以这样认为,就是”正在运行的进程 + 准备好等待运行的进程“在特定时间内(1分钟,5分钟,10分钟)的平均进程数。在Linux中,进程分为三种状态,一种是阻塞的进程blocked process,一种是可运行的进程runnable process,另外就是正在运行的进程running process。当进程阻塞时,进程会等待I/O设备的数据或者系统调用。进程可运行状态时,它处在一个运行队列run queue中,与其他可运行进程争夺CPU时间。 系统的load是指正在运行running one和准备好运行runnable one的进程的总数。比如现在系统有2个正在运行的进程,3个可运行进程,那么系统的load就是5,load average就是一定时间内的load数量均值。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
看到一篇文章小汽车的举例说的很不错,但是更深层次的我觉得有个打电话的写的更加详细,现以小汽车举例。为了更好地理解系统负载,我们用交通流量来做类比。

单核CPU可以想象成单车道,比如每个圆圈都是小汽车,第一种是满负荷但CPU时间片不用排队等待正好够用,第二种是%50空闲,第三个是超负荷50%,后面的就有队列等待了。

3)单核CPU, 数字在0.00-1.00之间正常

0.00-1.00 之间的数字表示此时路况非常良好,没有拥堵,车辆可以毫无阻碍地通过。
1.00 表示道路还算正常,但有可能会恶化并造成拥堵。此时系统已经没有多余的资源了,管理员需要进行优化。
1.00以上表示路况不太好了,如果到达2.00表示有桥上车辆一倍数目的车辆正在等待。这种情况你必须进行检查了。

4)多核CPU - 多车道  数字/CPU核数在0.00-1.00之间正常

用双核举例,双核的负载已经比单核提高一倍了,那多核的也是同理。多核CPU的话,满负荷状态的数字为 "1.00 * CPU核数",即双核CPU为2.00,四核CPU为4.003、安全的系统平均负载这里没有完全的定论,一般来讲70%左右的负载也就是0.7左右应该是没问题的,要根据实际生产环境中实际需求来进行浮动设定

5)应该看哪一个数字,1分钟,5分钟还是15分钟?
和收过桥费的管理员一样,你当然希望你的汽车(操作)不会被焦急的等待。所以,理想状态 下,都希望负载平均值小于 1.00 。当然不排除部分峰值会超过 1.00,但长此以往保持这 个状态,就说明会有问题,这时候你应该会很焦急。

“所以你说的理想负荷为 1.00 ?” 嗯,这种情况其实并不完全正确。负荷 1.00 说明系统已经没有剩余的资源了。在实际情况中 ,有经验的系统管理员都会将这条线划在 0.70:
  “需要进行调查法则”: 如果长期你的系统负载在 0.70 上下,那么你需要在事情变得更糟糕之前,花些时间了解其原因。
  “现在就要修复法则”:1.00 。 如果你的服务器系统负载长期徘徊于 1.00,那么就应该马上解决这个问题。否则,你将半夜接到你上司的电话,这可不是件令人愉快的事情。
  “凌晨三点半锻炼身体法则”:5.00。 如果你的服务器负载超过了 5.00 这个数字,那么你将失去你的睡眠,还得在会议中说明这情况发生的原因,总之千万不要让它发生。
  先脱离下主题,我们来讨论下多核心处理器与多处理器的区别。从性能的角度上理解,一台主机拥有多核心的处理器与另台拥有同样数目的处理性能基本上可以认为是相差无几。当然实际 情况会复杂得多,不同数量的缓存、处理器的频率等因素都可能造成性能的差异。但即便这些因素造成的实际性能稍有不同,其实系统还是以处理器的核心数量计算负载均值 。这使我们有了两个新的法则:
  “有多少核心即为有多少负荷”法则: 在多核处理中,你的系统均值不应该高于处理器核心的总数量。
  “核心的核心”法则: 核心分布在分别几个单个物理处理中并不重要,其实两颗四核的处理器等于四个双核处理器等于八个单处理器。所以,它应该有八个处理器内核。

6)怎样知道我的CPU是几核呢?

㈠ 概念
           ① 物理CPU               
              实际Server中插槽上的CPU个数
              物理cpu数量,可以数不重复的 physical id 有几个           
           ② 逻辑CPU               
              Linux用户对 /proc/cpuinfo 这个文件肯定不陌生. 它是用来存储cpu硬件信息的。信息内容分别列出了processor 0 – n 的规格。这里需要注意,如果你认为n就是真实的cpu数的话, 就大错特错了
              一般情况,我们认为一颗cpu可以有多核,加上intel的超线程技术(HT), 可以在逻辑上再分一倍数量的cpu core出来
              逻辑CPU数量=物理cpu数量 x cpu cores 这个规格值 x 2(如果支持并开启ht)
              备注一下:Linux下top查看的CPU也是逻辑CPU个数              
           ③ CPU核数           
              一块CPU上面能处理数据的芯片组的数量、比如现在的i5 760,是双核心四线程的CPU、而 i5 2250 是四核心四线程的CPU。一般来说,物理CPU个数×每颗核数就应该等于逻辑CPU的个数,如果不相等的话,则表示服务器的CPU支持超线程技术  

㈡ 查看CPU信息          
          vendor id     如果处理器为英特尔处理器,则字符串是 GenuineIntel。
          processor     包括这一逻辑处理器的唯一标识符。
          physical id   包括每个物理封装的唯一标识符。
          core id       保存每个内核的唯一标识符。
          siblings      列出了位于相同物理封装中的逻辑处理器的数量。
          cpu cores     包含位于相同物理封装中的内核数量。
         1. 拥有相同 physical id 的所有逻辑处理器共享同一个物理插座,每个 physical id 代表一个唯一的物理封装。
         2. Siblings 表示位于这一物理封装上的逻辑处理器的数量,它们可能支持也可能不支持超线程(HT)技术。
         3. 每个 core id 均代表一个唯一的处理器内核,所有带有相同 core id 的逻辑处理器均位于同一个处理器内核上。简单的说:“siblings”指的是一个物理CPU有几个逻辑                      CPU,”cpu cores“指的是一个物理CPU有几个核。
         4. 如果有一个以上逻辑处理器拥有相同的 core id 和 physical id,则说明系统支持超线程(HT)技术。
         5. 如果有两个或两个以上的逻辑处理器拥有相同的 physical id,但是 core id不同,则说明这是一个多内核处理器。cpu cores条目也可以表示是否支持多内核。

使用以下命令可以直接获得CPU核心数目
   查看物理CPU的个数
#cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc –l
   查看逻辑CPU的个数(top命令看到的是逻辑cpu个数)
#cat /proc/cpuinfo |grep "processor"|wc –l
  查看CPU是几核
#cat /proc/cpuinfo |grep "cores"|uniq
    查看CPU的主频
#cat /proc/cpuinfo |grep MHz|uniq
直接获得CPU核心数  (该命令即可全部算出多少核)
 #grep 'model name' /proc/cpuinfo | wc –l

取得CPU核心数目N,观察后面2个数字,用数字/N,如果得到的值小于0.7即可无忧。
一般来讲我们观察五分钟或者十五分钟的平均数值。坦白讲,如果前一分钟的负载情况是 1.00,那么仍可以说明认定服务器情况还是正常的。 但是如果十五分钟的数值仍然保持在 1.00,那么就值得注意了要考虑是否这应该增加的处理器数量了。




                      
      

猜你喜欢

转载自www.cnblogs.com/move-on-change/p/9510491.html