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

简介: 虽然有很多开源工具通过插件或其它方式可以监测这些开源组件提供的内在性能(所谓内在性能就是这些开源组件提供的类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
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
相关文章
|
10月前
|
运维 NoSQL Cloud Native
国内独家|阿里云首发MongoDB 8.0,性能提升“快”人一步
阿里云作为MongoDB的最佳战略合作伙伴,在国内独家发布了8.0版本,支撑广大用户进一步提升业务效率。
|
11月前
|
NoSQL 关系型数据库 MongoDB
接口管理工具深度对比:Apipost与Apifox在Redis/MongoDB支持上的关键差异
近期在团队工具选型时,系统对比了Apifox和Apipost两款接口管理工具,我们的体会是:Apipost适合需要同时管理多种数据库的中大型项目,特别是涉及Redis/MongoDB等非关系型数据库的场景,Apifox仅建议在纯关系型数据库架构且预算有限的小型项目中短期使用。
381 3
|
11月前
|
存储 NoSQL MongoDB
从 MongoDB 到 时序数据库 TDengine,沃太能源实现 18 倍写入性能提升
沃太能源是国内领先储能设备生产厂商,数十万储能终端遍布世界各地。此前使用 MongoDB 存储时序数据,但随着设备测点增加,MongoDB 在存储效率、写入性能、查询性能等方面暴露出短板。经过对比,沃太能源选择了专业时序数据库 TDengine,生产效能显著提升:整体上,数据压缩率超 10 倍、写入性能提升 18 倍,查询在特定场景上也实现了数倍的提升。同时减少了技术架构复杂度,实现了零代码数据接入。本文将对 TDengine 在沃太能源的应用情况进行详解。
529 0
|
JSON NoSQL Java
从Redis到Tair:开源工具的最佳实践
《从Redis到Tair:开源工具的最佳实践》介绍了Redis闭源后Valkey社区的成立及其兼容性测试、性能测试、数据迁移与校验、客户端接入最佳实践,以及Tair的开源模块。内容涵盖Redis闭源背景、阿里云在Valkey社区中的贡献、Tair与Redis的兼容性测试工具(如resp-compatibility)、性能测试工具(如RESP-Benchmark)、数据迁移工具(如Redis Shake)及数据校验工具。此外,还详细介绍了TairHash和TairDoc两个开源模块的应用场景,帮助用户更好地理解和使用这些工具。
724 4
|
NoSQL MongoDB PHP
MongoDB 管理工具: Rockmongo
10月更文挑战第24天
233 1
MongoDB 管理工具: Rockmongo
|
存储 NoSQL MongoDB
Redis在中国火爆,为何MongoDB更受欢迎国外?
本文介绍了Redis和MongoDB的基本概念及其在GitHub Star、DB-Engines Ranking和Google Trends中的数据对比。Redis是一个基于内存的键值对存储数据库,适合快速读写场景;MongoDB则是面向文档的数据库,支持大规模数据存储和复杂查询。全球范围内,MongoDB的搜索热度高于Redis,但在中国市场,Redis更受欢迎,因其高性能和低延迟特性满足了中国互联网公司对高并发的需求。总结部分分析了两者的特点及适用场景,并结合中美两国的行业背景解释了其受欢迎程度的不同原因。
445 1
|
NoSQL 数据可视化 Linux
redis学习四、可视化操作工具链接 centos redis,付费Redis Desktop Manager和免费Another Redis DeskTop Manager下载、安装
本文介绍了Redis的两个可视化管理工具:付费的Redis Desktop Manager和免费的Another Redis DeskTop Manager,包括它们的下载、安装和使用方法,以及在使用Another Redis DeskTop Manager连接Redis时可能遇到的问题和解决方案。
1886 1
redis学习四、可视化操作工具链接 centos redis,付费Redis Desktop Manager和免费Another Redis DeskTop Manager下载、安装
|
存储 NoSQL 网络协议
Redis性能攻略:Redis-benchmark工具与实用性能优化技巧
Redis 是一种高性能的内存数据库,广泛应用于各种业务场景。随着业务规模扩大和数据量增长,性能问题逐渐凸显。本文深入探讨 Redis 性能优化方案,包括硬件配置(网络、内存优化)、参数配置(maxmemory、timeout 等)、数据结构选择、过期策略、持久化机制(RDB、AOF)及集群方案(主从复制、哨兵模式、集群模式),帮助提升 Redis 的整体性能表现。
662 0
|
存储 关系型数据库 MySQL
四种数据库对比MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景
四种数据库对比 MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景
|
存储 NoSQL Redis
pyhon之对memcached及redis操作
pyhon之对memcached及redis操作