在我们引入一个非常好的细粒子 - 控制的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