Redisの高性能理由分析-CPUコアとNUMAアーキテクチャおよび最適化スキームの影響

Redisが広く使用されている非常に重要な理由は、その高性能です。したがって、Redisのパフォーマンスに影響を与える可能性のあるすべての要因、メカニズム、および対策に注意を払う必要があります。Redisのパフォーマンスに影響を与える5つの潜在的な要因は次のとおりです。

  • Redis内のブロック操作
  • CPUコアとNUMAアーキテクチャの影響
  • Redisキーシステム構成
  • Redisメモリの断片化
  • Redisバッファー

この講義では、CPUがRedisのパフォーマンスに与える影響とその対処方法について学びましょう。

主流のCPUアーキテクチャ

学習する前に、まず主流のCPUアーキテクチャとその特性を理解して、CPUがRedisにどのように影響するかをよりよく理解できるようにします。

CPUマルチコアアーキテクチャ

CPUマルチコアアーキテクチャ

  • CPUプロセッサには通常、物理コアと呼ばれる複数のオペレーティングコアがあります。
  • 物理コアには、プライベートレベル1の命令/データキャッシュ(L1キャッシュ)とレベル2のキャッシュ(L2キャッシュ)が含まれます。
  • 各物理コアは、論理コアとも呼ばれる2つのハイパースレッドを実行します。同じ物理コアの論理コアは、L1キャッシュとL2キャッシュを共有します。
  • 異なる物理コアがL3キャッシュを共有します(L3キャッシュ)

マルチCPUソケットアーキテクチャ

マルチCPUソケットアーキテクチャ

マルチCPUアーキテクチャでは、アプリケーションはさまざまなプロセッサで実行できます。

アプリケーションプログラムが異なるソケット間で実行されるようにスケジュールされている場合、アプリケーションプログラムは前のソケットのメモリにアクセスします。このアクセスはリモートメモリアクセスに属します。

ソケットに直接接続されているメモリにアクセスする場合と比較して、リモートメモリアクセスではアプリケーションの遅延が増加します。

このアーキテクチャは、不均一メモリアクセスアーキテクチャ(Non-Uniform Memory Access、NUMAアーキテクチャ)と呼ばれます。

CPUマルチコアがRedisのパフォーマンスに与える影響

CPUマルチコアシナリオでRedisインスタンスが異なるCPUコアで実行されるように頻繁にスケジュールされている場合、Redisインスタンスのリクエスト処理時間はより大きな影響を及ぼします。スケジュールされるたびに、一部のリクエストはランタイム情報、命令、およびデータのリロードプロセスの影響を受けます。これにより、一部のリクエストのレイテンシが他のリクエストよりも大幅に高くなります

Redisを回避するために、常に異なるCPUコアで実行を前後にスケジュールします。最も直接的な方法は、RedisインスタンスをCPUコアにバインドし、RedisインスタンスをCPUコアで実行させることです。

タスクセットコマンドを使用してコアバインドするには:

taskset -c 0 ./redis-server

コアを結び付けることは、テールレイテンシーを削減するだけでなく、平均レイテンシーを削減し、スループットを向上させ、Redisのパフォーマンスを向上させるのにも役立ちます。

CPUNUMAアーキテクチャがRedisのパフォーマンスに与える影響

Redisの実際のアプリケーションには、方法があります。Redisのネットワークパフォーマンスを向上させるために、オペレーティングシステムのネットワーク割り込みハンドラーがCPUコアにバインドされます。

CPUのNUMAアーキテクチャでは、ネットワーク割り込みハンドラーとRedisインスタンスがそれぞれCPUコアにバインドされている場合、潜在的なリスクがあります。ネットワーク割り込みハンドラーとRedisインスタンスに関連付けられているCPUコアが上記の同じCPUソケットでは、Redisインスタンスがネットワークデータを読み取るとき、CPUソケット全体のメモリにアクセスする必要があり、このプロセスにはさらに時間がかかります。

画像

RedisがCPUソケットを介してネットワークデータにアクセスするのを防ぐには、ネットワーク割り込みプログラムとRedisインスタンスを同じCPUソケットに関連付けて、Redisインスタンスがローカルメモリからネットワークデータを直接読み取ることができるようにすることをお勧めします。

画像

CPUのNUMAアーキテクチャでバインドする場合は、CPUコアの番号付け規則に注意してください。lscpuコマンド実行して、コアの番号を表示できます。

lscpu

Architecture: x86_64
...
NUMA node0 CPU(s): 0-5,12-17
NUMA node1 CPU(s): 6-11,18-23
...

しかし、すべてに2つの側面があり、核の結びつきに関連する特定のリスクがあります。次に、その潜在的なリスクと解決策を理解しましょう。

核結合のリスクと解決策

オプション1:1つのRedisインスタンスが物理コアに対応します

コアをRedisインスタンスにバインドする場合、インスタンスを論理コアとバインドするのではなく、物理コアとバインドする必要があります。つまり、物理コアの両方の論理コアを使用します。

オプション2:Redisソースコードを最適化する

Redisソースコードを変更することで、子プロセスとバックグラウンドスレッドが異なるCPUコアに関連付けられます。


これでこの記事は終わりです。興味があれば、私の前の記事を読むことができます。グループ973961276に参加して、コミュニケーションや学習を行うこともできます。グループには多くのビデオ資料や技術専門家がいます。一緒に理解する必要があります。記事で。あなたに良い収穫をさせましょう。

Redis、nginx、skynetのソースコードの分析と探索(パート1)| linux | c / c ++ | redis | epoll | Go lang | nginx | redis | tcp / ip |

 

おすすめ

転載: blog.csdn.net/linuxguitu/article/details/112653562