我知道 Varnish 的使用内存映射在内存中缓存数据的技术,如果我在机器上执行以下命令,Varnish 的整体性能会受到什么影响吗?
例如
总内存大小 = 4GB,随机生成的 test.txt 虚拟文件 = 2GB
1. cat test.txt
2. mv test.txt /another-partition
3. cp test.txt /another-partition
4. mv test.txt /another-dir
5. cp test.txt /another-dir
答案1
有趣的问题!
作为参考,VM 子系统作者的这个页面将让您很好地了解可能发生的情况;
http://linux-mm.org/PageReplacementDesign
请注意,以目前的形式回答这个问题实际上非常困难(如果您正在谈论文件支持的缓存),因为它取决于缓存的热度、缓存项目的时间以及缓存中每个对象的“热度”。
假设如下:-
- 缓存由 10G 文件支持,并且已被完全填满。
- 缓存中 3% 的对象占所有命中的 90%。
- 在任何给定时间您都有大约 80 个可处理的并发连接。
- 您没有更改默认的 VM 策略。
- 在执行命令之前,页面缓存几乎完全被来自 varnish 缓存的页面填满。
- 500M 的数据专门分配给系统上运行的其他程序的匿名页面。
由于你的 varnish 缓存大小为 10G,它永远不会完全装入内存,因此以下公式具有相对代表性
- 有3500M的页面缓存。
- 最热的 1750Mb 清漆缓存位于“活动”列表中,并受到保护以免被页面缓存驱逐。
- 较冷的 1750Mb 清漆缓存位于“非活动”列表中,并且未受到驱逐保护。
- 最冷的 6500Mb 清漆缓存并不驻留在内存中,而是驻留在磁盘的某个地方。
因此以下是大概您运行的所有命令的结果..
- 该文件被放入内存并被缓存,但缓存中的所有新对象都默认被发送到“非活动”列表。
- 这将从 varnish 缓存中移除 1750MB 的“较冷/不活动”内存,并用 catted 文件替换它。
- 内核现在被迫将其中 1750M 的数据写回到磁盘(在绝对最坏的情况下)。
- 由于您正在读取 2G 文件并写出 1750M 文件,因此 IO 等待和设备利用率会受到影响。
- 97%的入站请求不会受到此影响,因为它们需要页面缓存活动部分中最热的 1750Mb varnish 数据!
- 3% 的不幸客户端希望将数据放在较冷的缓存中。这些客户端现在会遇到延迟,因为磁盘利用率已经很高,而且它们正在排队将页面重新取回页面缓存!由于 catted 文件从未足够快地重新读取,因此页面缓存会驱逐这些页面,转而支持 3% 的需要一些较冷数据的客户端。
这绝对是最糟糕的情况。那么,从广义上讲,这会产生什么影响呢?
对于您处理的 97% 的请求而言,这不会产生可忽略的影响。
在受影响的 3% 中,预计服务的延迟会更长——大概是 500 毫秒。
但在这 3% 的不顺利请求中,约有 2%反正速度会很慢,因为他们需要从 6500Mb 缓存中获取一些内容,而这些内容无论如何都不会出现在页面缓存中!然而,他们现在确实遭受着高磁盘利用率的困扰。
因此,总结一下我所设想的和假设的例子,你会大致看到效率损失了 3% 左右。(100% 的效率意味着每个请求的所有对象都从内存中提供)。
在这个虚构的例子中,‘正常’运行的性能效率大约为 98%。
对于无法装入内存的缓存来说,这还不错!
答案2
答案取决于您的缓存使用什么存储后端。
如果您已将 varnish 配置为使用基于文件的存储,则您的文件操作可能会对性能产生影响。
在具有 4 GB RAM 的专用系统上,我建议您使用大小约为 3 GB 的“malloc”作为缓存存储空间。
看:https://www.varnish-cache.org/docs/trunk/users-guide/storage-backends.html