1. top命令
top命令经常用来监控Linux的系统状况,比如cpu、内存的使用,程序员基本都知道这个命令,但比较奇怪的是能用好它的人却很少,例如top监控视图中内存数值的含义就有不少的曲解。
top命令的顶部显示与uptime命令相似的输出
这些字段显示:
可以使用'l'命令切换uptime的显示。
21:45:11%20—%20当前系统时间
0%20days,%204:54%20—%20系统已经运行了4小时54分钟(在这期间没有重启过)
2%20users%20—%20当前有2个用户登录系统
-average%20load(正常负载):小于等于10s。-average%20load(正常负载):20到49个虚拟用户。load%20average%20与后面的数字一起表示系统在过去1,5,10分钟内的负载程度,数值。
load%20average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。
Tasks%20—%20任务(进程),系统现在共有144个进程,其中处于运行中的有1个,143个在休眠(sleep),stoped状态的有0个,zombie状态(僵尸)的有0个。
ps%20axu显示进程的详细状态killallkill%20-15kill%20-9一般都不能杀掉%20defunct进程用了kill%20-15,kill%20-9以后%20之后反而会多出更多的僵尸进程kill%20-kill%20pidfuser%20-k%20pid可以考虑杀死他的parent%20process。这段代码设计是如此地富有想象力,它通过if%20(need_resched())使得函数能在jiffies级别上跳出while循环,但是代码优化的性能提升则体现在owner_running中,因为拥有锁的进程在极短的时间(肯定是低于jiffies这个级别的,可能在us级甚至更低)释放锁,如果通过if%20(need_resched())退出循环,则基本说明了本次优化的失败,事实上还导致了性能的倒退(因为即便在hz=1000的系统中,jiffies的级别也是非常粗糙的,现代处理器的进程切换的开销可能只在几个us或者几十个us,如果让一个进程为了获得mutex%20lock而去spin几个jiffies,那么这简直就是暴敛天物了,如果这个时间让当前进程睡眠,那么其他进程就可以获得cpu资源,而1个jiffies可以抵得上几十上百个进程切换的时间开销,根本就不需要在乎两次进程切换的时间开销。在这个过程中子进程已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,这个时候该子进程称为一个僵尸进程。
这里显示不同模式下所占cpu时间百分比,这些不同的cpu时间表示:
可以使用't'命令切换显示。
1.3% us — 用户空间占用CPU的百分比。
1.0% sy — 内核空间占用CPU的百分比。
0.0% ni — 改变过优先级的进程占用CPU的百分比
97.3% id — 空闲CPU百分比
0.0% wa — IO等待占用CPU的百分比
0.3% hi — 硬中断(Hardware IRQ)占用CPU的百分比
0.0% si — 软中断(Software Interrupts)占用CPU的百分比
在这里CPU的使用比率和windows概念不同,如果你不理解用户空间和内核空间,需要充充电了。
11856k used — 使用的交换区总量(11M)
480680k free — 空闲交换区总量(480M)
202224k cached — 缓冲的交换区总量(202M)
这里要说明的是不能用windows的内存概念理解这些数据,如果按windows的方式此台服务器“危矣”:8G的内存总量只剩下530M的可用内存。Linux的内存管理有其特殊性,复杂点需要一本书来说明,这里只是简单说点和我们传统概念(windows)的不同。
3. 空闲任务负责释放内核分配给已删除任务的内存。使用提示:只有内核为任务分配的内存空间才会在任务被删除后由空闲任务自动回收。轻量级操作系统freertos的内存管理机制(二)中讲到,heap2.c的内存管理机制会导致内存碎片的问题,系统运行久后会出现无法分配大块内存的情况,heap4.c中的管理机制提供了解决方法,它是在heap2.c的基础上添加了地址相邻空闲块间合并的功能,而heap5.c是对heap4.c的进一步扩展,它能够支持多块不连续分布的ram空间作为堆使用,本篇将对heap4.c、heap5.c中的管理机制进行分析。
如果出于习惯去计算可用内存数,这里有个近似的计算公式:第四行的free + 第四行的buffers + 第五行的cached,按这个公式此台服务器的可用内存:
13284+25364+202224 = 240M。
对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。
第六行是空行
PID:进程ID,进程的唯一标识符
USER:进程所有者的实际用户名。
PR:进程的调度优先级。这个字段的一些值是'rt'。这意味这这些进程运行在实时态。
NI:进程的nice值(优先级)。越小的值意味着越高的优先级。负值表示高优先级,正值表示低优先级
VIRT:进程使用的虚拟内存。进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES:驻留内存大小。驻留内存是任务使用的非交换物理内存大小。进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR:SHR是进程使用的共享内存。共享内存大小,单位kb