磁盘通常是计算机最慢的子系统,也是最容易出现性能瓶颈的地方,因为磁盘离 CPU 距离最远而且 CPU
访问磁盘要涉及到机械操作,比如转轴、寻轨等。访问硬盘和访问内存之间的速度差别是以数量级来计算的,就像1天和1分钟的差别一样。要监测 IO
性能,有必要了解一下基本原理和 Linux 是如何处理硬盘和内存之间的 IO 的。
内存页
上一篇 Linux 性能监测:Memory
提到了内存和硬盘之间的 IO 是以页为单位来进行的,在 Linux 系统上1页的大小为 4K。可以用以下命令查看系统默认的页面大小:
$ /usr/bin/time -v date
...
Page size (bytes): 4096
...
缺页中断
Linux
利用虚拟内存极大的扩展了程序地址空间,使得原来物理内存不能容下的程序也可以通过内存和硬盘之间的不断交换(把暂时不用的内存页交换到硬盘,把需要的内
存页从硬盘读到内存)来赢得更多的内存,看起来就像物理内存被扩大了一样。事实上这个过程对程序是完全透明的,程序完全不用理会自己哪一部分、什么时候被
交换进内存,一切都有内核的虚拟内存管理来完成。当程序启动的时候,Linux 内核首先检查 CPU
的缓存和物理内存,如果数据已经在内存里就忽略,如果数据不在内存里就引起一个缺页中断(Page
Fault),然后从硬盘读取缺页,并把缺页缓存到物理内存里。缺页中断可分为主缺页中断(Major Page Fault)和次缺页中断(Minor
Page
Fault),要从磁盘读取数据而产生的中断是主缺页中断;数据已经被读入内存并被缓存起来,从内存缓存区中而不是直接从硬盘中读取数据而产生的中断是次
缺页中断。
上面的内存缓存区起到了预读硬盘的作用,内核先在物理内存里寻找缺页,没有的话产生次缺页中断从内存缓存里找,如果还没有发现的话就从硬盘读取。很
显然,把多余的内存拿出来做成内存缓存区提高了访问速度,这里还有一个命中率的问题,运气好的话如果每次缺页都能从内存缓存区读取的话将会极大提高性能。
要提高命中率的一个简单方法就是增大内存缓存区面积,缓存区越大预存的页面就越多,命中率也会越高。下面的 time
命令可以用来查看某程序第一次启动的时候产生了多少主缺页中断和次缺页中断:
$ /usr/bin/time -v date
...
Major (requiring I/O) page faults: 1
Minor (reclaiming a frame) page faults: 260
...
File Buffer Cache
从上面的内存缓存区(也叫文件缓存区 File Buffer Cache)读取页比从硬盘读取页要快得多,所以 Linux
内核希望能尽可能产生次缺页中断(从文件缓存区读),并且能尽可能避免主缺页中断(从硬盘读),这样随着次缺页中断的增多,文件缓存区也逐步增大,直到系
统只有少量可用物理内存的时候 Linux 才开始释放一些不用的页。我们运行 Linux
一段时间后会发现虽然系统上运行的程序不多,但是可用内存总是很少,这样给大家造成了 Linux 对内存管理很低效的假象,事实上 Linux
把那些暂时不用的物理内存高效的利用起来做预存(内存缓存区)呢。下面打印的是 VPSee 的一台 Sun 服务器上的物理内存和文件缓存区的情况:
$ cat /proc/meminfo
MemTotal: 8182776 kB
MemFree: 3053808 kB
Buffers: 342704 kB
Cached: 3972748 kB
这台服务器总共有 8GB 物理内存(MemTotal),3GB 左右可用内存(MemFree),343MB
左右用来做磁盘缓存(Buffers),4GB 左右用来做文件缓存区(Cached),可见 Linux 真的用了很多物理内存做
Cache,而且这个缓存区还可以不断增长。
I
分享到:
相关推荐
dotNet Core 内存占用过高的解决方案dotNet Core 内存占用过高的解决方案
NULL 博文链接:https://dreamerjin.iteye.com/blog/1168077
通过定时 crontab -e 任务,执行脚本,监测服务器的cpu,内存,磁盘,负载,超出预定的值时发邮件到自己的邮箱告警,很好的提前预防服务器的资源紧张问题。
NULL 博文链接:https://ainn2006.iteye.com/blog/1549724
可以看到我的服务器内存是2G的,但是目前可用内存只剩下70M,内存使用率高达92%,很有可能是内存使用率过高导致数据库服务挂断。 继续看详细情况,使用 top 指令: 然后再看指令输出结果中详细列出的进程情况,重点...
linux系统下,一个tomcat web服务的cpu占用率非常高,top显示结果超过200%。请求无法响应。反复重启依然同一个现象。 问题排查 1、获取进程信息 通过jdk提供的jps命令可以快速查出jvm进程, jps pid 2、查看...
以上分析可以看出,一台机器很有可能处于低cpu使用率高负载的情况,因此看机器的繁忙程度应该结合两者,从实际的使用情况观察,自己的一台双核志强2.8GHZ,2G内存的机器在平均负载到50左右,cpu使用率才接近100%
讲座的目的就是在同学们中间普及 Linux 基础知识,为今后我们更加接近的了解 Linux 做一 个好的开端。 第一讲 Linux基础 在这一讲中,我们主要是了解一下 Linux 的概况,以及对 Linux 有一个初步的感性认识。 ...
linux提供了很多命令来协助我们快速定位到错误,free命令是Linux最常用的命令之一:它可以查看系统的内存状况,包括服务器的总内存,已经使用的内存和剩下未被使用的内存,以及缓冲区和缓存各自占用的内存情况。...
本文以Mandrake Linux 9.1(Kenrel 2.4.21)为例,介绍Linux下的安装和登录命令。 immortality按:请用ctrl+f在本页中查找某一部分的内容或某一命令的用法。 ----------------------------------------------------...
kangle内置内存/磁盘两级缓存,采用LRU淘汰算法,缓存命中率非常高,有效降低资源占用 可以设置每个虚拟主机独立进程,独立身份运行(虚拟主机商的最爱,安全的实现虚拟主机功能); 商业版还带有独特的防CC攻击和限制...
对于运维工程师,我认为性能优化是很重要的一项工作,比如服务器CPU使用率过高,top命令之后怎么快速定位问题,又比如系统没有跑什么占用内存的程序,但是用free一看,内存已经不多了,应该怎么处理,或者一大早起来...
系统的性能是一个很大的概念,覆盖面非常广泛,对一个软件系统而言包括执行效率、资源占用率、稳定性、安全性、兼容性、可靠性等等,以下重点从负载压力方面来介绍服务器系统性能的测试。系统的负载和压力需要采用...
1、为什么要引入“进程” (1)进程调度属于低级处理机管理,即确定系统中哪个进程将获得CPU;而作业调度属于高级处理机管理,即确定系统中哪些作业将获得CPU。 (2)进程是一个具有一定独立功能的程序...
软件RAID中的所有操作皆由中央处理 " "器负责,所以系统资源的利用率会很高,从而使系统性能降低。软件RAID" "是不需要另外添加任何硬件设备,因为它是靠你的系统——主要是中央处理" "器的功能——提供所有现成的...
后来我们就用CMS gc(-XX:+UseConcMarkSweepGC),当时的总heap还是3g,新生代1.5g后,观察不是很理想,改为jvm heap为2g新生代设置-Xmn1g,在这样的情况下young gc发生的频率变成7、8秒一次,平均每次时间40-50毫秒...
于是各种手机播放器也紧跟着发展起来,但是很多播放器一味追求外" "观花哨,功能庞大,对用户的手机造成了很多资源浪费,比如CPU,内存等的占用 " "率过高,在用户需要多任务操作时,受到了不小的影响,带来了许多...