聊聊服务器的负载

负载能够说是一个服务器是否正常的风向标,当接入的软件运行缓慢的时候,相信大部分人排查线上服务器第一件事就是要看下负载的高低?经过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中的一些问题。

  1. 大量数据请求时,包括搜索时全表扫描、以及大量的导出数据等。这种状况下通常大量的读请求让IO成为瓶颈,致使其余进程也处理缓慢,所以随着时间的增长负载就会升高
  2. 事务未提交,通常一些业务处理系统,耦合关系强,如订单的出库和库存的关系,通常是须要原子性操做,这个时候通常会使用事务来进行控制,可是不幸出现事务未提交的状况,会致使大量资源被锁,其余请求处于长时间等待的状况,这种状况也会致使负载升高
  3. 死锁,mysql的死锁检测以及回滚都会有必定的时间,加之事务对资源的独占,出现死锁会出现短暂的拥堵现象,同时负载的短期内上升,不事后面继续会降低。可是死锁很频繁的状况下,负载也会一直较高
  4. 内存不足时,mysql服务器是至关耗费内存的,若是内存不足致使交换分区长时间使用的话,也会让机器负载升高
  5. 其余致使的一些IO问题,如磁盘损坏以及磁盘空间不足
相关文章
相关标签/搜索