hadoop ipc server 分析

最近遇见namenode 响应时间变慢,分析一下namenode 的 ipc server源码,记录一下ipc server的机制

先看一下关于 ipc server 的配置参数:

下面表格是非public的参数:

参数 作用 default
ipc.ping.interval How often does RPC client send pings to RPC server default 60000
ipc.server.max.response.size 响应ipc请求消息的最大长度;再大的消息量,消息会被记录到log里 1024*1024
ipc.maximum.data.length   64*1024*1024
ipc.server.read.threadpool.size Number of threads in RPC server reading from the socket 1
ipc.server.handler.queue.size How many calls per handler are allowed in the queue. 100

下面表格是public的参数, 都在core-site.xml 文件中配置:

参数 作用 default
ipc.client.connection.maxidletime 客户端连接最长无请求时间,超过这个时间,连接变成idle连接 10000
ipc.client.connect.timeout 客户端尝试连接的timeout时间 20000
ipc.client.connect.max.retries 客户端尝试连接的次数 10
ipc.client.connect.max.retries.on.timeouts 客户端重新连接,最大timeout时间 45
ipc.client.tcpnodelay   false
ipc.server.tcpnodelay   false
ipc.server.listen.queue.size ipc server的listener的队列大小 128
ipc.client.kill.max   10
ipc.client.idlethreshold 连接数达到这个阈值,server会释放一些idle状态的连接 4000


Server 包含了5个组件: Listner Responder Handler[]   List  BlockingQueue

Listner : 负责监听连接请求,并且建立连接, 将连接添加到List ;这个类里有Reader, Reader 负责唤醒nio 的selector

Connection: 维护建立的链接信息,包含一个List responseQueue 保存Call 请求的响应信息

Handler : 从 BlockingQueue 获取请求信息,并且像响应方发送请求响应

Call: 用来维护请求和返回消息,包了一个rcpQuest: 

private final Writable rpcRequest;    // Serialized Rpc request from client

和rpcResponse:

private ByteBuffer rpcResponse;       // the response for this call

可能需要优化的地方:
当集群变大,需要调整一下ipc server的处理能力,几个关键的参数有:
ipc.server.listen.queue.size default:128

建议把这个参数调的大一些,例如:20480,一定要远大于默认的128,集群机器上千台的时候,这个参数太小会导致客户端出现time out 问题


ipc.maximum.data.length
dfs.namenode.handler.count
dfs.namenode.service.handler.count

另外,可能需要调整系统的tcp连接相关参数

系统参数:net.core.somaxconn 会限制  ipc.server.listen.queue.size
如果要调整  ipc.server.listen.queue.size  , 要确认小于系统的 net.core.somaxconn
大并发系统的网络内核参数设置参数可以大一些:
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 1440000
net.core.netdev_max_backlog = 1440000







你可能感兴趣的:(hadoop)