目录

简介

先决条件

要求

使用的组件

背景信息

网关提示缓存注意事项

如何确定网关是否正确缓存

计算FreshTime

删除过时的缓存条目

MaxStale

音频提示加载命令

日期时间

简介

本文档介绍媒体文件的语音可扩展标记语言(VXML)/客户语音门户(CVP)超文本传输协议(HTTP)缓存。

先决条件

要求

Cisco 建议您了解以下主题：

- VXML网关

- CVP

使用的组件

本文档不限于特定的软件和硬件版本。

本文档中的信息都是基于特定实验室环境中的设备编写的。本文档中使用的所有设备最初均采用原始（默认）配置。如果您使用的是真实网络，请确保您已经了解所有命令的潜在影响。

背景信息

在HTTP客户端缓存中，存储媒体文件涉及两种类型的缓存：

1. IVR媒体播放器缓存和

2. HTTP客户端缓存

服务器缓存设置会覆盖HTTP客户端设置，这些参数通过http消息报头或vxml应用脚本从服务器发送。

网关提示缓存注意事项

步骤1.当音频提示存储在HTTP媒体服务器上时，需要使用适当的网关提示缓存方法来优化网关性能和网络带宽消耗。如果完全禁用缓存，网关性能将降低约35-40%。

要在网关上配置缓存，请在网关上设置以下设置：

..ivr prompt memory 15000

..http client cache memory file 500

..http client cache memory pool 15000

注意：http客户端缓存内存文件表示可缓存的最大大小提示文件（以KB为单位）。通常，超过50万（大约一分钟）的客户提示必须分成更小、更易管理的片段，以便于加载和缓存。例如，队列音乐可能是30秒提示的重复循环。另请注意，由于提示是流式处理的，因此除非播放整个提示，否则提示不会缓存。因此，建议您使提示的大小可管理。

步骤2.同步网关和HTTP媒体服务器之间的日期时间。

注意：同步不必精确，但至少在一两分钟内。未同步的时间可能导致提示永远无法刷新，或者提示会随每次呼叫而刷新，这两种情况都是不良行为。

步骤3.在媒体服务器上设置内容过期（例如15分钟）。

注意：在IIS中，此操作在HTTP报头选项卡下完成。网关提示在此时间段后刷新。选择的时段必须反映重新记录提示的频率以及修改后您愿意等待新提示加载的时间。

步骤4.导航至“程序”>“管理工具”>“IIS管理器”。

步骤5.导航至要修改的.wav文件。

步骤6.然后，右键单击>属性> HTTP报头

步骤7.启用内容过期。

如何确定网关是否正确缓存

要确定是否正确配置了网关缓存，请遵循以下步骤：

每次客户端请求提示时，媒体服务器上的IIS日志都会记录。如果缓存设置正确，则这些请求大约每X分钟（X是步骤3中定义的刷新间隔）出现一次。日志位于：C:\WINNT\system32\LogFiles\W3SVC1\ex*

或者,

在网关上运行show http client cache。“刷新时间”列必须等于HTTP媒体服务器上设置的刷新时间段。

例如，如果刷新周期设置为15分钟，则这必须表示900秒。Age列显示自上次刷新提示符后已经过的秒数。通常，此数字小于“新鲜时间”。但是，如果最近没有呼叫访问过提示符，则此号码可能大于新呼叫时间。仅当由呼叫触发且提示“新鲜时间”已过期时，才会刷新提示。如果Fresh Time值非常高，则从缓存中删除提示符（隐藏命令除外）的唯一方法是重新加载网关。

仅通过IIS将报头添加为实际HTTP报头就容易多了。

这可以通过IIS 6或7完成。

http://weblogs.asp.net/joelvarty/archive/2009/03/23/force-ie7-compatibility-mode-in-ie8-with-iis-settings.aspx

计算FreshTime

有几个变量会影响文件的FreshTime，例如：服务器的http消息报头，以及通过CLI配置的缓存刷新值等。

那么，您如何知道文件使用哪个值来实现其FreshTime?文件的FreshTime按以下优先顺序确定：

1.从http服务器下载文件时，如果其中一个http消息报头包含以下内容：

Cache-Control: max-age = <value in seconds>

然后，将<value in seconds>用作此文件的FreshTime。

2.如果(1)不存在，但http消息中包含以下两个报头：

Expires: <expiration date time>

Date: <Current date time>

然后，差值<到期日期时间> - <当前日期时间>用作此文件的FreshTime。

