searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

DataNode 慢磁盘过滤

2024-05-29 09:08:35
41
0

        在当前计算机发展趋势下,单台服务器的存储能力、计算性能越来越强悍。目前在datanode节点,可支持挂载更多的磁盘,为了避免出现慢磁盘而影响整个datanode服务的性能,考虑对每个磁盘的IO事件监测统计,发现有慢磁盘时就在datanode选盘的过程中,排除这个慢磁盘,以此提升服务的稳定性。下图是磁盘监测统计、慢磁盘过滤的架构:

        DataNode 磁盘的IO操作被统计收集到DataNodeVolumeMetrics中,DataNodeDiskMetrics会启动一个周期性线程来获取每个IO类型的耗时均值,通过探测异常的方法获取到超过阈值的磁盘,在异常磁盘的列表中再选出TOP N 放入slowDiskToExclude中,后续执行chooseVolume时,就会过滤slowDiskToExclude中磁盘。

下面讲解下write操作的统计:

            new 一个ProfilingFileIoEvents: isEnabled 由dfs.datanode.fileio.profiling.sampling.percentage 决定,>0 就启用IoEvent收集
            sampleRangerMax:决定了抽样概率 ---- 随机值 < (int) ((double) fileIOSamplingPercentage / 100 * Integer.MAX_VALUE)

           
            
            beforeFileIo:   这里注意随机值   ThreadLocalRandom.current().nextInt()   包含了负数,应该替换为(HDFS-17471)  ThreadLocalRandom.current().nextInt(Integer.MAX_VALUE)

           
            
            afterFileIo: 根据OP类型存入指标数据
           

这里切入下DataNodeVolumeMetrics.addWriteIoLatency

向writeIoRate<MutableRate> 添加延时数据 latency

MutableRate: 执行add添加数据
1、intervalStat<SampleStat> 执行add 加入数据
2、设置最小最大值
3、设置状态为已改变


DataNodeVolumeMetrics.getWriteIoMean 就是获取intervalStat的均值:

 

下面是各种IO事件对应的OP类型:

WRITE:写到缓冲区
FLUSH:刷写缓冲区数据到底层输出流
SYNC:缓冲区内容写入到基础流,底层文件系统也同步
READ:读取数据
TRANSFER:将数据从 FileChannel 传输到 SocketOutputStream
NATIVE_COPY:拷贝block data、meta文件到其他位置
META:OPEN、EXISTS、LIST、DELETE、MOVE、MKDIRS、FADVISE

 

0条评论
0 / 1000
付朝洪
3文章数
0粉丝数
付朝洪
3 文章 | 0 粉丝
付朝洪
3文章数
0粉丝数
付朝洪
3 文章 | 0 粉丝
原创

DataNode 慢磁盘过滤

2024-05-29 09:08:35
41
0

        在当前计算机发展趋势下,单台服务器的存储能力、计算性能越来越强悍。目前在datanode节点,可支持挂载更多的磁盘,为了避免出现慢磁盘而影响整个datanode服务的性能,考虑对每个磁盘的IO事件监测统计,发现有慢磁盘时就在datanode选盘的过程中,排除这个慢磁盘,以此提升服务的稳定性。下图是磁盘监测统计、慢磁盘过滤的架构:

        DataNode 磁盘的IO操作被统计收集到DataNodeVolumeMetrics中,DataNodeDiskMetrics会启动一个周期性线程来获取每个IO类型的耗时均值,通过探测异常的方法获取到超过阈值的磁盘,在异常磁盘的列表中再选出TOP N 放入slowDiskToExclude中,后续执行chooseVolume时,就会过滤slowDiskToExclude中磁盘。

下面讲解下write操作的统计:

            new 一个ProfilingFileIoEvents: isEnabled 由dfs.datanode.fileio.profiling.sampling.percentage 决定,>0 就启用IoEvent收集
            sampleRangerMax:决定了抽样概率 ---- 随机值 < (int) ((double) fileIOSamplingPercentage / 100 * Integer.MAX_VALUE)

           
            
            beforeFileIo:   这里注意随机值   ThreadLocalRandom.current().nextInt()   包含了负数,应该替换为(HDFS-17471)  ThreadLocalRandom.current().nextInt(Integer.MAX_VALUE)

           
            
            afterFileIo: 根据OP类型存入指标数据
           

这里切入下DataNodeVolumeMetrics.addWriteIoLatency

向writeIoRate<MutableRate> 添加延时数据 latency

MutableRate: 执行add添加数据
1、intervalStat<SampleStat> 执行add 加入数据
2、设置最小最大值
3、设置状态为已改变


DataNodeVolumeMetrics.getWriteIoMean 就是获取intervalStat的均值:

 

下面是各种IO事件对应的OP类型:

WRITE:写到缓冲区
FLUSH:刷写缓冲区数据到底层输出流
SYNC:缓冲区内容写入到基础流,底层文件系统也同步
READ:读取数据
TRANSFER:将数据从 FileChannel 传输到 SocketOutputStream
NATIVE_COPY:拷贝block data、meta文件到其他位置
META:OPEN、EXISTS、LIST、DELETE、MOVE、MKDIRS、FADVISE

 

文章来自个人专栏
Hadoop-DataNode
1 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0