我目前正在尝试为一个研究项目/开源项目做出贡献,在该项目中,我试图根据Spark中的给定优先级(使用Netty)对某些消息进行优先级排序。我们正在处理的测试用例是在单个实例上,将10GB的消息刷新到TCP缓冲区,但随后出现了具有更高优先级的10KB消息,并且我们希望能够在更高的优先级之前发送更高的优先级。较大的一个已被刷新(x毫秒前)。
一个想法是使用Linux(https://unix.stackexchange.com/questions/5231/how-to-give-http-traffic-higher-priority)中的流量控制来优先考虑TCP。不幸的是,这已尝试过,但效果不佳。同时,我们还为这些数据传输实现了加权队列。即,始终将高优先级的对象一次冲洗,而将低优先级的对象排队。但是,这里的问题是:当Netty完全刷新某些数据时,它可能不会提供有关网络状态的任何反馈信息。如(https://github.com/netty/netty/issues/1847和https://github.com/netty/netty/issues/6541)中所示。
另一个有趣的观察结果是:当我们运行两个Spark实例时,一个实例执行一个小任务(随机播放10MB),另一个实例执行一个巨型工作(随机播放20GB)。小任务的传输时间几乎不受巨型任务的阻碍。不难理解,操作系统将公平地将带宽共享给这两个Spark实例。因此,唯一的可能(当我们在单个Spark实例中同时运行这两个作业时,可能会在那个小作业中造成严重的延迟)是(我们严重怀疑)Netty将数据刷新到JVM管理的中间缓冲区,并且此缓冲区随后将按FIFO顺序将数据刷新到实际的TCP缓冲区。
是否有人有任何想法/方法可以尝试,或者关于我们似乎不知道的JVM / Netty有任何信息?
谢谢!