我正在寻找一种自动方式来实现我的负载平衡,这个模块吸引了我。
正如手册所说,
pool可用于将一组Erlang节点作为计算处理器池运行。 它被组织为主节点和一组从节点,并包含以下功能:
- 从属节点定期向主站发送有关其当前负载的报告。
- 可以将查询发送给主服务器,以确定哪个节点的负载最小。
BIF统计数据(run_queue)用于估计未来负载。 它返回Erlang运行时系统中准备运行进程的队列长度。
从节点发送常规报告的频率和负载是多少?
这是实现负载平衡的正确方法吗?
答案 0 :(得分:1)
发送报告every 2 seconds并使用从statistics(run_queue)
收集的信息来确定负载最小的节点。 run_queue
返回当前节点的调度程序的队列大小。
当您致电pool:get_node/0
时,您正在获得等待在其上执行的任务数量最少的节点的调度程序。请记住,节点按排序顺序保留,因此对pool:get_node/0
的调用不会直接查询节点,而是依赖可能长达2秒的信息。
如果您需要负载平衡的节点池,pool
效果很好。
以下是来自pool.erl来源的更多信息:
%% Supplies a computational pool of processors.
%% The chief user interface function here is get_node()
%% Which returns the name of the nodes in the pool
%% with the least load !!!!
%% This function is callable from any node including the master
%% That is part of the pool
%% nodes are scheduled on a per usgae basis and per load basis,
%% Whenever we use a node, we put at the end of the queue, and whenever
%% a node report a change in load, we insert it accordingly