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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
云数据库 Tair(兼容Redis),内存型 2GB
简介: 虽然有很多开源工具通过插件或其它方式可以监测这些开源组件提供的内在性能(所谓内在性能就是这些开源组件提供的类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
相关文章
|
21天前
|
存储 NoSQL PHP
PHP与Redis结合使用,提升数据存储性能
随着互联网应用的发展,PHP与Redis的结合成为提升数据存储性能的重要手段。PHP作为流行的服务器端语言,常用于网站开发;Redis作为高性能内存数据库,以其快速读写能力,有效优化数据访问速度,减轻数据库压力。两者结合通过缓存机制显著提升应用响应速度,支持高并发场景下的稳定性和可扩展性。
|
1月前
|
NoSQL 网络协议 应用服务中间件
redis,memcached,nginx网络组件
redis,memcached,nginx网络组件
17 0
|
2月前
|
存储 缓存 NoSQL
深入探究Redis的AOF持久化:保障数据安全与恢复性能的关键机制
深入探究Redis的AOF持久化:保障数据安全与恢复性能的关键机制
88 0
|
3月前
|
存储 NoSQL Redis
pyhon之对memcached及redis操作
pyhon之对memcached及redis操作
|
3月前
|
存储 缓存 监控
Memcached玩转Web性能:一致性哈希、数据持久化,一文全掌握!
【8月更文挑战第24天】Memcached是一款高性能的分布式内存对象缓存系统,它通过在网络中存储数据并使用简单的键值对机制来提高动态Web应用的性能。它可以显著减少数据库查询次数,进而减轻数据库负载并加快响应时间。为了最大化利用Memcached的优势,建议合理配置内存使用、采用一致性哈希策略、实施数据持久化措施,并持续监控系统健康状况。提供的示例代码展示了如何使用Java创建客户端、添加和获取数据。
43 1
|
3月前
|
物联网 C# 智能硬件
智能家居新篇章:WPF与物联网的智慧碰撞——通过MQTT协议连接与控制智能设备,打造现代科技生活的完美体验
【8月更文挑战第31天】物联网(IoT)技术的发展使智能家居设备成为现代家庭的一部分。通过物联网,家用电器和传感器可以互联互通,实现远程控制和状态监测等功能。本文将探讨如何在Windows Presentation Foundation(WPF)应用中集成物联网技术,通过具体示例代码展示其实现过程。文章首先介绍了MQTT协议及其在智能家居中的应用,并详细描述了使用Wi-Fi连接方式的原因。随后,通过安装Paho MQTT客户端库并创建MQTT客户端实例,演示了如何编写一个简单的WPF应用程序来控制智能灯泡。
123 0
|
4月前
|
监控 NoSQL Redis
Redis性能优化问题之什么是 Swap,为什么使用 Swap 会导致 Redis 性能下降,如何解决
Redis性能优化问题之什么是 Swap,为什么使用 Swap 会导致 Redis 性能下降,如何解决
|
3月前
|
缓存 关系型数据库 MySQL
【缓存大对决】Memcached VS MySQL查询缓存,谁才是真正的性能之王?
【8月更文挑战第24天】在现代Web应用中,缓存技术对于提升性能与响应速度至关重要。本文对比分析了Memcached与MySQL查询缓存这两种常用方案。Memcached是一款高性能分布式内存对象缓存系统,支持跨服务器共享缓存,具备灵活性与容错性,但受限于内存大小且不支持数据持久化。MySQL查询缓存内置在MySQL服务器中,简化了缓存管理,特别适用于重复查询,但功能较为单一且扩展性有限。两者各有所长,实际应用中可根据需求单独或结合使用,实现最佳性能优化。
120 0
|
3月前
|
缓存 NoSQL 网络安全
【Azure Redis 缓存 Azure Cache For Redis】Redis性能问题,发现Server Load非常的高,导致正常连接/操作不成功
【Azure Redis 缓存 Azure Cache For Redis】Redis性能问题,发现Server Load非常的高,导致正常连接/操作不成功
|
3月前
|
缓存 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的性能
下一篇
无影云桌面