Linux下常见性能分析工具

一、进程描述符及任务结构
进程存放在叫做任务队列(tasklist)的双向循环链表中。链表中的每一项包含一个具体进程的所有信息,类型为task_struct,称为进程描述符(process descriptor),该结构定义在文件中。
Linux通过slab分配器分配task_struct结构,这样能达到对象复用和缓存着色(cache coloring)的目的。另一方面,由于x86这样的硬件体系结构寄存器比较少,因此在文件中定义结构为thread_info的栈指针,通过栈指针可以计算出task_struct的位置,避免了使用额外的寄存器存储专门记录。
二、进程的创建
在Linux系统中,所有的进程都是PID为1的init进程的后代;内核在系统启动的最后阶段启动init进程,该进程读取系统的初始化脚本并执行其他的相关程序,最终完成系统启动的整个过程。Linux提供两个函数处理进程的创建和执行:fork()和exec()。

fork()通过拷贝当前进程创建一个子进程;子进程与父进程的区别仅仅在于PID(每个进程唯一),PPID(父进程的PID)和某些资源和统计量(例如挂起的信号)。exec()函数负责读取可执行文件并将其载入地址空间开始运行。

fork()使用写时复制(copy-on-write)页实现;内核在fork进程时不复制整个进程地址空间,让父进程和子进程共享同一个拷贝,当需要写入时,数据才会被复制,使各进程拥有自己的拷贝。在页根本不会被写入的情况下(fork()后立即exec()),fork的实际开销只有复制父进程的页表以及给子进程创建唯一的task_struct。

创建进程的fork()函数实际上最终是调用clone()函数。创建线程和进程的步骤一样,只是最终传给clone()函数的参数不同。比如,通过一个普通的fork来创建进程:clone(SIGCHLD, 0);创建一个和父进程共享地址空间,文件系统资源,文件描述符和信号处理程序的进程,即一个线程:clone(CLONE_VM | CLONE_FS | CLONE_FILES |CLONE_SIGHAND, 0)。在内核中创建的内核线程与普通的进程之间还有个主要区别在于:内核线程没有独立的地址空间,它们只能在内核空间运行。
三、Linux进程状态机
task_struct中的state描述进程的当前状态。进程的状态一共有5种,而进程必然处于其中一种状态:
这里写图片描述
TASK_RUNNING(运行)
进程是可执行的,它或者正在执行,或者在运行队列中等待执行。这是进程在用户空间中执行唯一可能的状态;也可以应用到内核空间中正在执行的进程。
TASK_INTERRUPTIBLE(可中断)
进程正在睡眠(被阻塞),等待某些资源的释放。一旦这些资源可用,内核就会把进程状态设置为运行,处于此状态的进程也会因为接收到信号而提前被唤醒并投入运行。
TASK_UNINTERRUPTIBLE(不可中断)
除了不会因为接收到信号而被唤醒从而投入运行外,这个状态与可打断状态相同。不可中断并不是指CPU不响应外部硬件的中断,而是指进程不响应异步信号;较之可中断状态,使用得较少。
TASK_ZOMBIE(僵死)
进程已经结束,但是其父进程还没有调用wait4()系统调用。为了父进程能够获知它的消息,子进程的进程描述符仍然被保留着。一旦父进程调用了wait4(),进程描述符就会被释放。
TASK_STOPPED(停止)
进程停止执行,既没有投入运行也不能投入运行。通常这种状态发生在接收SIGSTOP,SIGTSTP,
SIGTTIN,SIGTTOU等信号的时候。此外,在调试期间接收到任何信号,都会使进程进入这种状态。
说明:绝大多数情况下,进程处在睡眠状态时,应该是能够响应异步信号的。否则kill -9无法杀死一个正在睡眠的进程。于是也很好理解,为什么ps命令看到的进程几乎不会出现TASK_UNINTERRUPTIBLE状态,而总是TASK_INTERRUPTIBLE状态。
TASK_UNINTERRUPTIBLE状态存在的意义在于内核的某些处理流程是不能被打断的。如果响应异步信号,程序的执行流程中就会被插入一段用于处理异步信号的流程(这个插入的流程可能只存在于内核态,也可能延伸到用户态),于是原有的流程就被中断了(参见《linux异步信号handle浅析》)。比如进程调用read系统调用对某个设备文件进行读操作,而read系统调用最终执行到对应设备驱动的代码,并与对应的物理设备进行交互,可能需要使用TASK_UNINTERRUPTIBLE状态对进程进行保护,以避免进程与设备交互的过程被打断,造成设备陷入不可控的状态。

四、进程查看
用ps –l命令仅查看当前登录的PID与相关信息;aux则列出目前所有的正在内存当中的进程
这里写图片描述

  • F:代表进程标志(process flags)说明进程的权限,常见的号码有
    4:表示进程权限为root
    1:表示此子进程仅可进行复制(fork)而无法实际执行(exec)
  • S:代表进程状态(stat)
  • UID : 代表执行者的身份
  • PID : 代表这个进程的代号
  • PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
  • PRI :代表这个进程可被执行的优先级,其值越小越早被执行
  • NI :代表这个进程的nice值
  • C:代表CPU使用率,单位为百分比
  • ADDR/SZ/WCHAN:都与内存有关
    ADDR 是 kernel function,指出该进程在内存的哪个部分,如果是个 running 的程序,一般就会显示‘ - ’
    SZ 代表此进程使用了多少内存
    WCHAN 表示目前进程是否运行中,同样的, 若为 - 表示正在运行中
  • TTY:登入者的终端机位置,若为远程登录则使用动态终端接口 (pts/n);
  • TIME:使用掉的 CPU 时间,注意,是此程序实际花费 CPU 运行的时间,而不是系统时间;
  • CMD:command 的缩写,造成此程序的触发进程之命令为何,[]表示触发命令为内核线程
  • %MEM:该进程所占用的物理内存百分比;
  • VSZ :该进程使用掉的虚拟内存百分比 (Kbytes)
  • RSS :该进程占用的固定内存百分比 (Kbytes)
  • START:该进程被触发启动的时间

这里写图片描述
这里写图片描述


                
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值