Memcached的一些坑!!!

标签: django   Memcached  

我们的网站用django跑了很久了,一直没出现什么大的问题,突然一天晚上网站访问超级慢,出现大量的502错误码,难不成用户量猛增么,要是这样就好了。请教了很多运维高手帮忙排查问题、代码也回滚到上一个正常运行的版本了,但依然负载一会高一会低。

捣腾了一天,最后定位到我们的代码有问题,有几个经常访问的API缓存了15分钟,经过分析发现其中一个API始终缓存不上,但在本地和测试环境都是没有问题的,这真是搞死人啊。后面发现这个API的请求的数据非常之大,接近2M了。而Memcache有很多限制,其中就有value值大小的限制,终于找到问题了,泪牛满面啊……

原因

下面是Memcached一些特性和限制:

  • 在Memcached中可以保存的item数据量是没有限制的,只有内存足够
  • Memcached单进程最大使用内存为2G,要使用更多内存,可以分多个端口开启多个Memcached进程
  • 最大30天的数据过期时间,设置为永久的也会在这个时间过期,常量REALTIME_MAXDELTA,60*60*24*30控制
  • 最大键长为250字节,大于该长度无法存储,常量KEY_MAX_LENGTH 250控制,不过可以更改源码进行设置
  • 单个item最大数据是1MB,超过1MB数据不予存储,常量POWER_BLOCK 1048576进行控制,它是默认的slab大小,不过可以在启动的时候启添加-I 10m参数就可以,最大能支持到128M
  • 最大同时连接数是200,通过conn_init()中的freetotal进行控制,最大软连接数是1024,通过settings.maxconns=1024 进行控制
  • 跟空间占用相关的参数:settings.factor=1.25, settings.chunk_size=48, 影响slab的数据占用和步进方式
  • memcached是一种无阻塞的socket通信方式服务,基于libevent库,由于无阻塞通信,对内存读写速度非常之快。
  • memcached分服务器端和客户端,可以配置多个服务器端和客户端,应用于分布式的服务非常广泛。
  • memcached作为小规模的数据分布式平台是十分有效果的。

解决方法

找到了问题所在,当然就得解决了,这里当然可以像上面说的调整单个item的最大数据,比如调整到10m,这种解决办法固然能够解决问题,但显然不是最优的办法,最优的办法就是优化数据查询方法,限定查询数据结果大小。最后我们是将数据结果集进行了优化,使结果大小小于1m,后面有时间应该要优化下数据库查询这块。

其它

memcached本身的服务是用C语言编写的,启动非常简单:

  • memcached -d -m 2048 -l 10.0.0.40 -p 11211
  • -d表示memcached启动作为一个守护进程;
  • -m表示启用多大的内存支持,这里的单位是兆(M),2048表示2个G的内存
  • -l表示服务的IP地址,最好不要写成localhost
  • -p表示服务的端口,默认为11211

「真诚赞赏,手留余香」

阳明

请我喝杯咖啡?

使用微信扫描二维码完成支付

相关文章