小编典典

负载平衡线程请求百分比

algorithm

我有一个工作线程池,我根据百分比在其中发送请求。例如,工作人员1必须处理总请求的60%,工作人员2必须处理总请求的31%,最后工作人员3必须处理9%。我需要数学上知道如何缩小数字并保持比例,因此我不必向线程1发送60个请求,然后再开始向工作人员2发送请求。这听起来像是“线性比例”数学方法。无论如何,我们都欢迎您对此问题提供所有意见


阅读 236

收藏
2020-07-28

共1个答案

小编典典

思考此问题的一种方法使其与在基于像素的显示器上绘制斜线的问题非常相似,这可以通过布雷森汉姆算法来完成。

首先,为简单起见,我们假设只有2个工作程序,并且它们应该占传入请求的分数p(对于工作程序1)和(1-p)(对于工作程序2)。想象一下,“发送给工作人员1的请求”是图的水平轴,“发送给工作人员2的请求”是图的垂直轴:我们要做的是在该图中绘制一条从(0,
0)并且具有斜率(1-p)/
p(即,向右前进的每p单位,向上推动(1-p)个单位)。收到新请求时,将绘制一个新像素。这个新像素将始终位于前一个像素的右侧(如果我们将作业分配给工人1)或紧邻它的上方(如果我们将其分配给工人2),因此它不像布雷森纳姆算法那样,对角线运动是可能,但是有相似之处。

随着每个新请求的到来,我们必须将该请求分配给其中一个工作程序,这对应于从上一个像素向右或向上绘制下一个像素。我建议选择正确方向的一种好方法是选择
使误差函数最小的方法。 最简单的方法是取(0,0)与从两种可能的选择中的每一个得出的点之间的直线的斜率,并将这些斜率与理想斜率(1-p)/
p进行比较;然后选择差异最小的那个。这将导致绘制的像素尽可能接近“跟踪”理想线。

要将其推广到2个以上的维度(工作人员),我们不能直接使用斜率。如果有W工人,我们需要提出一些函数误差(X,Y),其中X和Y都是W维向量,一个代表理想
方向 (与斜率类似的分配请求的比率( 1-p)/
p之前),另一个代表候选点,并返回一些数字,表示它们的方向有多不同。幸运的是,这很容易:我们可以通过除以 两个向量
点积来获取
两个向量之间的角度
余弦值
由其大小的乘积,这很容易计算。如果它们的方向相同,则为1,否则为1,因此,当新请求到达时,我们要做的就是为每个工人1 <= i <=
W执行此计算,并查看哪个错误(X ,Y [i])最接近1:这是向其发出请求的工作人员。

[编辑]

此过程还将适应理想方向的变化。但就目前而言,它努力(尽力) 使到目前为止分配的每个请求总比率
跟踪理想方向,因此,如果该程序已经运行了很长时间,则即使在目标方向上进行很小的调整也可能导致较大的“摆动”以进行补偿。在那种情况下,当调用error(X,Y
[i])时,最好使用最新像素(请求分配)和某个像素数(例如k =
100)的像素之间的差来计算第二个参数。前。(在原始算法中,我们隐式减去起点(0,0),即k尽可能大。)这仅要求您保留最后选择的k个端点。将k选得太大将意味着您仍然可以得到较大的摆动,而将k选得太小则可能意味着“直线”偏离了正常路线,有些工人根本没有采摘,因为每个作业都极大地改变了方向。

2020-07-28