日期:2014-05-16 浏览次数:20772 次
linux性能监控,就是要监控系统的各个子系统是否正常。linux主要的子系统包括:CPU、Memory、IO和Network,它们之间相互依赖,一个出问题可能会影响其他的。比如:网卡流量很大会导致更多的CPU开销,因为频繁的响应中断执行协议栈。
性能监控时,首先要确定应用的类型,然后对症下药,可以将应用分成:
CPU密集型:CPU开销很高,比如大量的CPU运算、科学计算等。通常web server属于这类。
IO密集型:大量的磁盘读写,高负荷的内存使用。IO密集型不会对CPU发起更多的请求,它占用CPU只是为了产生IO请求然后sleep。通常数据库属于这一类型。
上下文切换(Context Switch)是多任务操作系统的基石,每个进程都有自己的执行环境就是进程的上下文,这些上下文就是当前进程使用的寄存器,比如PC、栈指针%esp、帧指针%ebp等。每个处理器核心在任意时刻只能执行一个进程或线程,当线程的时间片用尽或者线程阻塞(比如线程执行磁盘io或网络io时),进程调度器会根据一定的规则(比如选择运行时间加权之后最少的)挑选一个线程占有处理器。因为CPU的寄存器集合只有一份,所有必须要保存上一个进程使用的寄存器,同时恢复被调度的进程的寄存器状态。
上下文切换时有损耗的。一般地,当系统中线程过多或者io负载过高时,上下文切换会比较频繁,此时CPU时间过多的消耗在上下文切换。
内核中的进程调度器维护着运行队列(run queue),而每个阻塞源维护着自己的阻塞队列(wait queue,比如一个文件描述符,正在读写该文件的进程会被阻塞在其阻塞队列上)。任意一个进程要么处于可执行状态,要么阻塞状态。所有的可执行状态的进程都处于运行队列,如果当前系统CPU负载很高,那么运行队列的长度很大,进程调度器就不会及时响应系统请求。当运行队列越来越大时,进程或线程将花费更多的时间来获取CPU时间。
> cat /proc/loadavg 0.02 0.05 0.05 1/279 23903上述命令可以显示系统负载,分别是:过去1分钟、5分钟、15分钟的系统负载、当前正在执行的进程数/系统的所有进程数、最后执行的进程的pid。top命令也可以现在系统负载。
vmstat提供一种低开销的方式统计系统性能数据。
> vmstat 1 1 procs -----------memory------------------- ---swap-- -----io---- -system-- ----cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa 0 0 0 1540304 497972 1631008 0 0 0 45 0 0 2 0 97 1与CPU相关的各个列的意思:
> pidstat -p 2036 -t 1 1 Linux 2.6.32-5-xen-amd64 (vzw51173.puppetclient.163.com) 2012年10月12日 _x86_64_ (4 CPU) 16时09分17秒 TGID TID %usr %system %guest %CPU CPU Command 16时09分18秒 2036 - 0.00 2.00 0.00 2.00 3 python 16时09分18秒 - 2036 0.00 0.00 0.00 0.00 3 |__python 16时09分18秒 - 2041 0.00 0.00 0.00 0.00 3 |__python 16时09分18秒 - 5639 0.00 0.00 0.00 0.00 2 |__python 16时09分18秒 - 5650 0.00 1.00 0.00 1.00 1 |__python 平均时间: TGID TID %usr %system %guest %CPU CPU Command 平均时间: 2036 - 0.00 2.00 0.00 2.00 - python 平均时间: - 2036 0.00 0.00 0.00 0.00 - |__python 平均时间: - 2041 0.00 0.00 0.00 0.00 - |__python 平均时间: - 5639 0.00 0.00 0.00 0.00 - |__python 平均时间: - 5650 0.00 1.00 0.00 1.00 - |__pythonLinux中是不区分进程和线程的,线程就是可以共享资源的进程。TID就是线程的PID,这里可以查看各个线程的CPU使用情况。