一个小工具完成对memcached/kt/mongodb/redis的性能监测

本文涉及的产品
云数据库 Redis 版,标准版 2GB
推荐场景:
搭建游戏排行榜
云原生内存数据库 Tair,内存型 2GB
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 虽然有很多开源工具通过插件或其它方式可以监测这些开源组件提供的内在性能(所谓内在性能就是这些开源组件提供的类STAT命令获取到的数据),但是不管是部署还是扩展都很麻烦,其实花1-2天时间完全可以实现一个这样的工具,并且扩展起来也很方便。

虽然有很多开源工具通过插件或其它方式可以监测这些开源组件提供的内在性能(所谓内在性能就是这些开源组件提供的类STAT命令获取到的数据),但是不管是部署还是扩展都很麻烦,其实花1-2天时间完全可以实现一个这样的工具,并且扩展起来也很方便。

比如mongodb的:

image

image

又比如redis的:

image

这个工具实现的功能如下:

1)只需要简单配置(在DEMO代码里我硬编码了,您完全可以改为通过配置)就可以实现监控redis、mongodb、kt和memcached,之所以只有这些因为我们用到的只有这些,其实扩展一下也很方便,特别是有.NET客户端的组件。

2)监控粒度可以选择,不同的监控粒度在一页上显示的时间段也不一样,大致确保一页100个点左右。

3)为了简单,分页只是做了下拉,您完全可以修改为拖动或分页控件。

 

这个工具实现的原理如下:

1)利用mongodb保存大量数据,为了性能使用了mongodb的Capped集合,而且这样也无需考虑历史数据的移除。

2)10秒的监控粒度是原始收集数据的粒度,通过收集器定时收集数据,直接写入Mongodb。

3)其它监控粒度是基于原始数据的聚合,聚合器定时聚合数据,也是使用Capped集合,不过集合大小会小一点。

4)值的类型如下:

 public enum ItemValueType
    {
        TextValue,
        StateValue,
        TotalValue,
        ExpressionValue,
    }

对于StateValue也就是状态值直接存入数据库,对于TotalValue也就是总数值,会在内存中保存上一个值然后下一个值收集到之后会进行相减获取到差值,对于TextValue始终保存最新的值,对于ExpressionValue暂时没有做处理,您可以自己实现,对于Mongodb来说我们选择监测这些数据:

    private static Dictionary<string, ComponentItem> items = new Dictionary<string, ComponentItem>
        { 
            { "version", new ComponentItem("其它", "版本号", ItemValueType.TextValue) },
       
            { "mem.resident", new ComponentItem("内存", "使用的物理内存大小", ItemValueType.StateValue) },
            { "mem.virtual", new ComponentItem("内存", "使用的虚拟内存大小", ItemValueType.StateValue) },
            { "mem.mapped", new ComponentItem("内存", "映射的内存大小", ItemValueType.StateValue) },
            { "mem.mappedWithJournal", new ComponentItem("内存", "具有日志的映射的内存大小", ItemValueType.StateValue) },
            { "extra_info.page_faults", new ComponentItem("内存", "加载磁盘内容时发生页错误的次数", ItemValueType.TotalValue) },

            { "connections.current", new ComponentItem("连接", "当前连接数", ItemValueType.StateValue) },
            { "connections.available", new ComponentItem("连接", "可用连接数", ItemValueType.StateValue) },

            { "network.bytesIn", new ComponentItem("网络", "网络读取字节数", ItemValueType.TotalValue) },
            { "network.bytesOut", new ComponentItem("网络", "网络发送字节数", ItemValueType.TotalValue) },
            { "network.numRequests", new ComponentItem("网络", "网络请求数", ItemValueType.TotalValue) },

            { "opcounters.insert", new ComponentItem("操作数", "insert数", ItemValueType.TotalValue) },
            { "opcounters.query", new ComponentItem("操作数", "query数", ItemValueType.TotalValue) },
            { "opcounters.update", new ComponentItem("操作数", "update数", ItemValueType.TotalValue) },
            { "opcounters.delete", new ComponentItem("操作数", "delete数", ItemValueType.TotalValue) },
            { "opcounters.getmore", new ComponentItem("操作数", "游标getmore数", ItemValueType.TotalValue) },
            { "opcounters.command", new ComponentItem("操作数", "其它操作数", ItemValueType.TotalValue) },

            { "indexCounters.btree.accesses", new ComponentItem("索引", "访问索引次数", ItemValueType.TotalValue) },
            { "indexCounters.btree.hits", new ComponentItem("索引", "内存命中索引次数", ItemValueType.TotalValue) },
            { "indexCounters.btree.misses", new ComponentItem("索引", "内存不命中索引次数", ItemValueType.TotalValue) },
            { "indexCounters.btree.resets", new ComponentItem("索引", "索引计数器重置次数", ItemValueType.TotalValue) },
            { "indexCounters.btree.hits * 100 / indexCounters.btree.accesses", new ComponentItem("索引", "hitsratio ", ItemValueType.ExpressionValue) },
        };

