winserver物理内存使用不到一半就频繁爆内存

winserver该不该设置虚拟内存?使用的物理内存和内存使用的区别?提交、专用、工作集的区别?已提交又是什么东西?

如何配好winserver内存

    • 前言
      • ■ 概述
    • 过程
      • ■ 发现问题
      • ■ 模拟再现
        • 1. 结果呈现
        • 2. 触发操作、尝试解读
        • 3. 提出假设、重复实验
        • 4. 得出结论
      • ■ 探索原因
        • “使用的物理内存”和”内存使用“的区别
          • ① 初探
          • ② 二探
          • ③ 再探
          • ④ 终探
          • ⑤ 结论
        • 提交、专用、工作集的区别
        • 提交大小
          • ① 两个配置例子
          • ② 结论
      • ■ 配置优化
        • 一个比方深入理解
        • 反向比喻
        • 分页文件该配多少?
    • 推荐RAMMap
    • 最后

前言

线上一直存在一个问题,内存无法最大利用化,经常出现服务崩溃问题。

■ 概述

winserver上有16g的物理内存,使用不到8g,就会莫名其妙出现各种服务闪退问题。查看资源管理器,发现虽然物理内存使用比不高,但是内存使用却接近100%。深入了解后才知道提交内存才是进程真正占用的内存。设置虚拟内存以充分利用物理内存,便可解决此问题。

过程

■ 发现问题

待解决清单里有个问题:内存使用大于7g就会有问题(物理内存有16g),tomcat内存会不断增加。
—— (方向错了,tomcat背锅了)

由于无从下手,渐渐地,这个问题被遗忘掉了。

而win又有一个特点,开机久了,系统会占用物理内存越来越多,所以每次服务奔溃了重启奔溃了重启(基本奔溃的是一个视频流服务,所以它背锅,认为这个服务存在问题),也多次提出过这个问题,和之前一样,问题定向错误,无从下手,渐渐地习惯了这种奔溃。慢慢地,物理内存占用到了12g。
—— (开机久后,频繁奔溃的临界点由8g提高到了13g,问题定向由应用问题转向了内存问题,错误认为内存确实不够用了,服务确实达到了该服务器所能支持的临界点)

这个问题被重新翻了出来。

■ 模拟再现

既然无法避免频繁崩溃,在空闲时间点,我选择主动地去触发它,让奔溃的场景复现,然后解析奔溃原因。

1. 结果呈现

如图所示,红线是崩溃的临界线。曲线在攀升到巅峰后,突然呈断崖式下降,“使用的物理内存”下降了12%左右,“内存使用”下降25%左右。

2. 触发操作、尝试解读

本来两个曲线有所富余,我尝试的启动两个tomcat,曲线逐渐上升,直到上图所示,“使用的物理内存”缓缓增加,“内存使用”攀升到天花板后开始垂死挣扎,直到某一个点,“内存使用”直接触顶,然后就是两个tomcat同时闪退,接着资源监控器中也可看到两条曲线同时急速下降。

3. 提出假设、重复实验

这个结果可把我乐坏了,如果不存在任何触顶的话,这个问题可能真的就不了了之了,但是“内存使用”的曲线触顶了,我可以大胆提出假设,这条“内存使用”的曲线呈服务器真正所使用的内存情况。我尝试着在各台不同的Windows电脑上重复实验,结果不出所料,只要“内存使用”达到了百分比,程序就会奔溃。当然更多的电脑上情况是”使用的物理内存“占比很高,”内存使用“占比较低,难以撑满。

4. 得出结论

程序频繁崩溃的直接原因是”内存使用“达到了百分比。

■ 探索原因

找到了直接原因,然后就是寻找它背后的根本原因。

“使用的物理内存”和”内存使用“的区别

① 初探

这两个图究竟有什么联系?果断进行面向百度解决方案,结果很失败,这个搜索词条根本找不到相关的资料。然后就是寻求同学、好友的帮助,仍然得不出结果,算是大家的一个知识盲区,同学的回答中最接近事实的猜测就是第二块曲线图可能是虚拟内存。然后大胆猜测内存使用是物理内存+虚拟内存,然后我查看了服务器上设置的虚拟内存分页文件设置大小——关闭,为0,烦恼来了,既然没设置虚拟内存,那么第二块曲线图所呈现应该和物理内存一样才对,同学又给出了猜测,还有一部分物理内存被操作系统占用了而又不显示,而内存使用中显示了出来,然后我假定了结论有一部分物理内存作为置换使用,所以不可用,供系统使用而又不显示在物理内存里 。。。

