我正在寻找一种自动方式来进行负载平衡,这个模块吸引了我。
正如手册所说,
pool 可用于运行一组 Erlang 节点作为计算处理器池。它被组织为一个主节点和一组从节点,并包括以下功能:
- 从节点定期向主节点发送有关其当前负载的报告。
- 可以向主节点发送查询以确定哪个节点的负载最小。
BIF 统计信息(run_queue)用于估计未来的负载。它返回 Erlang 运行时系统中准备运行进程的队列长度。
从节点发送定期报告的频率和负载是多少?
这是进行负载平衡的正确方法吗?
我正在寻找一种自动方式来进行负载平衡,这个模块吸引了我。
正如手册所说,
pool 可用于运行一组 Erlang 节点作为计算处理器池。它被组织为一个主节点和一组从节点,并包括以下功能:
- 从节点定期向主节点发送有关其当前负载的报告。
- 可以向主节点发送查询以确定哪个节点的负载最小。
BIF 统计信息(run_queue)用于估计未来的负载。它返回 Erlang 运行时系统中准备运行进程的队列长度。
从节点发送定期报告的频率和负载是多少?
这是进行负载平衡的正确方法吗?
报告每 2 秒发送一次,并使用从中收集的信息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