为什么 Chrome 不尊重 DiskCacheSize 政策?

use*_*686 5 google-chrome

我已将值设置HKEY_CURRENT_USER\Software\Policies\Google\Chrome\DiskCacheSize为(即 32 MiB),但是当我检查配置文件中文件夹的大小时,我看到大小为 282 MiB。DWORD0x2000000Cache

为什么会这样?这是一个错误,还是我没有在注册表中设置正确的值?

and*_*415 9

更改 Chrome 缓存大小

缓存大小不固定;相反,它可以动态变化:

#28 rvargas@chromium.org

默认大小在开始时计算,取决于缓存所在卷中的可用磁盘空间。

我们努力尝试使用至少 80 [MiB],随着大小缓慢增长,直到达到大约 320 [MiB](免费 32 [GiB])。

这当然会根据整体测量性能而变化。

来源:问题 96264 - 铬 - 实施策略以在关闭时清除浏览器缓存

上面描述的行为从 version 开始仍然适用35.0.1916.153。缓存大小还将决定缓存文件的最大大小,即总字节数的 1/8。任何更大的东西都不会缓存在磁盘上。

Chrome 不提供通过用户界面更改其缓存大小的方法。为了覆盖默认限制,您需要使用特定的开关/标志或启用组策略设置。

在继续之前,请确保清空整个缓存,然后关闭浏览器。要检查更改是否成功应用,您可以在之后使用此内部页面:

chrome://net-internals/#httpCache
Run Code Online (Sandbox Code Playgroud)

使用命令行开关

  1. 复制 Google Chrome 应用程序快捷方式,并将其粘贴到桌面。

  2. 右键单击粘贴的快捷方式,然后从上下文菜单中选择“属性”。

  3. 通过在最后添加一个空格字符和以下开关来编辑目标字段:

    --disk-cache-size=<amount in bytes>
    
    Run Code Online (Sandbox Code Playgroud)

    例如,要设置 32 MiB限制(33554432 字节),结尾部分应如下所示:

    chrome.exe --disk-cache-size=33554432
    
    Run Code Online (Sandbox Code Playgroud)
  4. 单击确定以应用更改。每当您需要启动 Chrome 时,请使用修改后的快捷方式。

通过组策略编辑器

注意以下步骤适用于 Windows Vista 和更高版本。仅支持 Business/Professional/Pro 或更高版本。

  1. 使用管理员帐户登录。

  2. 下载官方政策模板

  3. 打开下载档案(例如使用7-Zip)。导航到windows文件夹,然后将admx文件夹解压缩到某处。

  4. admx文件夹包含以包含本地化字符串的区域性名称命名的不同子文件夹。还有一个chrome.admx文件是实际的模板。将其复制到PolicyDefinitions文件夹中,该文件夹通常位于此处:

     C:\Windows\PolicyDefinitions
    
    Run Code Online (Sandbox Code Playgroud)

    然后将与chrome.adml系统区域设置匹配的本地化文件复制到相应的PolicyDefinitions子文件夹中。

  5. 开始gpedit.msc

  6. 导航到计算机配置 > 管理模板 > Google > Google Chrome

  7. 双击Set disk cache size in bytes设置,启用它,然后选择所需的数量。完成后单击“确定”

至少是 Windows XP SP2。

配置 Google Chrome 将用于在磁盘上存储缓存文件的缓存大小。

如果您设置了此政策,无论用户是否指定了该--disk-cache-size标志,Google Chrome 浏览器都将使用提供的缓存大小。此策略中指定的值不是硬边界,而是对缓存系统的建议,任何低于几兆字节的值都太小,将四舍五入到合理的最小值。

如果此策略的值为0,则将使用默认缓存大小,但用户将无法更改它。

如果未设置此政策,则将使用默认大小,并且用户将能够使用该--disk-cache-size标志覆盖它。

来源:政策清单 - Chromium 项目

附加信息

如果缓存文件夹占用的空间比报告的多,这意味着有一些剩余的东西被留下了。摆脱它们的最简单方法是关闭浏览器,并手动删除所有缓存文件。下次启动浏览器时将创建一个全新的缓存。