② 二探

这个结论给的很勉强,无法服众,不过好歹有点再深究的蛛丝马迹,好过无头苍蝇,不知道怎么走好太多了。知道了和虚拟内存可能有关系,我就尝试调整虚拟内存,结果问题莫名其妙地解。解决。。解决了。。。调大虚拟内存后,第二块曲线图的曲线立马降了下来,崩溃的情况自然就不会出现了。

类似这样的情况,原本无虚拟内存,给系统配上了8g虚拟内存后,第二块曲线图的占比立马降了下来。

③ 再探

解决问题后算是松一口气,但是接下来的日子里总觉得心中搁着一块什么东西,毕竟,知其然而不知其所以然只能算解决一小半问题,虽然这个问题解决了,但你不知道什么原因,未来还会出现什么问题完全是未知的,你解决问题获得了什么知识,也是是空白的。因此,我并未放下对这个现象的探索。

④ 终探


在一次Windows10上的玩耍,我看到了已提交的这个比值,这算是一个重大的突破口,只要不放弃,你终会找到线索,得到指引的。

winserver物理内存使用不到一半就频繁爆内存_第1张图片
这个比值只有在Windows10上会显示具体多少g,而其它版本显示的是一个分数不够直观,所以一直忽略掉了。

⑤ 结论

抓住已提交去查询资料,收获满满。
这个第二块图显示的是——申请的虚拟内存/总的虚拟内存
在此,重点了解一个概念,我称虚拟内存分为广义和狭义,我们通常提到的虚拟内存指的是分页文件

在 Windows中,虚拟内存其实是一个容量很大的文件 pagefile. sys,称之为页面文件

而在操作系统层面,实际上的虚拟内存(广义虚拟内存)= 物理内存 + 分页文件(狭义虚拟内存)

如图,是我开启的一个3GB物理内存虚拟机,设置了5000MB虚拟内存(分页文件)。
打开任务管理器和cmd输入systeminfo可得以下对比信息。
winserver物理内存使用不到一半就频繁爆内存_第2张图片
这就可以看到,此处的虚拟内存指的 物理内存 + 分页文件,也就搞懂了“使用的物理内存”和”内存使用“的区别,同时也得知了进程占用的物理内存和虚拟内存是不一样的。(后文虚拟内存皆为操作系统层面,狭义虚拟内存直接称作分页文件)

提交、专用、工作集的区别

任务管理器-查看-选择列,可以看到7个内存相关的-勾选显示,这里主要关注5个项,提交大小、峰值工作集、工作集、专用工作集、可共享工作集。
winserver物理内存使用不到一半就频繁爆内存_第3张图片
顾名思义,
峰值工作集——记录物理内存使用最大值
工作集——专用工作集"和"共享工作集"总和
专用工作集——进程独占物理内存
共享工作集——可以和别的进程共享的物理内存值
提交大小——给当前进程使用而保留的私有虚拟内存的数量

因为有一部分属于共享工作集,所以,专用工作集总和小于总物理内存使用,工作集总和大于总物理内存使用。

而提交大小表示进程所申请的虚拟内存大小,而又不一定被使用。

提交大小

① 两个配置例子

例如,修改mysql的配置innodb_buffer_pool_size为4096M,可以看到net start mysql后,提交内存瞬间变大,甚至比我设的值增加得还要多。
例如,在catalina.bat调大tomcat的jvm大小,set JAVA_OPTS=-server -Xmx2048m -Xms2048m,也可看到瞬间提高提交大小,虚拟内存瞬间变大的效果。

② 结论

可以得知,提交大小只是进程所申请的虚拟内存大小,即使还没使用,它也占用在那。

■ 配置优化

一个比方深入理解

