ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Pagefile.sys 能否删除?Windows 分页文件与虚拟内存配置指南

Pagefile.sys 能否删除?Windows 分页文件与虚拟内存配置指南 1. Pagefile.sys 到底是什么从一次内存告警说起如果你在 Windows 的资源管理器里把显示隐藏文件和显示受保护的系统文件两个开关都打开大概率会在 C 盘根目录看到一个体积极其夸张的Pagefile.sys几个 GB 到十几个 GB 都算正常。很多人第一反应是这玩意儿占这么多空间我是不是中毒了第二反应是能不能直接删掉。这两个疑问我在帮朋友清硬盘的时候被问过不下几十次所以干脆把这件事一次讲透。Pagefile.sys是 Windows 的分页文件也叫页面文件是虚拟内存机制在磁盘上的落地载体。它不由任何用户程序创建而是由内核的内存管理器直接掌管。你可以把它理解成系统给自己预留的一块内存后备仓库物理内存RAM是工位只够若干个人同时办公分页文件是仓库那些暂时不干活、但随时可能被叫回来的数据就先搬到仓库待命。这个比喻不严谨的地方在于搬到仓库的数据不是被赶走的垃圾而是被标记为暂时不动的活跃数据一旦被访问几毫秒内就能重新搬回工位。为什么我要花篇幅解释这个因为删不删这个问题的答案完全取决于你理解不理解它承担了什么职责。绝大多数劝人删除的文章只看体积不看功能属于典型的看表不看里。而真正该做的判断是这块空间换来的稳定性、可观测性和兼容性值不值得那十几个 GB。1.1 虚拟内存不是硬盘当内存这么简单很多人对虚拟内存的理解停留在内存不够了就用硬盘顶这个说法在早期 Windows 上勉强成立在现代 Windows 上会误导人。真实情况是Windows 的内存管理器维护着一张地址映射表每个进程都以为自己拥有一整块连续的地址空间而这块地址空间被切成 4KB 一页。物理内存里只保留最近活跃的页面叫做工作集Working Set那些被访问过、但当前没有热度的页面会进入一个叫备用列表Standby List的状态从进程的工作集里移除但仍然留在物理内存中随时可以零成本回归。分页文件真正参与的动作有两个。第一个是当物理内存压力变大、备用列表需要被回收时那些尚未被修改的页面可以直接丢掉因为磁盘上有副本而被修改过的页面必须先写到分页文件里保存下来这叫脏页回写。第二个是当程序申请的提交内存Commit超过物理内存总量时多出来的部分必须由分页文件来背书否则内存管理器会直接拒绝这次分配。这里有个关键概念叫提交限制Commit Limit它大致等于物理内存加上分页文件大小。任务管理器性能页里的已提交那个数字分子是当前提交量分母就是提交限制。很多程序在启动时会先申请一大块提交内存即使它并不会真的全部用满。你把分页文件删掉提交限制瞬间塌到等于物理内存这些程序的启动申请就会被挡在门外表现形式五花八门有的弹内存不足有的直接闪退有的打开了但某个功能永远初始化失败。1.2 这个文件的三个特殊属性第一个属性是独占占用。分页文件被内核以独占方式打开任何进程想删除它都会被拒绝。所以你在资源管理器里右键删除只会得到文件正在使用的提示。想让它消失只能先在系统设置里关掉分页文件然后重启。重启之后文件才真正释放这一步劝退了相当一部分只想点一下删除的人。第二个属性是动态伸缩。默认情况下Windows 对分页文件的管理策略是系统管理的大小它会根据内存压力、磁盘可用空间和崩溃转储需求自动调整文件尺寸。这也是为什么你会看到它今天 5GB、下周变成 12GB。系统管理模式下文件是稀疏增长的前面用到的部分在磁盘上实际占空间后面预留的部分不一定真占。第三个属性是受保护的系统文件。它带隐藏和系统属性普通查看方式看不到第三方清理工具的大文件扫描却经常把它列出来然后给一个可安全删除的误导标签。我见过有人用清理工具批量删了几十个 GB 的垃圾删完重启进不去桌面最后靠 PE 盘挂载系统分区手动重建才救回来。这个标签是纯粹的算法误判看体积大就归类为可清理。1.3 它和物理内存的分工对照维度物理内存RAM分页文件Pagefile.sys读写速度纳秒级毫秒级相差四到五个数量级断电后数据全部丢失数据保留但重启后基本失效主要职责承载活跃工作集与缓存承载脏页副本、扩展提交限制是否可删除不可可以但代价很大容量规划按峰值工作集定按提交需求与转储需求定对性能的影响决定性有影响但绝大多数场景不在关键路径上看清楚这张表很多争论就没必要了。分页文件的读写确实慢但它承载的本来就是不在关键路径上的数据。真正需要它频繁读写的场景是物理内存已经严重不足这时候删掉它只会让系统从卡变成崩。2. 删除 Pagefile.sys 会发生什么后果清单先给结论在正常使用的机器上除非你有非常明确的特殊理由否则不要删除它。把这句话展开是因为删了会怎样的具体表现比一句会出问题要有说服力得多。下面这些现象我在不同机器上都亲眼见过按出现频率排序。2.1 提交上限塌陷之后程序开始申请不到内存这是最常见也最容易被误判的后果。物理内存 16GB、分页文件 10GB 的机器提交限制大约 26GB删掉分页文件后提交限制直接变成 16GB。此时如果你的日常负载是浏览器开了三十个标签、后台挂着数据库、IDE 开着两个项目、再跑一个虚拟机提交量冲到 18GB 以上是很轻松的。一旦提交量顶到提交限制新的内存分配请求会失败。失败的表现形式非常不统一。浏览器可能只是某个标签页崩溃你可能以为是网页的问题开发工具可能提示无法分配内存然后就退出了你可能以为是软件 bug虚拟机软件可能启动到一半报错你可能以为是镜像损坏。这些现象的共性是最难定位因为报错信息指向的是应用层而真正的根因在系统级的提交限制。我遇到过最典型的一次一台 32GB 内存的工作站同事为了清理空间把分页文件关了之后每天下午打开某个大型设计软件必崩上午就好好的。查了一周应用程序日志没结果最后看性能计数器才发现下午提交量会到 31GB 左右。这里还有个容易忽略的点某些系统组件本身就要求存在分页文件。比如部分版本的虚拟化组件、某些备份软件的卷影复制流程、以及个别老旧的行业软件会在启动时检查分页文件是否存在不存在直接拒绝运行。这种检查不是 bug是它们的设计假设。2.2 崩溃转储能力直接归零这是删除分页文件后损失最隐蔽、代价却最大的一项能力。Windows 在发生蓝屏BugCheck时需要把内核内存的内容写到磁盘上供事后分析这个落地位置就是分页文件。具体来说系统会先把内存内容转储到分页文件里重启后再由会话管理器把它搬运到C:\Windows\MEMORY.DMP。转储类型和空间需求大致是这样的小内存转储只需要几百 KB对分页文件几乎没要求内核内存转储需要几百 MB完整内存转储需要分页文件至少能容纳物理内存的内容量。如果分页文件被关掉或者被设置得太小蓝屏发生时系统根本写不进去转储你只会看到重启后什么都没有。任务的机器出一次蓝屏没有转储文件基本等于从零开始猜运气好能猜中运气不好要复现几十次。对普通家用机器蓝屏频率不高这个能力的价值感不强。但只要你的机器是生产力设备、服务器、或者你在做驱动和内核相关的开发转储文件就是排障的命根子。我给自己所有工作机的策略都是保留分页文件并开启自动内存转储宁可硬盘上占几个 GB也不要在真出事的时候两手空空。2.3 那些删了没事的说法是怎么来的网上确实有大量删了速度变快了删了也没出问题的分享这些说法不全是在骗人但都有前提条件而分享者往往没意识到自己踩在前提上。第一种情况是内存远大于负载。一台 64GB 内存只用来办公和上网的机器提交量常年不超过 10GB删掉分页文件确实感觉不到任何差异。但这不是分页文件没用的证据只能说暂时用不上。哪天装了个大工程量的软件或者开了虚拟机问题就来了。第二种情况是短期观察。删完当天没崩就说没问题但提交量峰值往往出现在特定工作流的特定阶段比如一次完整的数据库导入、一次大型项目编译、一次视频渲染批量导出。这些场景可能一周才碰一次样本太短。第三种情况是把转移当成删除。有人把分页文件从 C 盘移到了 D 盘然后看到 C 盘根目录的文件消失了就以为自己删掉了它。文件确实从 C 盘消失了但功能一点没少这是完全不同的操作。第四种情况是把 SSD 写入寿命的担忧当成理由。这个顾虑在机械硬盘时代还有几分道理在现在的固态硬盘上基本可以忽略。一块正常消费级 SSD 的写入寿命普遍在几百 TBW 以上分页文件每天多写入十几个 GB 的极端情况也很罕见正常使用下对寿命的影响排在视频缓存、系统更新、日志写入之后。为了省这点写入量去牺牲系统稳定性账算不过来。3. 比删除更靠谱分页文件的三套调整方案真正该做的不是删不删而是怎么配。分页文件配置得好可以同时兼顾空间、性能和排障能力。下面按先看清现状、再动手调整、最后处理多盘布局的顺序来说每一步我都尽量给出可直接照做的动作。3.1 动手前的现状记录与备份调整分页文件属于系统级改动出问题会影响启动所以先记录现状。我一般会做三件事。第一件把当前配置导出到文本文件留档方便随时回滚。打开管理员权限的 PowerShell跑这几条把关键信息抓下来# 当前是否由系统自动管理 Get-CimInstance Win32_ComputerSystem | Select-Object AutomaticManagedPagefile | Out-File $env:USERPROFILE\Desktop\pf_before.txt # 当前分页文件的位置、初始大小、最大大小 Get-CimInstance Win32_PageFileSetting | Select-Object Name, InitialSize, MaximumSize | Out-File -Append $env:USERPROFILE\Desktop\pf_before.txt # 实际使用量用于判断日常压力 Get-CimInstance Win32_PageFileUsage | Select-Object Name, AllocatedBaseSize, CurrentUsage, PeakUsage | Out-File -Append $env:USERPROFILE\Desktop\pf_before.txt第二件创建一个系统还原点。控制面板搜创建还原点在系统保护选项卡里点创建。这一步花两分钟能救命。我个人习惯是在任何涉及启动流程的改动前都做一次包括改分页文件、改引导配置、改磁盘驱动。第三件确认磁盘可用空间。分页文件所在的卷需要有足够余量一般建议保留分页文件最大尺寸再加上至少十个 GB 的空闲空间。如果 C 盘已经红到只剩几个 GB先清理空间别急着调分页文件空间不够的情况下调整反而容易触发其他问题。注意在服务器和高可用机器上做这类调整要安排在维护窗口内。修改分页文件设置本身大多不需要重启即可生效但涉及删除或移动文件位置时通常需要重启重启就意味着业务中断。3.2 图形界面调整五分钟搞定对大多数只有一两台机器要处理的场景图形界面最省事。路径是Win R输入sysdm.cpl回车进入高级选项卡在性能区域点设置在弹出的窗口里切到高级找到虚拟内存区域点更改。进去之后你会看到一个顶部复选框自动管理所有驱动器的分页文件大小。理解这个复选框的层级关系非常重要它一旦勾上下面所有盘符的独立设置全部失效系统接管一切。所以要做自定义第一步就是把它取消勾选否则你改完下面的数值点确定之后会被系统悄悄覆盖回去。这个坑我见太多人中招改完发现没生效反复改好几遍。取消勾选之后选中要配置的驱动器选自定义大小填初始大小和最大值点设置再点确定。注意设置按钮必须点光填数字不点设置切换盘符之后数值就丢了。如果是想彻底关闭某个盘上的分页文件选无分页文件然后点设置。这里有一个容易被忽略的细节如果你同时想保留 C 盘的分页文件、又想在 D 盘额外放一个需要在两个盘分别做一次配置每次都要点设置。最后的界面上应该能看到每个盘的状态标记。3.3 自定义大小怎么算三档参考表关于初始大小和最大值填多少网上流传最广的说法是物理内存的 1.5 到 3 倍这个说法来自很久以前的硬件环境直接照搬很容易配出离谱的数值。我按现代机器的实际使用习惯整理了三档参考你可以对号入座。使用场景物理内存初始大小最大值说明日常办公、上网、影音8 到 16GB2048MB4096MB保留系统转储能力空间占用可控开发、设计、中型虚拟机16 到 32GB4096MB8192MB覆盖提交峰值兼顾响应速度大型虚拟机、数据库、渲染32GB 以上8192MB16384MB建议同时开专用转储以降低分页文件压力这张表里的初始大小和最大值设成不同的值好处是文件可以按需增长平时不占太多空间。代价是增长过程中可能产生磁盘碎片而且动态扩展时会有轻微的性能抖动。如果你追求确定性可以把初始和最大设成同一个值文件一次性占满不再变化。我自己在主力工作机上用的是同值方案SSD 上空间富裕换来的行为可预测性更值。还有一个更省心的方案把自定义数值留空直接选系统管理的大小。Windows 的算法会结合物理内存、可用磁盘空间和当前压力动态决定对于不想操心的人来说这反而是最不容易出错的选择。我不建议普通用户为了优化去手工填数字绝大多数情况下手工配置不会比系统管理更好。提示Windows 自带一个推荐的数值提示在虚拟内存窗口里会显示当前系统推荐的大小。如果你不确定填多少可以先照着这个推荐值设再观察一段时间性能计数器里的分页文件使用率。3.4 多盘放置策略SSD、HDD 与第二块盘把分页文件从系统盘移到第二块盘是社区里流传很广的优化技巧。它在特定条件下有价值但盲目照做可能适得其反。先说结论性判断。如果第二块盘是机械硬盘别移。分页文件放到慢速盘上一旦真的发生高频换页系统会比原来更卡因为你把随机读写从快速介质挪到了最不擅长随机读写的介质上。机械硬盘的随机 4K 性能可能只有 SSD 的百分之一量级这个差距足以让系统从有点慢变成完全卡死。如果第二块盘是另一块 SSD而且和系统盘是独立的物理设备那么移动是有一定意义的可以把分页文件的随机写入压力从系统盘分摊出去降低对系统盘寿命和带宽的影响。收益不算大但风险也低属于可选优化。判断方式很简单在任务管理器性能页确认两块盘是独立的物理磁盘而不是同一块盘分出来的两个分区同一物理盘上分区互移毫无意义。还有一个更实际的策略保留系统盘上一个小尺寸分页文件同时在数据盘上放一个大尺寸分页文件。这样做的理由是系统盘上的那部分可以承担崩溃转储的职责数据盘上的那部分承担日常换页两者各有分工。这个配置在虚拟内存窗口里操作起来稍麻烦需要两次设置。如果你确实想完全移走 C 盘的分页文件请务必提前开启专用转储文件。这个功能的开关在注册表的 CrashControl 位置也可以直接配置让转储写到指定盘。不开启的话移走分页文件等于放弃转储能力。4. 命令行与批量脚本给多台机器统一设一台机器用图形界面就够了十台机器就得靠脚本。这块内容在网络上的资料比较零散而且命令的可用性在不同 Windows 版本上差异很大我把自己实际用过、验证过的组合整理在下面。4.1 查询几条命令摸清现状最基础的三条查询命令前面提到过这里补上输出解读。AutomaticManagedPagefile为 True 表示系统接管此时Win32_PageFileSetting里看到的数值可能不是最终生效值。Win32_PageFileUsage里的AllocatedBaseSize是当前实际分配的尺寸PeakUsage是自开机以来的峰值使用量后者对判断配多大极有参考价值。还有一个性能计数器值得关注它能直接告诉你分页文件在压力下有多忙# 采样 30 秒看分页文件使用率与硬错误情况 Get-Counter -Counter \Paging File(_Total)\% Usage, \Memory\Pages Input/sec -SampleInterval 1 -MaxSamples 30 | Select-Object -ExpandProperty CounterSamples | Select-Object Path, CookedValue% Usage长期在低位说明配置绰绰有余Pages Input/sec持续偏高说明物理内存偏紧系统在频繁从磁盘取回页面这时候加内存比调分页文件更有效。4.2 修改PowerShell 与注册表两种路子PowerShell 的 CIM 路子是这样一条链路先关掉自动管理再修改设置对象。实测时要注意Set-CimInstance修改Win32_PageFileSetting需要在管理员权限下运行而且部分系统上修改后的生效时机是立即部分需要重启保守做法是改完重启一次验证。# 第一步关闭自动管理 $cs Get-CimInstance Win32_ComputerSystem Set-CimInstance -InputObject $cs -Property { AutomaticManagedPagefile $false } # 第二步找到现有的分页文件设置并修改 $pf Get-CimInstance Win32_PageFileSetting -Filter NameC:\\pagefile.sys $pf.InitialSize 4096 $pf.MaximumSize 8192 Set-CimInstance -InputObject $pf如果目标分页文件条目当前不存在比如想在一个新盘上添加Get-CimInstance会返回空这时需要用New-CimInstance创建参数里带上Name、InitialSize、MaximumSize。创建过程偶尔会因为类的方法支持差异失败遇到这种情况就走注册表路子。注册表路子的核心键值是PagingFiles位置在HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management类型是多字符串值每行一个分页文件条目格式是路径 初始大小 最大值。写0 0表示由系统管理该条目的大小。改这个键值同样需要先关掉自动管理否则系统会在下次启动时覆盖。reg add HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management /v PagingFiles /t REG_MULTI_SZ /d C:\pagefile.sys 4096 8192 /f同一位置还有ExistingPageFiles键值记录当前实际存在的分页文件列表。这个值一般不需要手工改系统会自己同步如果它和PagingFiles长期不一致可以手工对齐一次。改注册表前记得导出该分支备份。4.3 批量下发与验证批量场景下我更推荐脚本加计划任务而不是远程逐台执行命令。原因很实际分页文件改动有时需要重启才完全生效而重启的时机最好由各机器自己决定避免你在远程执行时把同事的机器突然重启了。做法是写一个带参数校验的 PowerShell 脚本放在共享目录通过登录脚本或者组策略登录时执行一次。脚本里先判断当前配置是否已经是目标配置是就跳过不是才动避免每次登录都触发一次无谓的注册表写入。脚本末尾把改动前后的值写入本机日志目录方便事后抽查。验证环节我一般做两件事。一是重启后跑一遍查询命令确认Win32_PageFileSetting里的数值和Win32_PageFileUsage里的实际分配尺寸都符合预期顺带看一眼 C 盘根目录的文件尺寸是否变化。二是用性能计数器采样几分钟确认没有出现异常的硬错误飙升。这两步做完基本可以确认配置落地了。注意组策略和登录脚本在下发的机器上可能因为权限模型不同而失败尤其是非域环境。非域场景下更稳的做法是把脚本放进启动文件夹配合一个记录了执行状态的标记文件避免重复执行。5. 踩坑记录与常见问题速查到这一节前面讲的是该怎么做这里讲做的时候会撞上什么。这些都是我在实际处理过程中真实遇到过的情况很多在官方文档里找不到因为文档写的是设计意图而现场碰到的是各种边界条件。5.1 问题速查表现象常见原因处理方向改完数值重启后恢复原样自动管理未关闭被系统覆盖先取消自动管理所有驱动器复选框再改右键删除提示文件正在使用分页文件被内核独占占用先在设置里关闭该盘分页文件再重启设置无分页文件后蓝屏无法分析转储失去落地位置至少保留一个小尺寸分页文件并开启自动转储C 盘空间告急但分页文件很大系统管理模式下动态增长改为自定义固定尺寸或迁移到其他 SSD迁移到 D 盘后系统变卡D 盘是机械硬盘迁回系统盘或改用保留小尺寸方案某些软件报内存不足但内存没满提交限制顶到上限检查分页文件是否存在且尺寸合理分页文件出现碎片化增长初始值与最大值差距过大初始与最大设为同值任务管理器里已提交数字异常高长期驻留程序累积提交查进程提交排行不必立刻调分页文件5.2 我踩过的三个坑第一个坑是在虚拟化环境里忽略了宿主机的分页文件。有次在一台跑着多个虚拟机的宿主机上为了给虚拟磁盘腾空间把分页文件设成了很小的值。虚拟机本身跑得好好的但宿主机上的备份任务每天凌晨必失败。查了很久才发现备份流程会申请一块较大的连续提交内存提交限制不够导致申请失败。虚拟机内存是从物理内存直接划走的看起来和分页文件无关但宿主机上其他进程的提交需求不受虚拟机影响照样要占提交额度。第二个坑是把分页文件移到外置存储上。当时想省系统盘空间把分页文件指到了一个外接存储设备上。平时没事直到那个设备偶尔断电重连系统直接卡到无法操作。分页文件所在的卷必须是稳定可用的任何可能掉线的存储都不适合承载它。同类的还有网络位置系统根本不支持把分页文件放在网络共享上你填了也不会生效。第三个坑是忘记检查休眠文件和分页文件的空间叠加。C 盘空间告急的时候很多人只盯着分页文件忽略了同一根目录下的hiberfil.sys那个通常是物理内存的百分之几十到百分之百。两个文件加起来才是真实的隐藏占用。清理时如果两者都动容易一次性把系统盘可用空间弄成一个很尴尬的数值比如刚好不够崩溃转储反而制造了新问题。5.3 什么情况下确实可以关掉说了这么多不建议删的理由也得承认存在合理的关闭场景。总结下来大致有四类。第一类是系统盘空间极度紧张且无法扩容的应急场景。比如一台老设备只有一块小容量 SSD已经清理到极限还是不够用这时候可以临时关闭分页文件腾出空间但要在事后尽快补上并接受失去转储能力的事实。第二类是特定用途的定制系统。比如用于演示、考试、公共查询的机器系统盘做了还原保护重启即恢复运行负载很轻且固定这类环境关掉分页文件的影响可控。但要注意即便如此如果有蓝屏分析需求仍然不建议关。第三类是内存极大且负载极固定的场景。某些专门跑单一任务的工作站内存远超需求峰值并且经过长期监控确认提交量从未接近物理内存。这种场景可以关但前提是经过长期监控确认而不是拍脑袋觉得够用。第四类是对写入量有严格预算的特殊环境。极少数情况下存储介质的写入寿命预算是硬约束且已经通过其他手段把写入压到最低分页文件成了最后的可优化项。这种场景需要精确计算不是一般人会碰到的。除了这四类其余的删掉省空间删掉提速的理由我都不建议采纳。省出来的空间可以用别的方式找回来而丢掉的能力不是随时能补上的。还有一点值得单独说即便你决定在某个盘上关闭分页文件也不要同时把所有盘的分页文件都关掉。至少留一个小尺寸的哪怕只有 1GB也能保住崩溃转储的基础能力。这个取舍的性价比很高。最后分享一个我自己的排查习惯。当你遇到程序莫名其妙崩溃或者内存看起来没满但就是申请不到这类问题时先打开任务管理器性能页看已提交那一栏的分母。如果分母约等于物理内存总量说明这台机器上分页文件要么被关了要么被设得极小先把这一步排除掉再往下查应用层的问题能省下大量时间。那个数字比任何报错信息都更接近真相。
返回列表