当涉及到组策略时,不支持手动编辑注册表:

注意:从 Chrome 28 开始,策略直接从 Windows 上的组策略 API 加载。手动写入注册表的策略将被忽略。有关详细信息,请参阅http://crbug.com/259236

从 Google Chrome 35 开始,如果工作站加入 Active Directory 域,则直接从注册表读取策略;否则从 GPO 读取策略。

来源:政策清单 - Chromium 项目

这可以通过Process Monitor确认。无论是有意还是无意,都有一些例外:

HKEY_CURRENT_USER\Software\Policies\Google\Chrome\MetricsReportingEnabled
HKEY_CURRENT_USER\Software\Policies\Google\Chrome\UserDataDir
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome\MetricsReportingEnabled
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome\UserDataDir
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Update\Update{8A69D345-D564-463c-AFF1-A69D9E530F96}
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Update\UpdateDefault
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Policies\Google\Chrome\MetricsReportingEnabled
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Policies\Google\Chrome\UserDataDir
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Policies\Google\Update\Update{8A69D345-D564-463c-AFF1-A69D9E530F96}
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Policies\Google\Update\UpdateDefault
Run Code Online (Sandbox Code Playgroud)

除了主要的 HTTP 缓存之外,Chrome 还使用其他可能占用额外空间的文件夹:

可以使用开关或通过启用相关策略设置将媒体缓存限制为固定数量的字节。您无法真正限制应用程序缓存或 GPU 着色器缓存;您可以通过开关禁用它们。没有办法调整其余部分。

进一步阅读


测试缓存限制

这是我在运行以下测试之前遵循的程序:

  1. 安装 Chrome。
  2. 确保Cache存储文件夹的卷具有超过 32 GiB 的可用空间。
  3. 将主页设置about:blank为防止启动时出现脏缓存。
  4. 一开始就清除所有缓存的图像和文件。
  5. 关闭浏览器。

显示的所有结果均针对34.0.1847.137在 Windows 7 SP1 x86(32 位)上运行的Chrome 版本。每次测试前都会清空缓存,使用最新版本的 Chrome 时缓存行为没有明显差异。

批处理脚本

为了自动化测试,我创建了一个批处理脚本:

@echo off
setlocal
setlocal enabledelayedexpansion

set exePath=%localappdata%\Google\Chrome\Application

if not "%~1" == "" (
start "%~n0" /d "%exePath%" "chrome.exe" "%~1"
pause >nul
)

pushd "%~dp0"
set /a counter=1

for /f "usebackq" %%G in (`findstr /i "^https*://" "samples.txt"`) do (
echo Load sample !counter!
start "%~n0" /d "%exePath%" "chrome.exe" "%%~G"
set /a counter += 1
pause >nul
)

popd
endlocal
pause & exit /b
Run Code Online (Sandbox Code Playgroud)

它只有一个参数,用于使用特定标志启动 Chrome。该脚本解析一个samples.txt文件,收集所有 URL 并一次打开一个。当每个样本完成加载和渲染后,按任意键加载下一个。可能需要调整可执行路径。

测试 A1

测试的目标是检查最大缓存大小是否是真正的边界。证明这一点的最快方法是加载一些图像填充的网站:只要有足够的内容,您应该很快达到缓存限制。

旗帜

没有任何

样品

http://www.tumblr.com/search/gif+1
http://www.tumblr.com/search/gif+2
http://www.tumblr.com/search/gif+3
http://www.tumblr.com/search/gif+4
http://www.tumblr.com/search/gif+5
http://www.tumblr.com/search/gif+6
http://www.tumblr.com/search/gif+7
http://www.tumblr.com/search/gif+8
Run Code Online (Sandbox Code Playgroud)

结果

加载数百个文件后,缓存大小为334128469字节(约 318.65 MiB)。修剪计数器设置为0x15c,这意味着丢弃了 300 多个最旧的条目,以便为新条目腾出空间。