5)客户端很简单,使用了highchart+ajax,直接和wcf的服务端交互获取jsonp数据源。

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehaviour" >
          <serviceDebug includeExceptionDetailInFaults="true"/>
          <serviceMetadata />

        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="HttpBehaviour">
          <webHttp defaultBodyStyle="Wrapped" defaultOutgoingResponseFormat="Json" helpEnabled="true" />
          <enableWebScript />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <bindings>
      <webHttpBinding>
        <binding name="webHttpBindingJsonP" crossDomainScriptAccessEnabled="true"/>
      </webHttpBinding>
    </bindings>
    <services>
      <service name="Adhesive.ComponentPerformance.Core.Service" behaviorConfiguration="ServiceBehaviour" >
        <endpoint address="http://localhost:8888/"
                   binding="webHttpBinding" bindingConfiguration="webHttpBindingJsonP"
                  behaviorConfiguration="HttpBehaviour"
                  contract="Adhesive.ComponentPerformance.Core.Service" />
        <endpoint address="http://localhost:8888/mex" binding="mexHttpBinding" contract="IMetadataExchange"/>

      </service>
    </services>
  </system.serviceModel>

话不多说,点击这里下载DEMO代码,在使用前建议你修改如下地方:

1)完善记录日志的地方

2)把配置改为你自己的配置服务

3)完善其它需要监测的开源组件

4)完善网站的分页等功能

 

最后预祝大家新年快乐!

