SLOW READPROCESSOR;ERROR SLOW BLOCKRECEIVER错误日志分析

本文分析了Hadoop集群中出现的性能问题,特别是针对慢速读写操作进行了深入探讨。通过对日志的分析,发现了一系列与数据节点相关的警告信息,并提出了具体的排查步骤和工具,如使用iostat监测磁盘活动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、现象

1、flink job log

2022-05-17 02:48:25,688 INFO org.apache.hadoop.hdfs.DataStreamer                         [] - Slow ReadProcessor read fields for block BP-1487117196-110.246.92.211-1641695608175:blk_1305548153_236768430 took 44369ms (threshold=30000ms); ack: seqno: 2041 reply: SUCCESS reply: SUCCESS reply: SUCCESS downstreamAckTimeNanos: 44349240826 flag: 0 flag: 0 flag: 0, targets: [DatanodeInfoWithStorage[110.246.92.130:9866,DS-3ee15ef0-7de4-49ed-b031-1a2769cd9a97,DISK], DatanodeInfoWithStorage[110.246.92.217:9866,DS-382900d8-67b2-4aa0-8a66-e1ea435aaba4,DISK], DatanodeInfoWithStorage[110.246.92.218:9866,DS-e28bb23b-7a03-498a-b8a2-859382ad300e,DISK]]

2、hadoop datanode log

2022-05-24 01:27:12,269 WARN  [DataXceiver for client DFSClient_NONMAPREDUCE_-1719586450_1 at /110.246.92.219:60654 [Receiving block BP-1487117196-110.246.92.211-1641695608175:blk_1328326532_260060124]] datanode.DataNode (BlockReceiver.java:manageWriterOsCache(934)) - Slow manageWriterOsCache took 510ms (threshold=300ms), volume=file:/data/hadoop/, blockId=1328326532

二、问题分析及处理

1、在每个DataNode上运行以下命令来收集所有Slow消息的计数

$ egrep -o "Slow.*?(took|cost)" hadoop-root-datanode-datanode-1.out | sort | uniq -c
   1105 Slow BlockReceiver write data to disk cost
    330 Slow BlockReceiver write packet to mirror took
    102 Slow flushOrSync took
   5031 Slow manageWriterOsCache took
    388 Slow PacketResponder send ack to upstream took

现象

原因

集群负载高

如果你的集群处于或接近资源上限(内存,cpu或磁盘),则你在处理作业时,你的集群可能无法确保数据本地化,因此需要在网络上传输数据块。如果是这种情况,由于使用集群上的额外负载来传输数据块,因此可能会在作业或数据节点中看到WARN消息。

Slow BlockReceiver write packet to mirror

这表明在网络上写入块时有延迟

Slow BlockReceiver write data to disk cost

这表示在将块写入OS缓存或磁盘时存在延迟

Slow flushOrSync

这表示在将块写入OS缓存或磁盘时存在延迟

Slow manageWriterOsCache

这表示在将块写入OS缓存或磁盘时存在延迟

需要注意的是,在生产环境的正常负载下,一些集群的WARN消息在datanode日志中是正常的。当单个节点具有比正常情况更多的上述WARN消息时,表明存在底层硬件问题。

2、如果单个节点的一个或多个类别的”Slow“消息比其他主机的”Slow“消息数量多出数量级,则需要调查底层硬件问题。

3、如果Slow消息数最多的是Slow BlockReceiver write packet tomirror took,请通过以下命令的输出来调查可能的网络问题:

  • ifconfig -a(定期检查问题主机上增加的errors和dropped的数量,往往代表的是网卡,网线或者上游的网络有问题)
  • netstat -s(与正常节点相比,查找大量重新传输的数据包或其他异常高的指标)。
  • netstat -s | grep -i retrans(整个集群执行)。 (在一个或多个节点上查找大于正常的计数)。

4、如果Slow消息最多的是一些其他消息,请使用以下命令检查磁盘问题:

  • iostat[高iowait百分比,超过15%]
  • iostat -x和sar -d(特定分区的高await或%util)
  • dmesg (磁盘错误)
  • 使用smartctl对磁盘进行健康检查:停止受影响节点的所有Hadoop进程,然后运行sudo smartctl -H /dev/<disk>,检查HDFS使用的每块<disk>

三、iostat 用法

iostat [选项] [<时间间隔>] [<次数>]