Cache type: Blockfile Cache
Create error: 0x0
Create hit: 0xa8
Create miss: 0x0
Current size: 334128469
Doom cache: 0x0
Doom entry: 0x3c
Doom recent entries: 0x0
Entries: 833
Fatal error: 0x0
Get rankings: 0x0
Invalid entry: 0x0
Last report: 0x2e5b3bec502446
Last report timer: 0x0
Max entries: 0x1a
Max size: 335544320
Open entries: 0x9
Open hit: 0x34
Open miss: 0xad
Open rankings: 0x39c68
Pending IO: 0
Read data: 0x4db
Resurrect hit: 0x2
Size00: 0x0000052f
Size01: 0x00000005
Size02: 0x00000017
Size03: 0x00000014
Size04: 0x00000002
Size05: 0x00000001
Size06: 0x00000004
Size07: 0x00000005
Size08: 0x00000002
Size09: 0x00000003
Size10: 0x00000004
Size11: 0x00000009
Size12: 0x0000001a
Size13: 0x00000019
Size14: 0x00000012
Size15: 0x00000006
Size16: 0x00000020
Size17: 0x00000013
Size18: 0x00000012
Size19: 0x00000032
Size20: 0x00000074
Size21: 0x00000083
Size22: 0x00000000
Size23: 0x00000000
Size24: 0x00000000
Size25: 0x00000000
Size26: 0x00000000
Size27: 0x00000000
Timer: 0xe
Trim entry: 0x15c
Write data: 0x4c171
unused: 0x0
Run Code Online (Sandbox Code Playgroud)

测试 A2

就像测试 A1 一样,有一点不同:缓存限制为 32 MiB。

旗帜

--disk-cache-size=33554432
Run Code Online (Sandbox Code Playgroud)

样品

与测试 A1 相同。

结果

缓存达到了大约 31.74 MiB 的总大小。与测试 A1 相比,更严格的限制产生的缓存条目肯定更少,而丢弃的条目更多。

Cache type: Blockfile Cache
Create error: 0x0
Create hit: 0xb6
Create miss: 0x0
Current size: 33280014
Doom cache: 0x0
Doom entry: 0x2f5
Doom recent entries: 0x0
Entries: 139
Fatal error: 0x0
Get rankings: 0x0
Invalid entry: 0x0
Last report: 0x2e5b3c19894813
Last report timer: 0x0
Max entries: 0x18
Max size: 33554432
Open entries: 0x9
Open hit: 0x4f
Open miss: 0xb9
Open rankings: 0x34e76
Pending IO: 0
Read data: 0x4d6
Resurrect hit: 0x1
Size00: 0x000000e5
Size01: 0x00000005
Size02: 0x00000010
Size03: 0x00000006
Size04: 0x00000000
Size05: 0x00000001
Size06: 0x00000003
Size07: 0x00000003
Size08: 0x00000001
Size09: 0x00000002
Size10: 0x00000002
Size11: 0x00000000
Size12: 0x00000002
Size13: 0x00000003
Size14: 0x00000001
Size15: 0x00000002
Size16: 0x00000006
Size17: 0x00000008
Size18: 0x00000002
Size19: 0x00000006
Size20: 0x00000010
Size21: 0x0000000a
Size22: 0x00000000
Size23: 0x00000000
Size24: 0x00000000
Size25: 0x00000000
Size26: 0x00000000
Size27: 0x00000000
Timer: 0xe
Trim entry: 0x2fc
Write data: 0x4239f
unused: 0x0
Run Code Online (Sandbox Code Playgroud)

测试 B1

在将缓存缩小到 32 MiB 的同时,加载了五个图像样本。它们的大小范围从 16 MiB 到 1 MiB,每次减半,减去 0.5% 以考虑舍入误差。例如,要搜索 15.92 MiB 图像,我使用了以下搜索查询:

jpeg "file size 15.92 mb" site:wikimedia.org
Run Code Online (Sandbox Code Playgroud)

由于缓存设置为 32 MiB,因此每个条目限制为 4 MiB。

旗帜

--disk-cache-size=33554432
Run Code Online (Sandbox Code Playgroud)

样品

