清漆重复处理170一次

清漆重复处理170一次

我正在使用 nginx + 清漆。我注意到我有 ~ 22GB / 32GB 正在使用。

我查看了 htop,发现大约有 170 个重复的清漆流程。告诉我可能是什么问题?从哪里开始寻找?

在此输入图像描述

答案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(海量存储引擎)

均方误差有一个功能叫做内存管理器它考虑了对象存储、瞬态存储、工作区内存和堆栈空间。如果出现不平衡的情况,均方误差将缩小缓存的大小以满足额外的内存需求。

相关内容