hadoop ipc server 分析

来源:互联网 发布:环保部水质检测数据 编辑:程序博客网 时间:2024/06/05 20:11

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

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

下面表格是非public的参数:

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

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

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


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

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

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

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

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