从硬盘指标异常了解虚拟内存内部机制

场景

最近线上用户使用量减少,所以降低了服务器(windows server)配置,由之前的16核 32G降为4核 8G。平时没有发现问题,周一上班发现系统崩了。查看异常信息,发现是OOM(内存溢出)了,定位问题比较简单,每周一凌晨执行定时任务生成周报导致的。
在这里插入图片描述
因为之前处理程序崩溃的问题就是追踪一下服务器内存和CPU的占用情况,并没有查看硬盘的使用情况。这次观察硬盘指标,发现读写都异常。
在这里插入图片描述
因为数据库服务器是单独的,应用服务器硬盘为什么出现大量的读(从硬盘到内存)和写(从内存到硬盘),解决这个问题,就需要了解操作系统的虚拟内存机制。

冯诺依曼结构计算机的基本工作原理:

计算机在运行时,先从内存中取出第一条指令,通过控制器的译码,按指令的要求,从存储器中取出数据进行指定的运算和逻辑操作等加工,然后再按地址把结果送到内存中去。接下来,再取出第二条指令,在控制器的指挥下完成规定操作。依此进行下去。直至遇到停止指令。程序与数据一样存取,按程序编排的顺序,一步一步地取出指令,自动地完成指令规定的操作是计算机最基本的工作原理,冯诺依曼体系结构计算机的工作原理可以概括为八个字:存储程序、程序控制

存储程序 — 将解题的步骤编成程序(通常由若干指令组成),并把程序存放在计算机的存储器中(指主存或内存);

程序控制 — 从计算机主存中读出指令并送到计算机的控制器,控制器根据当前指令的功能,控制全机执行指令规定的操作,完成指令的功能。重复这一操作,直到程序中指令执行完毕。

什么是虚拟内存(VM)

我们知道一个程序中的进程和进程是共享CPU和内存资源的,一个系统会运行多个进程,如果太多进程需要更多的内存,其中就会导致一些程序不能运行。当一个进程没有可用的内存时,就会导致无法正常运行。而且,一个进程如果操作了其他进程的内存空间,将会导致其他进程错误。为了更加有效的管理内存并且减少错误,现代系统提供了对内存的抽象概念叫做虚拟内存(VM)。
在这里插入图片描述
虚拟内存提供了三个重要的能力:

  1. 它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,它高效地使用了主存。
  2. 它为每个进程提供了一致的地址空间,从而简化了内存管理。
  3. 它保护了每个进程地址空间不被其他进程破坏。

物理和虚拟寻址

物理地址是主存是实际存在的地址,早起的PC使用的是物理寻址。
在这里插入图片描述
如图:现代处理器使用的是一种称为虚拟寻址的寻址形式。使用虚拟寻址,CPU通过生成一个虚拟地址(VA)来访问主存,通过CPU芯片上叫做内存管理单元(MMU)的专用硬件,医用放在主存中的查询表来动态翻译虚拟地址。

虚拟内存作为缓存工具

虚拟内存被组织为一个由存放在磁盘上的N个连续的字节大小的单元组成的数组。每字节都有一个唯一的虚拟地址, 作为到数组的索引。磁盘上数组的内容被缓存在主存中。

和存储器层次结构中其他缓存一样, 磁盘(较低层)上的数据被分割成块,这些块作为磁盘和主存(较高层)之间的传输单元。VM系统通过将虚拟内存分割为称为虚拟页(VP)的大小固定的块来处理这个问题。每个虚拟页的大小为p=2^p字节。类似地,物理内存被分割为物理页(Physical Page, PP), 大小也为P字节(物理页也被称为页帧(page frame))。
任意时刻,虚拟内存页面的集合会被分割为三个不相交的子集。
未分配的
VM系统还未分配(或者创建)的页。未分配的块没有任何数据和它们相关联,因此也就不占用任何磁盘空间。也就是这个编号的页还不存在
缓存的
当前已缓存在物理内存中的已分配页。
未缓存的
未缓存在物理内存中的已分配页。
如下图所示:
在这里插入图片描述

页表

由于要进行虚拟页和物理页面的替换,或者需要查看虚拟页是否已经缓存在主存中,所以虚拟页面和物理页面的对应关系一定要记录下来。页表的主要功能就是将虚拟页映射到物理页。每次地址翻译硬件将一个虚拟地址转换为物理地址时, 都会读取页表。其主要结构如下:
在这里插入图片描述

页命中

缺页

分配页面

当操作系统分配一个新的虚拟内存页时对我们示例页表的影响,例如,调用malloc的结果。在
这个示例中,VP5的分配过程是在盘上创建空间并更新PTE 5,使它指向磁盘上这个新创建的页面。
注意只有当使用到这部分内容的时候,这个磁盘中的页面才会调入内存中。
在这里插入图片描述
尽管在整个运行过程中程序引用的不同页面的总数可能超出物理内存总的大小,但是局部
性原则保证了在任意时刻,程序将趋向于在一个较小的活动页面(active page)集合上工作,这个
集合叫做工作集(working set)或者常驻集合(resident set)。在初始开销,也就是将工作集页面调
度到内存中之后,接下来对这个工作集的引用将导致命中,而不会产生额外的磁盘流截。如果工作集的大小超出了物理内存的大小,那么程序将产生一种不幸的状态,叫做抖动(thrashing),这时页面将不断地换进换出。

抖动在分页存储管理系统中,内存中只存放了那些经常使用的页面, 而其它页面则存放在外存中,当进程运行需要的内容不在内存时, 便启动磁盘读操作将所需内容调入内存,若内存中没有空闲物理块, 还需要将内存中的某页面置换出去。也就是说,系统需要不断地在内外存之间交换信息。 若在系统运行过程中,刚被淘汰出内存的页面,过后不久又要访问它, 需要再次将其调入。而该页面调入内存后不久又再次被淘汰出内存,然后又要访问它。 如此反复,使得系统把大部分时间用在了页面的调入/换出上, 而几乎不能完成任何有效的工作,这种现象称为抖动。

小结

到此我们的问题,就可以合理解释了,因为定时任务执行过程中,出现了内存抖动,导致不断的换进换出,硬盘读写异常。
虚拟内存是计算机中最重要的概念之一,本文中大部分内容均来自《深入理解计算机系统》第九章-虚拟内存。因为实在是太经典了,每一个字都值得好好阅读。强烈建议大家阅读一下,博客覆盖的内容和书本还是有很大差距的。如果有需要电子版书籍的,欢迎关注交流学习。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值