标签:des style blog io color ar os for sp
CPU LOAD
通俗点讲,即当前系统正在执行及等待执行的任务数量。 维基百科上面对LOAD的详细解释:
Each process using or waiting for CPU (the ready queue or run queue) increments the load number by 1.
Most UNIX systems count only processes in the running (on CPU) or runnable (waiting for CPU) states.
However, Linux also includes processes in uninterruptible sleep states (usually waiting for disk activity),which can lead tomarkedly different results if many processes remain blocked in I/O due to a busy or stalled I/O system.
根据上面的解释,LOAD值高并不一定是系统计算资源瓶颈,这个值更多反应的是:1、系统上服务的实现方式;2、系统上当前请求服务的延迟。采用多线程及阻塞IO的方式实现的服务,当服务IO压力较大时(重IO类型的服务),一般都会出现系统LOAD较高的问题。仅仅通过多线程来实现并发是最简单低效的一种实现方式,一旦线程的执行被IO 阻塞,而新的请求又会导致创建新的线程,系统线程数最不断升高,导致一个可怕的问题: 系统上下文切换次数骤升,大量的CPU时间被消耗在无用的上下文切换。
IO wait
CPU因为等待IO而执行idle空转所耗用的时间,产生IO wait必须满足两个条件:1、CPU上执行的进程因为IO而阻塞;2、当前没有runnable状态的进程。
IO wait实际上是cpu idle的时间,kernel把cpu分成三种状态:busy、idle、wait,busy表示cpu正在忙着干活,idle表示CPU闲着没事可做,而wait表示cpu有活而不能干(数据没准备好),内核统计wait时间的是在accountsystemtime函数中,函数中重要代码片段:
/* Add system time to cpustat. */ tmp = cputime_to_cputime64(cputime); /*CPU在做硬件中断*/ if (hardirq_count() - hardirq_offset) cpustat->irq = cputime64_add(cpustat->irq, tmp); /*CPU在处理软中断*/ else if (softirq_count()) cpustat->softirq = cputime64_add(cpustat->softirq, tmp); /*CPU 正常运行*/ else if (p != rq->idle) cpustat->system = cputime64_add(cpustat->system, tmp); /*不在做中断,且rq->nr_iowait大于0,表示cpu 在IO wait*/ else if (atomic_read(&rq->nr_iowait) > 0) cpustat->iowait = cputime64_add(cpustat->iowait, tmp); else /*CPU在执行idle*/ cpustat->idle = cputime64_add(cpustat->idle, tmp);
accountsystemtime中统计各种CPU时间,包括iowait时间,那么&rq->nr_iowait是如何被更新的呢?
标签:des style blog io color ar os for sp
原文地址:http://www.cnblogs.com/VincentXu/p/4072403.html