欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

浅谈为什么磁盘慢会导致Linux负载飙升

程序员文章站 2022-04-03 18:50:57
这篇文章主要介绍了浅谈为什么磁盘慢会导致Linux负载飙升,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下... 18-02-01...

 一、cpu利用率和负载率的区别

浅谈为什么磁盘慢会导致Linux负载飙升

这里要区别cpu负载和cpu利用率,它们是不同的两个概念,但它们的信息可以在同一个top命令中进行显示。cpu利用率显示的是程序在运行期间实时占用的cpu百分比,这是对一个时间段内cpu使用状况的统计,通过这个指标可以看出在某一个时间段内cpu被占用的情况, 如果被占用时间很高,那么就需要考虑cpu是否已经处于超负荷运作。而cpu负载显示的是在一段时间内cpu正在处理以及等待cpu处理的进程数之和的统计信息,也就是cpu使用队列的长度的统计信息。

cpu利用率高并不意味着负载就一定大,可能这个任务是一个cpu密集型的。一样cpu低利用率的情况下是否会有高load average的情况产生呢?理解占有时间和使用时间就可以知道,当cpu分配时间片以后,是否使用完全取决于使用者,因此完全可能出现低利用率高load average的情况。另外io设备也可能导致cpu负载高。

由此来看,仅仅从cpu的使用率来判断cpu是否处于一种超负荷的工作状态还是不够的,必须结合load average来全局的看cpu的使用情况。网上有个例子来说明两者的区别如下:某公用电话亭,有一个人在打电话,四个人在等待,每人限定使用电话一分钟,若有人一分钟之内没有打完电话,只能挂掉电话去排队,等待下一轮。电话在这里就相当于cpu,而正在或等待打电话的人就相当于任务数。在电话亭使用过程中,肯定会有人打完电话走掉,有人没有打完电话而选择重新排队,更会有新增的人在这儿排队,这个人数的变化就相当于任务数的增减。为了统计平均负载情况,我们5秒钟统计一次人数,并在第1、5、15分钟的时候对统计情况取平均值,从而形成第1、5、15分钟的平均负载。有的人拿起电话就打,一直打完1分钟,而有的人可能前三十秒在找电话号码,或者在犹豫要不要打,后三十秒才真正在打电话。如果把电话看作cpu,人数看作任务,我们就说前一个人(任务)的cpu利用率高,后一个人(任务)的cpu利用率低。当然, cpu并不会在前三十秒工作,后三十秒歇着,cpu是一直在工作。只是说,有的程序涉及到大量的计算,所以cpu利用率就高,而有的程序牵涉到计算的部分很少,cpu利用率自然就低。但无论cpu的利用率是高是低,跟后面有多少任务在排队没有必然关系。

cpu数量和cpu核心数(即内核数)都会影响到cpu负载,因为任务最终是要分配到cpu核心去处理的。两块cpu要比一块cpu好,双核要比单核好。因此,我们需要记住,除去cpu性能上的差异,cpu负载是基于内核数来计算的,即“有多少内核,即有多少负载”,如单核最好不要超过100%,也就是负载为1.00,如此类推。

linux里有一个/proc目录,存放的是当前运行系统的虚拟映射,其中有一个文件为cpuinfo,这个文件里存放着cpu的信息。/proc/cpuinfo文件按逻辑cpu而非真实cpu分段落显示信息,每个逻辑cpu的信息占用一个段落,第一个逻辑cpu标识从0开始。

$ cat /proc/cpuinfo 
processor       : 0
vendor_id       : genuineintel
cpu family      : 6
model           : 63
model name      : intel(r) xeon(r) cpu e5-2630 v3 @ 2.40ghz
stepping        : 2
microcode       : 0x36
cpu mhz         : 2399.998
cache size      : 20480 kb
physical id     : 0
siblings        : 2
core id         : 0
cpu cores       : 2
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 15
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr ......
bogomips        : 4799.99
clflush size    : 64
cache_alignment : 64
address sizes   : 42 bits physical, 48 bits virtual
power management:

要理解该文件中的cpu信息,有几个相关的概念要知道,如:processor表示逻辑cpu的标识、model name表示真实cpu的型号信息、physical id表示真实cpu和标识、cpu cores表示真实cpu的内核数等等。

逻辑cpu的描述:现在的服务器一般都使用了“超线程”(hyper-threading,简称ht)技术来提高cpu的性能。超线程技术是在一颗cpu同时执行多个程序而共同分享一颗cpu内的资源,理论上要像两颗cpu一样在同一时间执行两个线程。虽然采用超线程技术能同时执行两个线程,但它并不象两个真正的cpu那样,每各cpu都具有独立的资源。当两个线程都同时需要某一个资源时,其中一个要暂时停止,并让出资源,直到这些资源闲置后才能继续。因此超线程的性能并不等于两颗cpu的性能。具有超线程技术的cpu还有一些其它方面的限制。

二、cpu负载率的计算方式

load average的概念源自unix系统,虽然各家的公式不尽相同,但都是用于衡量正在使用cpu的进行数量和正在等待cpu的进程数量,一句话就是runable processes的数量。所以load average可以作为cpu瓶颈的参考指标,如果大于cpu的数量,说明cpu可能不够用了。

但是,在linux上有点差异!

linux上的load average除了包括正在使用cpu的进程数量和正在等待cpu的进程数量之外,还包括uninterruptible sleep的进程数量。通常等待io设备、等待网络的时候,进程会处于uninterruptible sleep状态。linux设计者的逻辑是,uninterruptible sleep应该都是很短暂的,很快就会恢复运行,所以被等同于runnable。然而uninterruptible sleep即使再短暂也是sleep,何况现实世界中uninterruptible sleep未必很短暂,大量的、或长时间的uninterruptible sleep通常意味着io设备遇到了瓶颈。众所周知,sleep状态的进程是不需要cpu的,即使所有的cpu都空闲,正在sleep的进程也是运行不了的,所以sleep进程的数量绝对不适合用作衡量cpu负载的指标,linux把uninterruptible sleep进程算进load average的做法直接颠覆了load average的本来意义。所以在linux系统上,load average这个指标基本失去了作用,因为你不知道它代表什么意思,当看到load average很高的时候,你不知道是runnable进程太多还是uninterruptible sleep进程太多,也就无法判断是cpu不够用还是io设备有瓶颈。

从另一个方面来说,也就可以解释为什么磁盘慢时(大量磁盘使用时),cpu负载会飙高了。基本上我碰到cpu负载高的情况就两种情况:cpu本身处理太多任务,再加上软中断和上下文切换太频繁导致负载高;再就是磁盘太慢导致了不可中断睡眠太多导致cpu负载高。

以上就是本文关于浅谈为什么磁盘慢会导致linux负载飙升的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!