linux如何查看性能瓶颈(Linux-进程性能信息统计)
linux如何查看性能瓶颈(Linux-进程性能信息统计)在内核态,代码拥有完全的,不受任何限制的访问底层硬件的能力。可以执行任意的CPU指令,访问任意的内存地址。内核态通常情况下,都是为那些最底层的,由操作系统提供的,可信可靠的代码来运行的。内核态的代码崩溃将是灾难性的,它会影响到整个系统。核心态(Kernel Mode):内核时间vs.用户时间一个应用程序所耗时间最基本的划分是内核时间与用户时间。首先,我来讲一下用户态和核心态:
进程性能统计信息
分析应用程序性能的工具多种多样,并且从UNIX早期就以各种形式存在了。要了解一个应用程序的性能,至关重要的一点就是理解它与操作系统、CPU和存储系统是怎样进行交互的。大多数应用程序不是独立的,因此需要一些对Linux内核和不同的函数库的调用。
这些对Linux内核的调用(或系统调用)可能是简单的,如“我的PID是什么?”;也可能是复杂的,如“从磁盘读取12个数据块”。不同的系统调用会产生不同的性能影响。
相应的,库调用也可以简单如内存分配,复杂如创建图形窗口。这些库调用也有不同的性能特点。
内核时间vs.用户时间
一个应用程序所耗时间最基本的划分是内核时间与用户时间。
首先,我来讲一下用户态和核心态:
核心态(Kernel Mode):
在内核态,代码拥有完全的,不受任何限制的访问底层硬件的能力。可以执行任意的CPU指令,访问任意的内存地址。内核态通常情况下,都是为那些最底层的,由操作系统提供的,可信可靠的代码来运行的。内核态的代码崩溃将是灾难性的,它会影响到整个系统。
用户态(User Mode):
在用户态,代码不具备直接访问硬件或者访问内存的能力,而必须借助操作系统提供的可靠的,底层的APIs来访问硬件或者内存。由于这种隔离带来的保护作用,用户态的代码崩溃(Crash),系统是可以恢复的。我们大多数的代码都是运行在用户态的。
为什么要区分Kernel Mode 和 User Mode:
隔离保护,使得系统更稳定。
内核时间是消耗在Linux内核上的时间,而用户时间则是消耗在应用程序或库代码上的时间。Linux有工具,如time和ps,可以(大致)表明应用程序将其时间是花在了应用程序代码上还是花在了内核代码上。同时,还有如oprofile和strace这样的命令使你能跟踪哪些内核调用是代表该进程发起的,以及每个调用完成需要多少时间。
库时间vs.应用程序时间
任何应用程序,即便其复杂性非常低,也需要依赖系统库才能执行复杂的操作。这些库可能会导
致性能问题,因此,能够查看应用程序在某个库中花费了多少时间就很重要了。虽然为了解决一个问题而去修改库的源代码并不总是实用,但是可以改变应用程序代码来调用不同的库函数,或者是调用更少的库函数。
在库被应用程序使用时,ltrace命令和oprofile工具包提供了分析库性能的途径。Linux加载器ld的内置工具帮助你确定使用多个库是否会减慢应用程序的启动时间。
细分应用程序时间
当已经知道某应用程序是瓶颈后,Linux可以向你提供工具来分析这个应用程序,以找出在这个程序中,时间都花在了哪里。工具gprof和oprofile可以生成应用程序的配置文件,确定是哪些源代码行花费了大量的时间。