http://upload.wikimedia.org/wikipedia/commons/b/ba/Langesund_og_Lang%C3%B8ya_01.jpg
http://upload.wikimedia.org/wikipedia/commons/9/9d/Balloons_of_Happiness.jpg
http://upload.wikimedia.org/wikipedia/commons/1/1e/Kannonzaki_01.jpg
http://upload.wikimedia.org/wikipedia/commons/5/51/Fraser_Ship_Yard_tug_boat%3B_Superior_WI_-b.jpg
http://upload.wikimedia.org/wikipedia/commons/4/46/Val%C3%A8ncia_micalet.jpg
Run Code Online (Sandbox Code Playgroud)

结果

在五个样本中,只有三个被实际缓存。

Cache type: Blockfile Cache
Create error: 0x0
Create hit: 0x5
Create miss: 0x0
Current size: 7305845
Doom cache: 0x0
Doom entry: 0x2
Doom recent entries: 0x0
Entries: 3
Fatal error: 0x0
Get rankings: 0x0
Invalid entry: 0x0
Last report: 0x2e5b3c78282e93
Last report timer: 0x0
Max entries: 0x0
Max size: 33554432
Open entries: 0x0
Open hit: 0x0
Open miss: 0x5
Open rankings: 0xa
Pending IO: 0
Read data: 0x0
Resurrect hit: 0x0
Size00: 0x00000006
Size01: 0x00000000
Size02: 0x00000000
Size03: 0x00000000
Size04: 0x00000000
Size05: 0x00000000
Size06: 0x00000000
Size07: 0x00000000
Size08: 0x00000000
Size09: 0x00000000
Size10: 0x00000000
Size11: 0x00000000
Size12: 0x00000000
Size13: 0x00000000
Size14: 0x00000000
Size15: 0x00000000
Size16: 0x00000000
Size17: 0x00000000
Size18: 0x00000000
Size19: 0x00000000
Size20: 0x00000001
Size21: 0x00000001
Size22: 0x00000001
Size23: 0x00000002
Size24: 0x00000000
Size25: 0x00000000
Size26: 0x00000000
Size27: 0x00000000
Timer: 0x1
Trim entry: 0x0
Write data: 0x1e74
unused: 0x0
Run Code Online (Sandbox Code Playgroud)

测试 B2

类似于没有缓存调整标志的测试 B1。

旗帜

没有任何

样品

与测试 B1 相同。

结果

与测试 B1 不同,所有五个样本都被缓存。缓存大小达到了大约 30.84 MiB,这是预期的数量。

Cache type: Blockfile Cache
Create error: 0x0
Create hit: 0x5
Create miss: 0x0
Current size: 32341906
Doom cache: 0x0
Doom entry: 0x0
Doom recent entries: 0x0
Entries: 5
Fatal error: 0x0
Get rankings: 0x0
Invalid entry: 0x0
Last report: 0x2e5b3c6aae7b97
Last report timer: 0x0
Max entries: 0x0
Max size: 335544320
Open entries: 0x0
Open hit: 0x0
Open miss: 0x5
Open rankings: 0x4
Pending IO: 0
Read data: 0x0
Resurrect hit: 0x0
Size00: 0x0000000a
Size01: 0x00000000
Size02: 0x00000000
Size03: 0x00000000
Size04: 0x00000000
Size05: 0x00000000
Size06: 0x00000000
Size07: 0x00000000
Size08: 0x00000000
Size09: 0x00000000
Size10: 0x00000000
Size11: 0x00000000
Size12: 0x00000000
Size13: 0x00000000
Size14: 0x00000000
Size15: 0x00000000
Size16: 0x00000000
Size17: 0x00000000
Size18: 0x00000000
Size19: 0x00000000
Size20: 0x00000001
Size21: 0x00000001
Size22: 0x00000001
Size23: 0x00000001
Size24: 0x00000001
Size25: 0x00000000
Size26: 0x00000000
Size27: 0x00000000
Timer: 0x1
Trim entry: 0x0
Write data: 0x2c6a
unused: 0x0
Run Code Online (Sandbox Code Playgroud)