Handler类:一个线程类,负责执行RPC请求对应的本地函数,然后将结果返回给客户端。Handler线程类的主方法会循环从共享队列CallQueue中取出待处理的Call对象,然后调用Server.call()方法执行RPC调用对应的本地函数。
Responder类:一个线程类,一个Server中只有一个Responder对象,Responder内部包含一个Selector对象responseSelector,用于监听SelectionKey.OP_WRITE事件。responseSelector会循环监控网络环境中是否具备发送数据的条件,之后responseSelector会触发Responder线程发送未完成的响应结果到客户端。
3.4、基于RPC的优化知道了RPC的原理后,下面的优化自然而然就懂了。
Handler线程数目。在Hadoop中,ResourceManager和NameNode分别是YARN和HDFS两个子系统中的RPC Server,其对应的Handler数目分别由参数yarn.resourcemanager.resource-tracker.client.thread-count和dfs.namenode.service.handler.count指定,默认值分别为50和10,当集群规模较大时,这两个参数值会大大影响系统性能
客户端最大重试次数。在分布式环境下,因网络故障或者其他原因迫使客户端重试连接是很常见的,但尝试次数过多可能不利于对实时性要求较高的应用。客户端最大重试次数由参数ipc.client.connect.max.retries指定,默认值为10,也就是会连续尝试10次(每两次之间相隔1秒)
每个Handler线程对应的最大Call数目。由参数ipc.server.handler.queue.size指定,默认是100,也就是说,默认情况下,每个Handler线程对应的Call队列长度为100。比如,如果Handler数目为10,则整个Call队列(即共享队列callQueue)最大长度为:100×10=1000
ipc.server.listen.queue.size控制了服务端socket的监听队列长度,即backlog长度,默认值是128。而Linux的参数net.core.somaxconn默认值同样为128。当服务端繁忙时,如NameNode,128是远远不够的。这样就需要增大backlog,例如3000台集群就将ipc.server.listen.queue.size设成了32768,为了使得整个参数达到预期效果,同样需要将kernel参数net.core.somaxconn设成一个大于等于32768的值。
参考:《Hadoop 2.x HDFS源码剖析》《Hadoop技术内幕 :深入解析YARN架构与实现原理》
https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html
https://blog.csdn.net/lemon89/article/details/17354887