当前用户可以使用Java的JConsole工具对正在运行的IoTDB进程进行系统状态监控,或使用IoTDB为用户开放的接口查看数据统计量。
进入Jconsole监控页面后,首先看到的是IoTDB各类运行情况的概览。在这里,您可以看到堆内存信息、线程信息、类信息以及服务器的CPU使用情况。
通过使用JConsole工具并与JMX连接,您可以查看一些系统统计信息和参数。 本节描述如何使用JConsole的 “Mbean” 选项卡来监视IoTDB的一些系统配置、写入数据统计等等。 连接到JMX后,您可以通过 “MBeans” 标签找到名为 “org.apache.iotdb.service” 的 “MBean”,如下图所示。
Monitor下有几个属性,包括数据文件目录,写入数据统计信息以及某些系统参数的值。 通过双击与属性对应的值,它还可以显示该属性的折线图。有关Monitor属性的具体介绍,请参见以下部分。
| 名称 | SystemDirectory |
|---|---|
| 描述 | 数据系统文件的绝对目录 |
| 类型 | String |
| 名称 | DataSizeInByte |
|---|---|
| 描述 | 数据文件的总大小 |
| 单元 | Byte |
| 类型 | Long |
| 名称 | EnableStatMonitor |
|---|---|
| 描述 | 系统监控模块是否开启 |
| 类型 | Boolean |
| 名称 | WriteAheadLogStatus |
|---|---|
| 描述 | 预写日志(WAL)的状态。 True表示启用WAL。 |
| 类型 | Boolean |
| 名称 | GlobalTotalPointsNum |
|---|---|
| 描述 | 总点数 |
| 类型 | Long |
| 名称 | GlobalReqSuccessNum |
|---|---|
| 描述 | 成功的请求数 |
| 类型 | Long |
| 名称 | GlobalReqFailNum |
|---|---|
| 描述 | 失败的请求数 |
| 类型 | Long |
本模块对数据写入操作提供一些统计信息的监控,包括:
用户可以选择开启或关闭数据统计监控功能(您可以设定配置文件中的enable_stat_monitor项,详细信息参见第3.4节)。
默认情况下,统计数据只储存在内存中,可以使用 Jconsole 进行访问。
统计数据还支持以时间序列的格式写入磁盘,可以通过设置配置文件中的enable_monitor_series_write开启。开启后,可以使用 select 命令来对这些统计数据进行查询。
请注意:
如果
enable_monitor_series_write=true, 当 IoTDB 重启时,之前的统计数据会被重新载入内存。 如果enable_monitor_series_write=false, IoTDB 关闭时内存中所有的统计信息会被清空。
系统目前对写入数据的统计可分为两大模块: 全局(Global) 写入数据统计和存储组(Storage Group) 写入数据统计。全局统计量记录了所有写入数据的点数、请求数统计,存储组统计量对每一个存储组的写入数据进行了统计。
系统设定监控模块的采集粒度为每个数据文件刷入磁盘时更新一次统计信息,因此数据精度可能和实际有所出入。如需获取准确信息,请先调用 flush 方法后再查询。
写入数据统计项列表(括号内为统计量支持的范围):
| 名字 | TOTAL_POINTS |
|---|---|
| 描述 | 写入总点数 |
| 时间序列名称 | root.stats.{“global” | “storageGroupName”}.TOTAL_POINTS |
| 名字 | TOTAL_REQ_SUCCESS |
|---|---|
| 描述 | 写入请求成功次数 |
| 时间序列名称 | root.stats.“global”.TOTAL_REQ_SUCCESS |
| 名字 | TOTAL_REQ_FAIL |
|---|---|
| 描述 | 写入请求失败次数 |
| 时间序列名称 | root.stats.“global”.TOTAL_REQ_FAIL |
以上属性同样支持在 Jconsole 中进行可视化显示。对于每个存储组的统计信息,为了避免存储组过多造成显示混乱,用户可以在 Monitor Mbean 下的操作方法中输入存储组名进行相应的统计信息查询。
下面为您展示两个具体的例子。用户可以通过SELECT语句查询自己所需要的写入数据统计项。(查询方法与普通的时间序列查询方式一致)
我们以查询全局统计量总点数(TOTAL_POINTS)为例,用IoTDB SELECT语句查询它的值。SQL语句如下:
select TOTAL_POINTS from root.stats."global"
我们以查询存储组root.ln的统计量总点数(TOTAL_POINTS)为例,用IoTDB SELECT语句查询它的值。SQL语句如下:
select TOTAL_POINTS from root.stats."root.ln"
若您需要查询当前系统的最新信息,您可以使用最新数据查询,SQL语句如下:
flush select last TOTAL_POINTS from root.stats."global"
性能监控模块用来监控IOTDB每一个操作的耗时,以便用户更好的了解数据库的整体性能。此模块会统计每一种操作的平均耗时,以及耗时在一定时间区间内(1ms,4ms,16ms,64ms,256ms,1024ms,以上)的操作的比例。输出文件在log_measure.log中。输出样例如下:
配置文件位置:conf/iotdb-engine.properties
| 参数 | 默认值 | 描述 |
|---|---|---|
| enable_performance_stat | false | 是否开启性能监控模块 |
| performance_stat_display_interval | 60000 | 打印统计结果的时间延迟,以毫秒为单位 |
| performance_stat_memory_in_kb | 20 | 性能监控模块使用的内存阈值,单位为KB |
通过端口31999连接jconsole,并在上方菜单项中选择MBean. 展开侧边框并选择 org.apache.iotdb.db.cost.statistic. 将会得到如下图所示结果:
属性
操作
增加操作项
在org.apache.iotdb.db.cost.statistic.Operation类中增加一个枚举项来表示新增的操作.
在监控区域增加监控代码
在监控开始区域增加计时代码:
long t0 = System. currentTimeMillis();
在监控结束区域增加记录代码:
Measurement.INSTANCE.addOperationLatency(Operation, t0);
为了提高查询性能,IOTDB对ChunkMetaData和TsFileMetaData进行了缓存。用户可以通过debug级别的日志以及MXBean两种方式来查看缓存的命中率,并根据缓存命中率以及系统内存来调节缓存所使用的内存大小。使用MXBean查看缓存命中率的方法为:
IoTDB支持用户通过修改日志配置文件的方式对IoTDB系统日志(如日志输出级别等)进行配置,系统日志配置文件默认位置在$IOTDB_HOME/conf文件夹下,默认的日志配置文件名为logback.xml。用户可以通过增加或更改其中的xml树型节点参数对系统运行日志的相关配置进行修改。详细配置说明参看本文日志文件配置说明。
同时,为了方便在系统运行过程中运维人员对系统的调试,我们为系统运维人员提供了动态修改日志配置的JMX接口,能够在系统不重启的前提下实时对系统的Log模块进行配置。详细使用方法参看动态系统日志配置说明)。
本节以Jconsole为例介绍连接JMX并进入动态系统日志配置模块的方法。启动Jconsole控制页面,在新建连接处建立与IoTDB Server的JMX连接(可以选择本地进程或给定IoTDB的IP及PORT进行远程连接,IoTDB的JMX服务默认运行端口为31999),如下图使用远程进程连接Localhost下运行在31999端口的IoTDB JMX服务。
连接到JMX后,您可以通过MBean选项卡找到名为ch.qos.logback.classic的MBean,如下图所示。
在ch.qos.logback.classic的MBean操作(Operations)选项中,可以看到当前动态系统日志配置支持的6种接口,您可以通过使用相应的方法,来执行相应的操作,操作页面如图。
该方法为重新加载默认的logback配置文件,用户可以先对默认的配置文件进行修改,然后调用该方法将修改后的配置文件重新加载到系统中,使其生效。
该方法为加载一个指定路径的logback配置文件,并使其生效。该方法接受一个名为p1的String类型的参数,该参数为需要指定加载的配置文件路径。
该方法为获取指定Logger当前生效的日志级别。该方法接受一个名为p1的String类型的参数,该参数为指定Logger的名称。该方法返回指定Logger当前生效的日志级别。
该方法为获取指定Logger的日志级别。该方法接受一个名为p1的String类型的参数,该参数为指定Logger的名称。该方法返回指定Logger的日志级别。
需要注意的是,该方法与getLoggerEffectiveLevel方法的区别在于,该方法返回的是指定Logger在配置文件中被设定的日志级别,如果用户没有对该Logger进行日志级别的设定,则返回空。按照Logback的日志级别继承机制,如果一个Logger没有被显示地设定日志级别,其将会从其最近的祖先继承日志级别的设定。这时,调用getLoggerEffectiveLevel方法将返回该Logger生效的日志级别;而调用本节所述方法,将返回空。
该方法为设置指定Logger的日志级别。该方法接受一个名为p1的String类型的参数和一个名为p2的String类型的参数,分别指定Logger的名称和目标的日志等级。