命令参数:

  • -c: 显示CPU使用情况
  • -d: 显示磁盘使用情况
  • -N: 显示磁盘阵列(LVM) 信息
  • -n: 显示NFS 使用情况
  • -k: 以 KB 为单位显示
  • -m: 以 M 为单位显示
  • -t: 报告每秒向终端读取和写入的字符数和CPU的信息
  • -V: 显示版本信息
  • -x: 显示详细信息
  • -p:[磁盘] 显示磁盘和分区的情况

示例1:

显示所有设备负载情况

$ iostat
Linux 4.18.0-305.3.1.el8_4.x86_64 (datanode-1)     05/27/2022     _x86_64_    (56 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           1.61    0.00    0.86    0.03    0.00   97.50

Device             tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sdc              10.58       359.21      1883.53 4304228032 22569192188
sde              10.71       378.36      1894.66 4533707080 22702573592
sdf              10.70       382.28      1895.95 4580623920 22717997980
sdh              10.70       378.91      1903.69 4540288592 22810744428
sdi              10.66       358.34      1902.37 4293810648 22794905924
sdg              10.71       372.79      1902.01 4466956568 22790663472
sdd              10.60       358.42      1891.27 4294701984 22661970536
sda              11.67       383.96      1913.88 4600786635 22932900259
sdb              10.61       359.89      1887.82 4312299484 22620539680
dm-0              0.71         1.13         9.16   13594428  109721860
dm-1              0.32         0.41         0.88    4918668   10528140
dm-2              4.93       382.41      1903.85 4582230392 22812647732

cpu属性值说明:

  • %user:CPU处在用户模式下的时间百分比。
  • %nice:CPU处在带NICE值的用户模式下的时间百分比。
  • %system:CPU处在系统模式下的时间百分比。
  • %iowait:CPU等待输入输出完成时间的百分比。
  • %steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。
  • %idle:CPU空闲时间百分比。

dis磁盘属性值说明:

  • device:磁盘名称
  • tps:每秒钟发送到的I/O请求数
  • Blk_read/s:每秒读取的block数
  • Blk_wrtn/s:每秒写入的block数
  • Blk_read:读入的block总数
  • Blk_wrtn:写入的block总数.

注意:

如果%iowait的值过高,表示硬盘存在I/O瓶颈,%idle值高,表示CPU较空闲,如果%idle值高但系统响应慢时,有可能是CPU等待分配内存,此时应加大内存容量。%idle值如果持续低于10,那么系统的CPU处理能力相对较低,表明系统中最需要解决的资源是CPU。

实例2:
间隔1秒,总共显示5次

iostat 1 5

每隔2秒,显示一次设备统计信息.

iostat -d 2

每隔2秒,显示一次设备统计信息.总共输出3次.

iostat -d 2 3

每隔2秒显示一次sda, sdb两个设备的扩展统计信息,共输出3次.

iostat -x sda sdb 2 3

每隔2秒显示一次sda及上面所有分区的统计信息,共输出3次.

iostat -p sda 2 3

以M为单位显示所有信息

iostat -m

显示指定硬盘信息

iostat -d sda

报告每秒向终端读取和写入的字符数

iostat -t

查看TPS和吞吐量信息

iostat -d -k 1 1

查看设备使用率(%util)、响应时间(await)

iostat -d -x -k 1 1

参数说明:

  • rrqm/s: 每秒进行 merge 的读操作数目。即 rmerge/s
  • wrqm/s: 每秒进行 merge 的写操作数目。即 wmerge/s
  • r/s: 每秒完成的读 I/O 设备次数。即 rio/s
  • w/s: 每秒完成的写 I/O 设备次数。即 wio/s
  • rkB/s: 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。
  • wkB/s: 每秒写K字节数。是 wsect/s 的一半。
  • avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。
  • avgqu-sz: 平均I/O队列长度。
  • rsec/s: 每秒读扇区数。即 rsect/s
  • wsec/s: 每秒写扇区数。即 wsect/s
  • r_await:每个读操作平均所需的时间
  • 不仅包括硬盘设备读操作的时间,还包括了在kernel队列中等待的时间。
  • w_await:每个写操作平均所需的时间
  • 不仅包括硬盘设备写操作的时间,还包括了在kernel队列中等待的时间。
  • await: 平均每次设备I/O操作的等待时间 (毫秒)。
  • svctm: 平均每次设备I/O操作的服务时间 (毫秒)。
  • %util: 一秒中有百分之多少的时间用于 I/O 操作,即被io消耗的cpu百分比

注意:

如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明I/O 队列太长,io响应太慢,则需要进行必要优化。如果avgqu-sz比较大,也表示有当量io在等待。

查看cpu状态,间隔1秒显示一次,总共显示2次

iostat -c 1 2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

magic_kid_2010

你的支持将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值