3. HTTP/1.1规范RFC 2616(HTTP)建议存在(1)或(2)中所述的http消息报头。  如果服务器在其http响应中无法同时发送(1)或(2)，则可以从消息报头中获取日期和上次修改时间之差的10%:

Last-Modified: <last-modified date time>

Date: <Current date time>

因此，此文件的FreshTime计算为：

FreshTime = 10% x ((Last-Modified) - (Date))

4.最后，此时缓存刷新配置CLI开始运行。CLI允许用户将启发式FreshTime值作为临时值分配给文件，以防出现上述(1)-(3)消息报头。

c5400-02(config)#http client cache refresh ?

<1-864000>           Time value in seconds

默认刷新值为86400秒（24小时）。

注意：当存在任何消息报头(1)-(3)时，配置的http客户端缓存刷新对文件没有影响。

注意：此CLI（如果有效）不具有追溯力。即，新配置的刷新值仅适用于新的传入文件。它对缓存中已有的条目没有影响。

删除过时的缓存条目

注意：路由器不会自动刷新任何过时文件。

过期文件仅根据需要刷新。为什么路由器会花费其宝贵的CPU周期来更新缓存中的文件，而不知道这些文件是否或何时将被使用，而CPU需要用于其他紧急服务？

这意味着旧缓存条目可以在缓存中保留很长时间，直到删除该条目为同一文件的新副本或只需要其内存空间的另一个文件腾出空间。有时，如果旧缓存条目的期限未超过应用程序指定的MaxStale值，则该条目仍然可用。

简而言之，可以通过以下简单比较来计算缓存条目是否过时或是否仍然可用：

-        file is fresh                                    if FreshTime > Age

-        file is stale but still usable         if (FreshTime + MaxStale) > Age

-        file is stale and not usable         if (FreshTime + MaxStale) <= Age

MaxStale

表示客户端愿意接受超过其到期时间的响应。如果为max-stale分配了值，则客户端愿意接受超过其过期时间不超过指定秒数的响应。如果没有为max-stale分配值，则客户端愿意接受任何年龄的过时响应。

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

如前所述，在以下情况下，其所有者会根据需要删除过时的缓存条目：

缓存的条目已过时；和

其引用计数为零(0)，即没有人使用此缓存条目；和

需要其内存空间来为其他条目腾出空间

这意味着http客户端和IVR媒体播放器必须以这种方式在非流模式和流模式中分别管理和控制其缓存条目。如果http客户端需要清理一些陈旧条目以重新获得缓存内存池中的空间，但它不是这些文件的所有者，会如何？  这成为http客户端缓存后台管理器的职责。

http客户端缓存后台管理器每5分钟唤醒一次。如果用于缓存条目的总内存超过已配置缓存内存池大小的70%阈值，老化器将浏览每个缓存条目。如果这个条目还是新鲜的，那就不用再管了。如果条目已过时且没有对其的引用，即ref计数= 0，则http客户端会自行删除该条目，因为它是该条目的合法所有者。如果过时条目上有引用计数1，并且没有父项或子项链接到该条目，则http客户端将回叫以通知Media Player释放此过时条目。

音频提示加载命令

有时，可能需要或需要手动将音频文件下载到路由器。现在，我们已经被告知路由器不会自动转到http服务器来刷新过时的缓存条目。这些条目仅在需要时刷新。  手动下载可以解决此问题。

手动下载的另一个可能有用的场景是在非流模式下预加载大型音频提示。这可以在收到第一个呼叫之前完成，这样主叫方就不会遇到任何加载提示的延迟。

要手动下载特定音频文件，请运行以下CLI命令：

audio-prompt load <url>

<url>是音频文件驻留在服务器上的位置。当然，http客户端缓存应正确配置以将此文件保存到缓存中。

注意：如果<url>是活动提示，即当前正在播放，则此CLI不会生效。

日期时间

此外，确保网关和HTTP媒体服务器之间的日期时间已同步。这是必须的。

警告：请勿在VXML GW中使用清除http客户端缓存。如果此命令在负载非常高/活动的VXML GW上调用，则已知会导致问题、内存损坏和崩溃。基本上，不建议使用clear ip http client cache all。它会刷新缓存中的所有条目，然后会创建并删除缓存链接列表中的节点，从而导致一些问题。该命令正在从Cisco IOS®中删除中。建议的命令是set http client cache stale，此命令的作用是刷新缓存中新更改的部分。