一个小工具完成对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
目录
打赏
0
0
0
0
4
分享
相关文章
Redis原理—5.性能和使用总结
本文详细探讨了Redis的阻塞原因、性能优化、缓存相关问题及数据库与缓存的一致性问题。同时还列举了不同缓存操作方案下的并发情况,帮助读者理解并选择合适的缓存管理策略。最终得出结论,在实际应用中应尽量采用“先更新数据库再删除缓存”的方案,并结合异步重试机制来保证数据的一致性和系统的高性能。
Redis原理—5.性能和使用总结
接口管理工具深度对比:Apipost与Apifox在Redis/MongoDB支持上的关键差异
近期在团队工具选型时,系统对比了Apifox和Apipost两款接口管理工具,我们的体会是:Apipost适合需要同时管理多种数据库的中大型项目,特别是涉及Redis/MongoDB等非关系型数据库的场景,Apifox仅建议在纯关系型数据库架构且预算有限的小型项目中短期使用。
64 3
|
2月前
|
Redis Plus 来了,性能炸裂!
Redis Plus 来了,性能炸裂!
100 21
从 MongoDB 到 时序数据库 TDengine,沃太能源实现 18 倍写入性能提升
沃太能源是国内领先储能设备生产厂商,数十万储能终端遍布世界各地。此前使用 MongoDB 存储时序数据,但随着设备测点增加,MongoDB 在存储效率、写入性能、查询性能等方面暴露出短板。经过对比,沃太能源选择了专业时序数据库 TDengine,生产效能显著提升:整体上,数据压缩率超 10 倍、写入性能提升 18 倍,查询在特定场景上也实现了数倍的提升。同时减少了技术架构复杂度,实现了零代码数据接入。本文将对 TDengine 在沃太能源的应用情况进行详解。
59 0
Redis在中国火爆,为何MongoDB更受欢迎国外?
本文介绍了Redis和MongoDB的基本概念及其在GitHub Star、DB-Engines Ranking和Google Trends中的数据对比。Redis是一个基于内存的键值对存储数据库,适合快速读写场景;MongoDB则是面向文档的数据库,支持大规模数据存储和复杂查询。全球范围内,MongoDB的搜索热度高于Redis,但在中国市场,Redis更受欢迎,因其高性能和低延迟特性满足了中国互联网公司对高并发的需求。总结部分分析了两者的特点及适用场景,并结合中美两国的行业背景解释了其受欢迎程度的不同原因。
138 1
Redis性能攻略:Redis-benchmark工具与实用性能优化技巧
Redis 是一种高性能的内存数据库,广泛应用于各种业务场景。随着业务规模扩大和数据量增长,性能问题逐渐凸显。本文深入探讨 Redis 性能优化方案,包括硬件配置(网络、内存优化)、参数配置(maxmemory、timeout 等)、数据结构选择、过期策略、持久化机制(RDB、AOF)及集群方案(主从复制、哨兵模式、集群模式),帮助提升 Redis 的整体性能表现。
143 0
PHP与Redis结合使用,提升数据存储性能
随着互联网应用的发展,PHP与Redis的结合成为提升数据存储性能的重要手段。PHP作为流行的服务器端语言,常用于网站开发;Redis作为高性能内存数据库,以其快速读写能力,有效优化数据访问速度,减轻数据库压力。两者结合通过缓存机制显著提升应用响应速度,支持高并发场景下的稳定性和可扩展性。
四种数据库对比MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景
四种数据库对比 MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景
|
7月前
|
深入探究Redis的AOF持久化:保障数据安全与恢复性能的关键机制
深入探究Redis的AOF持久化:保障数据安全与恢复性能的关键机制
137 0
MongoDB Schema设计实战指南:优化数据结构,提升查询性能与数据一致性
【8月更文挑战第24天】MongoDB是一款领先的NoSQL数据库,其灵活的文档模型突破了传统关系型数据库的限制。它允许自定义数据结构,适应多样化的数据需求。设计MongoDB的Schema时需考虑数据访问模式、一致性需求及性能因素。设计原则强调简洁性、查询优化与合理使用索引。例如,在构建博客系统时,可以通过精心设计文章和用户的集合结构来提高查询效率并确保数据一致性。正确设计能够充分发挥MongoDB的优势,实现高效的数据管理。
190 3

热门文章

最新文章

下一篇
oss创建bucket
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等