スレッドアフィニティ
このページが Github Wiki ページ から自動生成されていることを知っていますか? 自分自身で向上させることができます。 こちら!
Netty で低レイテンシーのネットワークアプリケーションを開発している場合、スレッドアフィニティと呼ばれるものに気付いたかもしれません。スレッドアフィニティを使用すると、アプリケーションスレッドを特定の CPU コアまたは CPU セットで実行できます。そうすることで、オペレーティングシステムのスケジューリングプロセス中のスレッドの移動を排除できます。幸い、 Java-Thread-Affinity と呼ばれる Java ライブラリがあり、Netty アプリケーションと簡単に統合できます。
まず、次の依存関係を Maven pom.xml
ファイルに追加します。
<dependency>
<groupId>net.openhft</groupId>
<artifactId>affinity</artifactId>
<version>3.0.6</version>
</dependency>
次に、特定の戦略で AffinityThreadFactory を作成し、レイテンシーの影響を受けるスレッドが含まれる EventLoopGroup に渡します。例を次に示します。
final int acceptorThreads = 1;
final int workerThreads = 10;
EventLoopGroup acceptorGroup = new NioEventLoopGroup(acceptorThreads);
ThreadFactory threadFactory = new AffinityThreadFactory("atf_wrk", AffinityStrategies.DIFFERENT_CORE);
EventLoopGroup workerGroup = new NioEventLoopGroup(workerThreads, threadFactory);
ServerBootstrap serverBootstrap = new ServerBootstrap().group(acceptorGroup, workerGroup);
可能な限り低いレイテンシーを実現するには、ターゲット CPU を OS スケジューラから分離することを検討する必要があります。ターゲット CPU を分離すると、OS スケジューラはこれらの CPU で他のユーザー空間にプロセスをスケジュールできなくなります。これは Isolcpus カーネルブートパラメータで実行できます(つまり、isolcpus=<cpu-list>
を grub.conf
に追加します)。
詳細については、このプロジェクトの Github にアクセスしてください。
最終検索: 2024 年 7 月 19 日