负载能够说是一个服务器是否正常的风向标,当接入的软件运行缓慢的时候,相信大部分人排查线上服务器第一件事就是要看下负载的高低?经过uptime命令能够直观的看到系统一、五、15分钟内的平均负载值,本文简称为负载。那么关于负载就有一些有意思的话题了。如什么是负载,如何断定负载的高低?那些缘由致使负载升高?下面结合个人一些工做经验简单聊一聊。mysql
在我最先接触负载一词的时候,大脑里的印象就是衡量服务器的繁忙程度,所以服务器的负载不能过高,高了的话服务器就忙不过来了。我对负载这样的认识一直大概保持了一年半,后来仍是由于有个原 因,因而去man了下uptime。linux
关于负载的解释,uptime上有算是较为详细的说明:sql
System load averages is the average number of processes that are either in a runnable or uninterruptable state. A process in a runnable state is either using the CPU or waiting to use the CPU. A process in uninterruptable state is waiting for some I/O access, eg waiting for disk. The averages are taken over the three time intervals. Load averages are not normalized for the number of CPUs in a system, so a load average of 1 means a single CPU system is loaded all the time while on a 4 CPU system it means it was idle 75% of the time.服务器
根据以上的描述,负载的概念就清晰起来了,首先负载是什么? 负载是一个平均进程数。那么,是全部状态下的进程数吗?不是的,对进程的状态有要求,就是进程的状态须要处于 runnable state(可运行状态) 和 uninterrupttable state(不可中断状态)。网络
ok,如今的重点来到了这两种状态的进程的理解上,何为 runnable 状态,上面也给出了清晰的解释,就是要么进程正在使用cpu,要么正在等待着使用cpu。对这句解释稍做补充,在一个进程的生命周期中,会有不一样状态,处于runnable状态的进程表明着一切资源准备就绪了(cpu资源除外),那么就会有两种状况,一种是已经得到了cpu资源的,那么就表明着他正在使用cpu资源进行运行,另一种就是他在排队等待cpu资源。(进程调度器会为使用cpu资源的进程维护一个队列)由于linux是多用户多进程系统,进程数量通常远大于cpu数量,所以cpu的资源是珍贵的,使用须要申请和排队。ui
何为uninterruptable 状态?,就是进程正在等待一些IO的请求,诸如磁盘IO/网络IO。说实在的,对于这个理解我还只能停留在表面。uninterruptable和 interruptable都是进程的sleep状态。咱们能够理解为进程在睡觉(进程要继续运行的条件和资源不充分,所以他们要睡觉),进入这两种状态下,他们会当即释放掉cpu资源,不一样点在于,处于interruptable是一种浅睡,任何的风吹草动(信号)都会惊醒他,而后他就会醒来接着干活。那么uninterruptable 就是一种沉睡,只有他等到的东西等来了他才醒来。spa
总结来讲,负载数值便是处于runnable state 和uninterruptable state 的进程数。能够大体理解为系统正在处理的进程数。orm
记得毕业后刚入职几个月的时候,适逢双十一,上面分了几台小的服务器,让盯梢负载。而后,我问旭哥说多高负载算高,旭哥说超过1就很高了。因此,今后我就记住了,负载高于1就高了。直到有一次一个持有相同概念的同事被另一个同事鄙视后,我偷偷弄明白了负载后,负载高于1就过载的说法就不攻自破了。three
关于负载过1就过载的说法在只有一个cpu的状况下是能够理解的,由于一个cpu同一时刻只能处理一个进程,因此恰好是100%的满负荷运行。可是在一个四核的机器上,无异于其余三个cpu在空闲着。因此看负载是否过载,要有一个前提,那就是须要明确有几个cpu,若是负载数长时间高于cpu数,那么就能够判断为过载。生命周期
cat /proc/cpuinfo
以上命令能够查看cpu的个数。但这并非说,咱们都要线上的机器都要满负荷的去跑,确定是要有必定的余量的,至于余多少,能够根据本身业务的访问状况决定。
有了对负载本质的了解,就不难分析出负载较高的状况了?致使负载升高的缘由无非有两个缘由,一个是处于 runnable state 的进程不断增多,另外一个是处于 uninterruptable state的进程不断增多。runnable state 增多通常是cpu资源不够,而uninterruptable state增多大部分时间是磁盘IO成为瓶颈。
cpu资源不够,为了方便理解,咱们能够假设机器只有一个cpu,而每一个进程处理须要1s,可是每1s就会2个进程须要处理,此时每1过1s就会累积一个进程处理不掉,那么负载天然就不断的增长 IO成为瓶颈,有的时候cpu利用率不是很高,可是负载依然会很高,好比大量的读请求,致使磁盘io成为瓶颈,此时进程在等待磁盘IO的同时是不可中断的状态,所以仍然会参与负载值的计算,所以负载会变高
本人从事电商ERP系统开发,服务器中安装有mysql服务器,所以通常状况下,出问题大部分是mysql中的一些问题。