架构师日记——Varnish的性能调优

Varnish的性能调优分成两个部分

1.一个是硬件、操作系统和网络部分的优化
2.另外一个,也是最重要的一个,就是VCL的调优
要进行硬件、操作系统和网络部分的优化,了解Varnish的进程和线程架构是有必要的,他们能帮助你更好的去调整优化,以及整合应用系统。

Varnish的进程架构图

这里写图片描述

  • 管理进程(The management process)
    Varnish主要有两个进程,管理进程和子进程,管理进程负责:管理配置的变更(包括VCL和参数)、编译VCL、监控Varnish运行、初始化Varnish,以及提供命令行接口等。管理进程会每隔几秒钟检查一下子进程,如果发现子进程挂了,会kill掉然后重新启动一个。这些操作都会记录在日志里面,以利于你检查错误。
  • 子进程(The child process)
    子进程包括几个不同类型的线程,包括但不限于:
    1:Acceptor线程:接受新的连接并代表它们
    2:Worker线程:一个会话一个线程,通常会使用数百个Worker线程
    3:Expiry线程:负责从缓存中清除旧的内容
  • 工作区(Workspace)
    Varnish使用Workspace来减少多个线程间对于内存的竞争。Varnish有多个工作区,最重
    要的是session workspace,它通常用来操作会话数据。比如:修改www.example.com到example.com,以减少重复缓存。
    就算你的Session工作区有5G,使用了1000个线程,但实际使用的内存容量不会这么多,虚拟内存会是5个G,但是实际的内存是根据你实际的使用来的,内存控制器和操作系统会帮你管理内存,这个不用担心
  • 和系统的通讯,子进程会使用共享内存日志访问文件系统,这意味着,如果一个线程需要记录日志,它只需要获得锁,然后写入内存,然后释放锁就可以了。另外每个线程都有一份日志数据的缓存,以减少锁的竞争
  • 日志数据通常为80M,分成两个部分,第一个部分是计数器,第二个部分是请求数据。你可以使用日志工具来查看共享内存日志,因为日志记录并不会是原始的格式。
  • 对于储存类型,如果不需要永久保持缓存的话,建议使用malloc,如果要永久保存,或者是要缓存的内容超过了物理内存的大小,那么使用file。
    另外一个要注意:缓存对象会有额外的开销,以保持对缓存的追踪,大概一个对象需要1k的额外开销,这也意味着,最终使用的内存会比你通过-s指定的内存大小要大一些。
  • 通常对硬件、操作系统和网络部分的优化,主要就是相关参数的优化。参数调优的方法:
    通常是在CLI界面去调整,然后测试,如果ok的话,就把它们配置到配置文件里面去

线程模式

子进程是Varnish真正产生奇迹的地方,它包含一系列的线程来执行不同的任务,下面罗列几个常见的:
1.cache-worker:每个连接一个,负责处理请求
2.cache-main:一个,负责启动
3.ban lurker:一个,负责禁用的处理
4.acceptor:一个,负责接受新的连接
5.epoll/kqueue:可配置,缺省是2个,管理线程池
6.expire:一个,负责删除过期内容
7.backend poll:一个backend poll一个线程,用于健康检查
通常我们只需要配置cache-worker线程数,其他的线程可以不用管。
调整Varnish的时候,需要考虑预期的流量,线程模型允许你使用多个线程池,但时间和经验表明,只要你有2个线程池就够了,加入更多也不会提高性能。一些旧的资料会建议你一个cpu核运行一个线程池,这个已经过时了,现在只要2个就够了。
线程池相关的参数,前面已经都讲过了,最重要的是thread_pool_min和thread_pool_max。通常保持最少在500-1000个线程都是合适的,具体的可以根据varnishstat来查看n_wrk_queued,根据具体情况来配置

线程growth时间
Varnish能支持数千个线程同时运行,但并不是所有的操作系统内核都能支撑,因此使用thread_pool_add_delay来保证每个线程间有一点延迟,现在已经不重要了,操作系统都比较成熟了,一般从20ms到2s

系统级参数
随着Varnish越来越成熟,越来越少的参数需要调整了。sess_workspace是一个要调整的重要参数,它设置的是从客户端传入的Http 头的workspace大小:
1:通常这个值从缺省的65536字节到10M
2:要注意,它是虚拟的内存,不是实际使用的内存

另外一些可调优的参数就是各种时间,如:
connect_timeout、first_byte_timeout、between_bytes_timeout、send_timeout、sess_timeout、cli_timeout
通常情况下,默认的数值能满足大多数应用的需要,但你还是需要结合实际的应用进行调整。比如connect_timeout,默认是0.7秒,如果Varnish和backend是通过远程来连接和访问,这个时间可能就需要延长。

猜你喜欢

转载自blog.csdn.net/qq_32198277/article/details/77043618