Memcache异常超时诊断--mctop

昨天排查MC连接超时发现,发现同时是一个业务的另一个MC未发现异常,通过监控发现网络未丢包但两MC的流量明显不一致,在连接数基本相同的情况下带宽出现3倍的差别,可以断定是业务调用的某个key的value值过大导致的。

好吧,知道原因了该如何定位到哪个key呢?以下是一般的做法:

  1. 通过抓包发现调用的频繁的请求数据包;
  2. 通过MC协议分析是否该key值异常过大;

貌似你有点晕了,呵呵,这种方法是很繁琐,定位原因比较慢,有没有更好的方法呢?下面就介绍下mctop

mctop是开源的一个检测工具,依靠ruby的pcap进行抓包分析,该包下载地址 GITHUP https://github.com/etsy/mctop

解压执行下:

# ./mctop

/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require‘: no such file to load -- pcap (LoadError)

from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require‘

from ./../lib/cmdline.rb:2

from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require‘

from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require‘

from ./mctop:10

通过报错了解到,需要装pcap,但发现装完还是有问题,没办法升级下ruby吧,我现在是1.8.7升级至1.9.2下载地址后,需要安装以下组件

#/usr/local/bin/gem install bundle

#/usr/local/bin/gem install rake

#/usr/local/bin/gem install ruby-pcap

#rm -f /usr/bin/ruby

#ln -s /usr/local/bin/ruby  /usr/bin/ruby

再运行下

# ./mctop --help

Usage: mctop [options]

-i, --interface=NIC              Network interface to sniff (required)

--host=HOST                  Network host to sniff on (default all)

-p, --port=PORT                  Network port to sniff on (default 11211)

-d, --discard=THRESH             Discard keys with request/sec rate below THRESH

-r, --refresh=MS                 Refresh the stats display every MS milliseconds

-h, --help                       Show usage info

然后赶紧用它监控一下异常的端口:

#./mctop -i eth1 --host=10.x.x.85 -p xxx -r 1000

如下图

一眼就看到了,是esf-wordfilter__all的值过大占了4m/s的带宽,通知业务部门优化之~

总结:

mctop是一款很好的在线监控程序,同时也给了启发,可以根据这个做一套MC监控,好了,就这样吧~

时间: 2024-08-04 08:54:59

Memcache异常超时诊断--mctop的相关文章

SQL Server超时诊断和调优

SQL Server超时诊断和调优 一. 超时分析 下面是用户访问一个Web站点的常见错误: 详细错误描述如下: [SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.] System.Data.SqlClient.SqlConnection.OnError(SqlExc

SQL Server超时诊断

连接超时 对于连接超时,首先可以查看Connectivity Ring Buffer中的LoginTimers类型错误来分析,如果想获得更详尽的信息,再通过抓包工具network monitor. 具体方法和语句可参考以下文章: https://blogs.msdn.microsoft.com/apgcdsd/2011/11/20/ring-buffersql-server-2008/ http://ultrasql.blog.51cto.com/9591438/1583446 查询超时 对于查

新闻APP后端系统架构成长之路

前言:一年来从接受APP后端工作到现在可谓一路艰辛,中间踏过无数坑坑洼洼,也从中学到很多很多,之前领导也多次提醒,平时多总结.把经验形成系统,但平时大部分时间一直在忙于开发.处理问题,天天马不停蹄的往前走.眼看着春节将至,16年又过去了,业务有了很大发展,我们系统也愈加完善.之前一直也没有时间静下心来后头看看,眼下随着6.0版本开发上线完毕,稍得片刻喘息,自己也想想,也是时候回头看看.总结一下了. 1,初入圣地 2,筑基:完全重构 3,金丹:踩坑..而且是踩大坑 4,元婴:面临挑战,流量来袭 5

2016潭州SEO研究中心83期基础班+高级运营班

课程目录: 基础班4月5日优化前的准备工作与工具使用4月6日基础班:百度搜索引擎排名原理研究 4月7日零基础玩转博客网站的实战上半部份4月7日零基础玩转博客网站的实战下半部分4月8日VIP基础课:零基础手把手搭建企业网站上半部分课程4月8日VIP基础课:零基础手把手搭建企业网站建站下半部课程4月9日VIP基础课:网站代码的优化及网页修改4月11日VIP基础课:网站搬家之一:进行二次安装法4月11日VIP基础课:网站搬家之二:数据库还原法4月12日VIP基础课网站首页关键词的核心定位4月13日VI

setConnectTimeout无效果

在项目我碰到一个问题就是需要判断公网和专网,那么我是这么写一个方法的,方法代码如下: // 判断是否能够访问外网 public static boolean openUrl() { HttpURLConnection conn = null; String myString = ""; InputStream is = null; BufferedInputStream bis = null; try { URL url = new URL("http://www.baidu

Python 单向队列Queue模块详解

单向队列Queue,先进先出 '''A multi-producer, multi-consumer queue.''' try: import threading except ImportError: import dummy_threading as threading from collections import deque from heapq import heappush, heappop from time import monotonic as time __all__ =

nginx_access_log的409错误跟踪记录

查看nginx日志 tail -f **/nginx/access.log,发现 频繁出现"GET /core/modify/index HTTP/1.0" 499 0 "-" 查看日志,跟踪modify/index接口,发现该接口运行时间超过了60s,肯定是程序某个地方卡住了 查看php慢查询日志,频繁出现连接队列服务的时候超时 将队列服务注释,程序运行正常 这四个步骤,记录排查跟踪某个异常超时的环节.

Scrapy 框架理解

scrapy的架构图: 组件 Scrapy Engine 引擎负责控制数据流在系统中所有组件中流动,并在相应动作发生时触发事件. 调度器(Scheduler) 调度器从引擎接受request并将他们入队,以便之后引擎请求他们时提供给引擎. 下载器(Downloader) 下载器负责获取页面数据并提供给引擎,而后提供给spider. Spiders Spider是Scrapy用户编写用于分析response并提取item(即获取到的item)或额外跟进的URL的类. 每个spider负责处理一个特

源码分析---SOFARPC客户端服务调用

我们首先看看BoltClientProxyInvoker的关系图 所以当我们用BoltClientProxyInvoker#invoke的时候实际上是调用了父类的invoke方法 ClientProxyInvoker#invoke @Override public SofaResponse invoke(SofaRequest request) throws SofaRpcException { SofaResponse response = null; Throwable throwable