答案1
线程数
您看到的htop
是清漆花纹,而不是清漆工艺。
Varnish 只有 2 个长时间运行的进程:
- 主进程(用户拥有
varnish
) - 工作进程(由
vcache
用户拥有)
你之所以会看到这么多,是因为 Varnish 希望系统有足够的响应能力来处理流量高峰。创建新线程在资源方面是昂贵的,并且会减慢系统速度。
这就是为什么 Varnish 默认有 2 个线程池,每个线程池包含 100 个线程。随着需求的增长,Varnish 可以将其扩展到每个线程池 5000 个线程。
thread_pool_min
这些数字可通过和运行时设置进行配置thread_pool_max
。
最少 200 个线程处于活动状态,最多 10000 个。
您可以通过以下方式查看这些值:
varnishadm param.show thread_pool_min
varnishadm param.show thread_pool_max
如果您想更改默认值,可以使用 add-p thread_pool_min=x
和-p thread_pool_max=x
到流程中。varnishd
不要忘记这些值适用于每个线程池,并且由于有 2 个线程池,因此最小值和最大值将乘以 2。
如果运行varnishstat -f MAIN.threads
,您将看到当前活动线程的数量。
记忆
Varnish 的内存消耗部分取决于缓存中的对象,部分取决于工作线程内的活动。
对象存储
-s
运行时参数限制varnishd
对象缓存的大小。但是,还有一个未绑定的临时存储,用于存储短暂的内容并临时托管不可缓存的数据。
以下命令将允许您监视对象和临时存储
varnishstat -f "SMA.*.g_bytes" -f "SMA.*.g_space"
SMA.s0.g_bytes
监视正在使用的对象内存量SMA.s0.g_space
监视对象存储中剩余的空间量SMA.Transient.g_bytes
监视正在使用的瞬时内存存储量SMA.Transient.g_space
监视可用的瞬时内存存储量。大多数时候这应该为零,因为默认情况下瞬态存储是无限的
缓存中的每个对象在内存消耗方面也有一些开销。这个相当小,但是缓存中的对象数量越多,开销就越大。
以下命令允许您确定缓存中的对象数量:
varnishstat -f MAIN.n_object
工作区内存
线程也会消耗内存。每个线程都有可用于跟踪状态的工作区内存:
- 这客户工作区被设定为64KB每个线程,由处理客户端请求的工作线程使用
- 这后端工作区用于参与后端连接的工作线程。每个线程也可以消耗64KB每个线程
- 这会话工作区用于存储TCP会话信息。这些中的每一个
以下命令可用于显示每个工作线程类型的工作区限制:
varnishadm param.show workspace_client
varnishadm param.show workspace_backend
varnishadm param.show workspace_session
堆栈空间
每个工作线程也可以消耗堆栈空间。这是 Varnish 所依赖的库使用的。每个线程的默认限制是48KB。
以下命令允许您检查系统上的限制:
varnishadm param.show thread_pool_stack
结论
清漆缓存,开源版本的Varnish无法限制自己的总内存占用。您可以限制对象存储。您还可以限制临时存储的大小,但这可能会导致一些恼人的副作用。
它基本上取决于缓存的大小、瞬时存储和流量模式。
清漆企业能够限制总内存占用。这是 Varnish 的商业版本,它提供了一个专有的存储引擎,称为MSE(海量存储引擎)。
均方误差有一个功能叫做内存管理器它考虑了对象存储、瞬态存储、工作区内存和堆栈空间。如果出现不平衡的情况,均方误差将缩小缓存的大小以满足额外的内存需求。