我打个这样的比喻——
A村有甲、乙、丙三户人家(多个进程),村里有个小山泉,这里的泉水又干净又甜,可每天只能产10吨泉水(10GB物理内存),而较远的镇上有条大河(硬盘),产量很大,但是水的质量很差,不过为了应急使用,村里挖了个大池子用于储存从镇上运过来的河水,暂定存15吨河水(15GB分页文件)。村里有这么个规定,每户人家过来拎水的时候得报备一下你今天需要用多少水(泉水+河水)(提交大小、虚拟内存),即使你不一定要过来领取,村干部(系统)也为你保留住,你下次来的时候肯定可以满足你,不过是泉水还是河水就不一定了,因为干部是先发放泉水的(先使用物理内存),来晚了就没有了。干部得做到确保总的报备量(总提交大小)不能大于泉水+河水(虚拟内存),这都不能确保的话,是要掉饭碗的。所以你报备水量加进总申请量一旦超过村里的总存储水量,村干部必须驳回你的申请,因为现在驳回可以保证只崩溃申请的人,要是不驳回等不够用的时候就会出大乱子。(你申请的虚拟内存导致超过总虚拟内存,系统让你奔溃,所以有时候会发现奔溃的不是最后开的那个进程也不是提交最大的那个进程,而是最后一个触发底线的那个进程)

反向比喻

进程申请的虚拟内存,也就是提交大小是小于使用内存的(使用量小于报备量),一个进程或许还好,但是全部进程加起来申请的虚拟内存可能会比真正使用的内存大很多,也就是所谓的占着茅坑不拉屎,如果你不设置分页文件,这些进程不知足的申请,会锁住物理内存不让分配给真正有需要的进程(报备太多锁住了所有水,而事实上泉水都还没分配完)

如图,线上就存着一个服务提交了接近5GB,而工作集只有一点多GB,工作集达到2GB的时候,提交大小甚至超过7GB,一个进程就占用了7GB,如果不配置虚拟内存你说16GB够用吗?
winserver物理内存使用不到一半就频繁爆内存_第4张图片

分页文件该配多少?

提交内存太大的原因有很多,程序配置问题、内存泄漏又或者是程序需要,提交大小是有可能远大于它的使用巅峰工作集的。有时候你可以从程序根源去解决问题,让提交大小降下来,如果实在降不下来,就需要配置虚拟内存让它占用。一个进程太霸道,占着茅坑不拉屎,你又无法劝阻它,只能选择开放一些无价值的劣质茅坑让它满足。

上面讲的是部分贪心的进程申请太多内存的情况下,可以配置虚拟内存解决它。实际上,即使你的电脑上,没有贪心的进程,也是应该配置分页文件的。

例如,两个互斥的操作,打游戏(占用7g)和股票操作(占用4g),而你的电脑只有8g物理内存,那么不配置分页文件的时候,只能打开其中一个,而配置虚拟内存后,你打游戏的同时,可以把股票软件挂在后台,等打完一把游戏后切回去继续股票操作。当然切换的时候会有卡顿一小会儿,因为需要从读取硬盘写入交换到物理内存中,我们经常看到的无响应的时候,打开资源管理器,你会发现硬错误被占满了,不过总比打不开好。

所以分页文件配置多少不是一个固定的值的,而是取决你开什么软件,运行什么进程。以往给出的常规经验值是物理内存的1.5倍-2倍,而像我这种存在内存泄漏的第三方进程时,只能配置更多的分页文件让它占用。

推荐RAMMap

使用RAMMap可以做到不重启为winserver做一个内存保养,当然提交大小是降不下来的。清理完内存,硬错误也随之出来了,说明从硬盘中作交换到物理内存。

最后

在我写这篇文章的时候看到了老毛桃的一篇文章 http://www.360doc.com/content/19/0827/17/261866_857402932.shtml
老毛桃诶,从小就知道了,这算是非常有权威的,也更加认证了我的观点。

配置分页文件是为了让物理内存的利用最大化,作为服务器和客户端电脑是两种不同的情况,在这个大内存时代,普通电脑用的软件远远小于物理内存,自然可以调低分页文件,而服务器不同,一寸内存一寸金,设置一定分页文件是非常有必要的。

你可能感兴趣的:(操作系统,win内存管理,该不该配置虚拟内存,物理内存还没满报内存不足,windows,运维)