memcached减缓了网站的速度

时间:2012-01-05 04:31:42

标签: django memcached

我有一个由nginx和django提供服务的网站。

我的staging.py正确包含CACHE和中间件设置。您可以查看nginx.confnginx conf file related to the site。我已确认memcached正在运行ngrep -d any port 11211

我开启了整个网站的缓存,希望通过ab -n 1000 -c 10 http://site.com

来查看效果

缓存关闭,我得到:

Concurrency Level:      10
Time taken for tests:   10.276 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      11695000 bytes
HTML transferred:       11559000 bytes
Requests per second:    97.32 [#/sec] (mean)
Time per request:       102.759 [ms] (mean)
Time per request:       10.276 [ms] (mean, across all concurrent requests)
Transfer rate:          1111.43 [Kbytes/sec] received

启用缓存后,我得到:

Concurrency Level:      10
Time taken for tests:   12.277 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      11695000 bytes
HTML transferred:       11559000 bytes
Requests per second:    81.45 [#/sec] (mean)
Time per request:       122.771 [ms] (mean)
Time per request:       12.277 [ms] (mean, across all concurrent requests)
Transfer rate:          930.26 [Kbytes/sec] received

我的网站是一个从数据库中提取帖子的博客 - 没有异国情调。

如果有人能让我知道为什么该网站实际上正在放慢使用memcached,我将不胜感激。您可以看到,当我使用memcached时,“每秒请求数”实际上会下降!

然而,当我跑ab时,running memcached-top给了我no hits(虽然测试期间读写计数器上升了)。我有memory available,memcached是not hogging内存。

修改
我跑了memcached -vv并获得some results。你可以看到memcached第一次打印出“STORED”,然后似乎没有从缓存中发送它(不确定)。现在我更加困惑。也许memcached& django接口正在工作,但最终的结果是最好不要运行memcached?

1 个答案:

答案 0 :(得分:1)

Trewq,很多不同的事情可能会出错。你说你的机器没有分页,但即使memcache存储结果,获取请求也不会回来。

我的理论:太短暂的时间,糟糕的驱动程序,以及可能错误的CPU拱门(x86 vs _64)

超时

通常在-vv输出(可能是-vvv)中,SET行将具有命令,键,值和超时等语法。非常小的超时可能是memcache存储的问题,然后几乎立即刷新值。

<命令名称> <键> <标志> < exptime> <字节> [noreply] \ r \ n - https://github.com/memcached/memcached/blob/master/doc/protocol.txt

驱动程序

此外,您使用的memcache驱动程序/ api可能存在问题,因为mc永远不会阻塞那么久。您可以在执行bechmark运行之前和之后通过执行此类http://code.google.com/p/memcached/wiki/NewConfiguringServer#Inspecting_Running_Configuration之类的操作来检查您的memcache服务状态。

密钥审核

前段时间我在这个问题Setting smaller buffer size for sys.stdin?中编写了脚本,以审核memcache -vv的输出,以了解GET对SET的平衡性。已经有一段时间了,但我相信它可能会对你有所帮助。

在wiki中没有提到stat,但是有一些统计值可以帮助你弄清楚你的缓存是否平衡 - https://github.com/memcached/memcached/blob/master/doc/protocol.txt#L409

超级理想是9/10请求命中1次未命中,现实更可能是6/10命中请求,任何低于60%的任何内容都在浪费记忆。