当前位置: 首页 > 网络应用技术

Netty系列:在Netty中实施线程和CPU绑定

时间:2023-03-08 15:50:39 网络应用技术

  在我们引入一个非常好的细粒子 - 控制的Java线程库:Java螺纹亲和力。使用此库可以将线程绑定到特定的CPU或CPU核心,并减少CPU上线程之间的开关,从而提高了效率线程执行。

  尽管Netty足够好,谁不想变得更好?所以出现一个想法,是否可以在Netty中使用Affinity库?

  答案是肯定的,让我们一起看看。

  亲和力以Jar包的形式提供。目前,最新的官方版本为3.20.0,因此我们需要以这种方式介绍:

  引入亲和力后,您将在项目的依赖库中添加一个亲和力LIB软件包,以便我们可以在Netty中快乐地使用Affinity。

  有了亲和力,您如何将亲和力引入Netty?

  我们知道亲和力用于控制线程,也就是说,亲和力与线程有关。让我们看一下Netty的EventloopGroup的基本用法。在这里,nioeeventlooproup作为一个例子。NioEeeventloopGroup具有许多构建功能参数。其中之一被传递到线程中:

  该构造函数指示NioEventloopGroup中使用的线程是由ThreadFactory创建的。在这种方式上,我们找到了Netty和Affinity之间的对应关系。仅构建AFFINITY的螺纹属性。

  Affinity中有一个AffinithReadFactory类,该类专门用于创建与Affinity相对应的线程。

  让我们仔细研究一下AffitityThreadFactory。

  AffinityThreadFactory可以基于不同的AffinityStrategy创建相应的线程。

  亲和力代表线程之间的关系。亲和力,有5个线程关系,即:

  这些关系是通过亲和力的匹配方法实现的:

  匹配传递了两个参数,即引入两个CPUID。LET的same_core作为示例,以查看此数学方法的工作方式:

  可以看出,它的逻辑是获得当前的CPU布局。CPULAYOUT包含基本信息,例如CPU的数量,插座数和每个插座的CPU内核数,并提供了三种方法来返回相应的套接字,核心和线程根据给定的CPUID:

  匹配方法是根据发射的CPUID比较相应的插座和核心信息,从而在5中生成不同的策略。

  看看AffinityThreadFactory的结构函数:

  它可以传递到线程的名称前缀以及是否是监护人线程中。最后,如果策略不通过,则默认值使用affinitystratecties。任何策略,这意味着线程可以分配任何绑定的CPU。

  接下来,查看此线程如何创建一个新线程:

  从上面的代码中可以看出,创建的新线程将带有名称的介绍,然后添加1、2、3、4个后缀。根据《卫报》的标签,setDaemon的标签,调用相应的线程。

  重点是在线程内部运行的可运行内容。在运行方法中,首先调用AcceAiRockBasedOnlast方法获取锁定,在获得锁定的前提下运行相应的线程方法,以便将键入当前运行的线程和CPU。

  从AcquirolockbasedOnlast方法中,我们可以看到,亲和力实际上是链结构。每次请求时,都会调用Lastafinitylock的Acquirolock方法。如果您获得锁定,请替换下一个锁。

  使用AffinityThreadFactory,我们只需要在使用Netty时传递AffinityThreadFactory即可。

  如上所述,在Netty中使用亲和力可以将affitityThreadFactory传递到EventloopGroup中。

  为了获得更好的性能,也可以将亲和力隔离为CPU。隔离的CPU仅允许此应用程序的线程获得更好的性能。

  要使用此功能,您需要使用Linux的Isalcpus。此功能主要是独立使用一个或多个CPU来执行特定的亲和力任务。

  在seliccpus命令之后,您可以连接CPU的ID,也可以修改/boot/grub/grub.conf文件。

  亲和力可以执行线程的极端控制。具有严格性能要求的朋友可以尝试,但是在使用期间,您需要选择适当的亲和力,否则您可能不会得到所需的结果。

  本文的示例可以参考:Learn-netty4

  有关更多内容,请参阅http://www.flydean.com/51- netty-thread-affinity/

  最受欢迎的解释,最深的干货,最简单的教程,您不知道的许多技巧正在等待您发现!

  欢迎注意我的公共帐户:“程序的事情”,了解技术并更好地了解您!

  原始:https://juejin.cn/post/7100829037106298911