【问题标题】:Tomcat static cache "cacheTtl"Tomcat 静态缓存“cacheTtl”
【发布时间】:2021-11-03 08:08:56
【问题描述】:

谁能给我更多关于 Tomcat 静态缓存中使用的“cacheTtl”的详细信息?我在documentation 中看到它被提及

重新验证缓存条目之间的时间量(以毫秒为单位)。如果未指定,则默认值为 5000(5 秒)。

“缓存条目的重新验证”究竟是什么意思?如果我有太多缓存资源,这会影响我的应用程序的性能吗?

提前致谢!

【问题讨论】:

    标签: tomcat caching


    【解决方案1】:

    “重新验证” 只是意味着再次从磁盘读取。因此,如果客户端请求静态资源:

    • 如果资源在小于cacheTtl秒前被读取,则将返回缓存在Java堆内存中的数据,
    • 如果资源在cacheTtl 秒前被读取,Tomcat 将再次从磁盘读取数据(并缓存)。

    由于内存访问比磁盘访问快一个数量级(参见this question),如果缓存未满,则更长的 TTL 意味着更好的性能。当缓存变满时(超过 90% 的容量),Tomcat 可以在缓存条目达到其 TTL 之前驱逐它们。

    然而,Tomcat 缓存对性能的真正影响要复杂得多,因为:

    • 现代操作系统自己缓存打开的文件(使用应用程序不使用的 RAM),因此 “磁盘读取” 实际上可能几乎与 “堆内存读取”一样快。减少 Tomcat 的内存有时可能会提高性能,
    • 现代操作系统有一个sendfile 系统调用:如果您想按原样将文件返回给客户端,操作系统可以为您完成(比 Java 代码快得多)。对于大于 48 KiB 的文件,Tomcat 的 DefaultServlet 默认使用 sendfile(参见 documentation)。没有必要缓存比这更大的文件。

    【讨论】: