zoukankan      html  css  js  c++  java
  • 云计算之路柳暗花明:为什么memcached会堵车

    这次网络堵车(请求执行时间长,响应速度慢)故障经过见之前的博文:云计算之路-黎明前的黑暗:20130424网站故障经过

    这次故障是memcached服务器引起的。这台云服务器购买时间是2013-02-21,操作系统是CentOS 6.2 64位,配置是1核CPU/4G内存。memcached软件用的是couchbase,版本是2.0.0 enterprise edition (build-1976)。memcached客户用的是EnyimMemcached,版本是2.12。

    如何确认是memcached服务器引起的?昨天17:00左右(还在访问高峰期),只要这台memcached云服务器一停运,问题立即消失;一启来,问题立即出现。

    这次故障与couchbase无关。依据是同样版本的couchbase安装到另一台云服务器(操作系统是CentOS 6.3 64位)上,问题没有出现。现在的memcached服务器就是这么跑的。

    我们来看看应用程序中对memcached的操作情况,使用memcached的地方都是这么操作的——根据key从memcached中取数据,如果取到,直接返回;如果取不到,从数据库中查询,将查询结果写入memcached,然后返回。示例代码如下:

    var entry = _cacher.GetData(cacheKey) as BlogEntry;
    if (entry == null)
    {
        //从数据库读取
        //...
        _cacher.Add(cacheKey, entry, 60);
    }
    return entry;

    而上面代码中 _cacher.GetData(cacheKey) 实际调用的是 Enyim.Caching.Memcache.MemcachedClient.Get() 方法。

    如果这里等待时间长,会造成大量处理请求的线程阻塞在这里(堵车),造成正在处理请求的得不到响应,后续的请求没有足够的线程可用。

    前天晚上(4月23日)我们已经采取了措施,以防这里存在可能的堵车问题,在web.config中修改了EnyimMemcached的设置,将connectionTimeout改为了1秒(默认是20秒)。

    <enyim.com>
        <memcached protocol="Binary">
            <servers>
                <add address="ip1" port="11211" />        
            </servers>
            <socketPool minPoolSize="20" maxPoolSize="200" connectionTimeout="00:00:01" deadTimeout="00:00:02" />
        </memcached>
    </enyim.com>

    也就是说,即使发生堵车现象,也只会等1秒,然后就绕到而行,直接去数据库取数据。

    但昨天发生故障时connectionTimeout没起作用,说明客户端已经正常连上了memcached服务器,问题不在客户端。

    与coubase无关,与memcached客户端无关,那就剩下两个怀疑对象:1. Linux操作系统(搬到阿里云之前,我们是在Windows上跑的Memcached);2. 虚拟机。

    这时,一个故障期间的重要现象闪现在眼前——当时memcached的磁盘IO高!

    memcached缓存的数据都在内存中,而且内存占用并不高,磁盘IO怎么会高?太奇怪了!

    。。。

    通过google搜索“memcached read timeout”,找到柳暗花明的线索——memcached timeout error because of slow response

    直接看关键文字:

    The problem seemed to boil down to the following:
    vm.swappiness=60 (default) is a very bad idea, when combined
    with deadline as a io scheduler.

    ...

    conclusion:
    if you use memcache and need high amounts of memory with
    many objects, keep a look at your swap, and if there is
    something in it (even 1 kb) - it might be too much.
    after setting vm.swappiness to zero and paging in all swap,
    the effects were gone.

     登上昨天引发故障的那台memcached服务器,运行命令:

    cat /proc/sys/vm/swappiness
    60

    输出结果是60!磁盘IO高就是内存交换引起的!memcached堵车的原因就在这!

    只要将swappiness设置为0,就能解决问题,设置方法参考:Adjust Your swappiness

    这是在去杭州的高铁上写博客时的意外收获,这篇博客就写到这,麻烦有经验的朋友帮忙解释一下swappiness=60为什么会引起这个问题?

  • 相关阅读:
    一个老博士的2015年终总结 (二)
    一个老博士的2015年终总结 (一) -- 偶然发现自己竟然在博客园发过帖子
    yolov3源码分析keras(二)损失函数计算
    yolov3源码分析keras(一)数据的处理
    [转载]HDMI on ZedBoard with Petalinux.
    基于zedBoard的手势识别及桌面操控系统_项目论文
    VGA显示SDRAM内容_1——DE1-SOC学习笔记(3)
    Avalon Slave外设简单实现——DE1-SOC学习笔记(2)
    Cyclone V 与 Avalon-MM资料整理——DE1-SOC学习笔记(1)
    ESP8266开发课堂之
  • 原文地址:https://www.cnblogs.com/cmt/p/3041555.html
Copyright © 2011-2022 走看看