作者: lovecindywang
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
23天前
|
存储 NoSQL Redis
pyhon之对memcached及redis操作
pyhon之对memcached及redis操作
|
26天前
|
存储 NoSQL Redis
【Azure Developer】一个复制Redis Key到另一个Redis服务的工具(redis_copy_net8)
【Azure Developer】一个复制Redis Key到另一个Redis服务的工具(redis_copy_net8)
【Azure Developer】一个复制Redis Key到另一个Redis服务的工具(redis_copy_net8)
|
28天前
|
存储 缓存 监控
Memcached玩转Web性能:一致性哈希、数据持久化,一文全掌握!
【8月更文挑战第24天】Memcached是一款高性能的分布式内存对象缓存系统,它通过在网络中存储数据并使用简单的键值对机制来提高动态Web应用的性能。它可以显著减少数据库查询次数,进而减轻数据库负载并加快响应时间。为了最大化利用Memcached的优势,建议合理配置内存使用、采用一致性哈希策略、实施数据持久化措施,并持续监控系统健康状况。提供的示例代码展示了如何使用Java创建客户端、添加和获取数据。
30 1
|
1月前
|
NoSQL 数据可视化 Linux
2022 年超详细步骤讲解 CentOS 7 安装Redis 。解决Redis Desktop Manager 图形化工具连接失败解决 ;connection failed处理。开机自启Redis
这篇文章提供了在CentOS 7上安装Redis的详细步骤,包括上传Redis安装包、解压安装、编译、安装、备份配置文件、修改配置以支持后台运行和设置密码、启动Redis服务、使用客户端连接Redis、关闭Redis服务、解决Redis Desktop Manager图形化工具连接失败的问题、设置Redis开机自启动,以及Redis服务的启动和停止命令。
2022 年超详细步骤讲解 CentOS 7 安装Redis 。解决Redis Desktop Manager 图形化工具连接失败解决 ;connection failed处理。开机自启Redis
|
20天前
|
物联网 C# 智能硬件
智能家居新篇章:WPF与物联网的智慧碰撞——通过MQTT协议连接与控制智能设备,打造现代科技生活的完美体验
【8月更文挑战第31天】物联网(IoT)技术的发展使智能家居设备成为现代家庭的一部分。通过物联网,家用电器和传感器可以互联互通,实现远程控制和状态监测等功能。本文将探讨如何在Windows Presentation Foundation(WPF)应用中集成物联网技术,通过具体示例代码展示其实现过程。文章首先介绍了MQTT协议及其在智能家居中的应用,并详细描述了使用Wi-Fi连接方式的原因。随后,通过安装Paho MQTT客户端库并创建MQTT客户端实例,演示了如何编写一个简单的WPF应用程序来控制智能灯泡。
40 0
|
1月前
|
存储 监控 NoSQL
揭秘Redis慢查询:这个工具将彻底改变你的性能优化策略!
【8月更文挑战第8天】在互联网应用中,数据库性能常成瓶颈。Redis作为高速内存数据库亦可能遭遇慢查询问题。本文探讨慢查询成因与解决方法。首先定义慢查询及其影响因素,随后介绍Redis内置的慢查询日志功能,通过配置`slowlog-log-slower-than`与`slowlog-max-len`来监控执行时间过长的命令。利用`SLOWLOG get`命令分析日志,定位性能瓶颈所在。以`LRANGE`命令为例,提出数据结构调整、使用流水线、限制返回元素数量、异步执行及优化内存使用等策略。最终实现Redis性能提升,确保应用流畅运行。性能优化需持续监控、分析与调整。
54 1
|
26天前
|
缓存 NoSQL 网络安全
【Azure Redis 缓存】使用开源工具redis-copy时遇见6379端口无法连接到Redis服务器的问题
【Azure Redis 缓存】使用开源工具redis-copy时遇见6379端口无法连接到Redis服务器的问题
|
28天前
|
缓存 关系型数据库 MySQL
【缓存大对决】Memcached VS MySQL查询缓存,谁才是真正的性能之王?
【8月更文挑战第24天】在现代Web应用中,缓存技术对于提升性能与响应速度至关重要。本文对比分析了Memcached与MySQL查询缓存这两种常用方案。Memcached是一款高性能分布式内存对象缓存系统,支持跨服务器共享缓存,具备灵活性与容错性,但受限于内存大小且不支持数据持久化。MySQL查询缓存内置在MySQL服务器中,简化了缓存管理,特别适用于重复查询,但功能较为单一且扩展性有限。两者各有所长,实际应用中可根据需求单独或结合使用,实现最佳性能优化。
53 0
|
28天前
|
缓存 NoSQL 网络安全
【Azure Redis 缓存 Azure Cache For Redis】Redis性能问题,发现Server Load非常的高,导致正常连接/操作不成功
【Azure Redis 缓存 Azure Cache For Redis】Redis性能问题,发现Server Load非常的高,导致正常连接/操作不成功
|
28天前
|
缓存 NoSQL 测试技术
【Azure Redis 缓存 Azure Cache For Redis】使用Redis自带redis-benchmark.exe命令测试Azure Redis的性能
【Azure Redis 缓存 Azure Cache For Redis】使用Redis自带redis-benchmark.exe命令测试Azure Redis的性能