我试图在Drupal前面configurationVarnish,并且只是运行一些快速的Apache Benchtesting来看看我得到了什么样的改进。
我运行的具体的ab命令是: ab -n 15000 -c 300 -k -H 'Accept-Encoding: gzip,deflate' www.mysite.tld/some-page
一旦我设置的并发性高于300左右,我开始看到一个真正的长尾巴结果:
Percentage of the requests served within a certain time (ms) 50% 2 66% 4 75% 4 80% 5 90% 7 95% 19 98% 45 99% 246 100% 5016 (longest request)
随着并发性的增加,这个长尾变得越来越糟糕,但似乎总是发生在95%的连接之后(给予或带走)。
对于与c相同的ab命令,在500:
50% 1 66% 1 75% 1 80% 2 90% 5 95% 22 98% 365 99% 5060 100% 5061 (longest request)
对于c = 1000:
50% 1 66% 1 75% 2 80% 2 90% 5 95% 39 98% 5061 99% 27867 100% 27885 (longest request)
我已经改变了这些清漆设置:
thread_pool_add_delay 1 [milliseconds] thread_pool_max 5000 [threads] thread_pool_min 500 [threads]
清漆机器和我用来testing的机器都在同一个子域中,实际上都是同一个vmsphere上的虚拟机。 使用围攻显示了类似的模式。
为什么有这个长尾巴? 我怎样才能摆脱它?
编辑我看到这些消息在dmesg基准时:
[1469125.946204] TCP: Possible SYN flooding on port 80. Sending cookies. [1469203.735802] TCP: Possible SYN flooding on port 80. Sending cookies. [1469276.171367] TCP: Possible SYN flooding on port 80. Sending cookies.
而且我会经常看到有趣的东西:
$ netstat -ant | grep 80 | awk '{print $6}' | sort | uniq -c | sort -n 1 TIME_WAIT 2 LISTEN 257 ESTABLISHED 437 CLOSE_WAIT
基准testing中,通常会通过请求0-13500,然后非常缓慢,有时会达到15000.如果不成功,那么连接会转到CLOSE_WAIT–可能是因为Apache Bench超时了,所以套接字实际上并没有closures。 但是在等待的时候,通常会有一大堆的套接字在ESTABLISHED等待。
有没有什么事情发生在内核发回syn cookies,这是以某种方式让我的客户超时,然后再试一次?
编辑2
尽pipe在实践中这可能是一个可怕的想法,但我确实尝试禁用syn cookies:
sysctl -n net.ipv4.tcp_syncookies = 0
这提供了显着更好的结果 – 对于c = 1000,n = 25000,结果看起来实际上与c = 500相同,n = 15000以上。
但是,我也意识到,如果我服务3k个请求/秒,那么实际上我将接近达到我的出站networkingpipe道的极限。 所以,我可能会设置我的networking参数回到他们的默认值,而不是太担心我的基准testing结果。 但是我仍然很好奇a)为什么syn cookies会导致这种放缓,当两台机器都有大量的cpu时,b)为什么即使禁用了syn cookie,我仍然看到类似的结果,只是c和n的值更高。
我看不出你的基准testing结果有问题:
Percentage of the requests served within a certain time (ms) 50% 2 66% 4 75% 4 80% 5 90% 7 95% 19 98% 45 99% 246 100% 5016 (longest request)
这意味着所有请求中的90%(或15,000个请求中的13,500个)将在7ms内被服务。
我假设剩下的10%是已经传递到后端的请求(第一次命中或更新)。 如果一个请求必须传递给后端,那么你不需要对Varnish的性能进行基准testing,而是testing后端的性能(例如Apache&mod_php)。
这很可能是因为您根本不是基准清漆,而是在多台机器使用大量CPU时进行基准testing,例如CPU,操作系统的调度程序或线程模型,或虚拟化平台。 如果在几乎相同的硬件上运行,ab和varnish可能会争夺相同的资源。 清漆的作者之一有一个很好的关于基准清漆的写作,而ab很可能不是一个有用的工具: http : //kly.no/posts/2012_04_19_Testing_Varnish.html