在 CentOS 上遇到 HDFS 读写慢,通常不是单一原因,而是系统、网络、HDFS 配置、硬件多方面叠加。下面按常见原因和排查思路系统说明。
CentOS 默认可能协商成 100Mbps 或半双工。
ethtool eth0
重点看:
解决
ethtool -s eth0 speed 1000 duplex full autoneg off
CentOS 默认:
会严重影响 HDFS 数据传输。
systemctl stop firewalld
setenforce 0
永久关闭:
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
HDFS 大块传输受益 MTU=9000。
ip link show
若交换机支持:
ifconfig eth0 mtu 9000
CentOS 默认 mq-deadline 或 cfq,对 HDD 不友好。
cat /sys/block/sda/queue/scheduler
推荐:
deadlinenoneecho deadline > /sys/block/sda/queue/scheduler
iostat -x 1
smartctl -a /dev/sda
常见问题:
dfs.replication=3
写入慢时:
dfs.blocksize=134217728 # 128M
小文件极多 → NameNode + IO 压力巨大
dfs.client.write.packetsize
dfs.client.read.threads
CentOS 本地读未开启会走网络。
dfs.client.read.shortcircuit=true
并确保:
mount | grep /dfs
ulimit -n
HDFS 推荐:
* soft nofile 65536
* hard nofile 65536
sysctl -w net.core.rmem_max=16777216
sysctl -w net.ipv4.tcp_window_scaling=1
cat /sys/kernel/mm/transparent_hugepage/enabled
建议:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
jstat -gcutil <pid> 1000
# 网络
ethtool eth0
iperf -c datanode
# IO
iostat -x 1
dstat
# HDFS
hdfs dfs -put /tmp/bigfile /
hdfs dfs -get /testfile /tmp/
# 系统
top
free -m
✅ 网卡不是千兆全双工
✅ 防火墙 / SELinux 没关
✅ 磁盘调度不对
✅ 副本数过高
✅ Short-Circuit 没开
如果你愿意,可以告诉我:
我可以直接给你一套针对性调优参数。