OpenSolarisを使用してSunFire X2270(Intel Xeon(Nehalem)プロセッサベースのサーバー)で
memcachedパフォーマンスを
テストした以前の経験を使用して、同じテストをRHEL5を使用して同じサーバーで実行することにしました。
最初のテスト結果の投稿で、可能な限り最高のパフォーマンスを達成するために、Intel Oplin 10GbEネットワークカードを使用したことを既に指摘しました。 結局のところ、このカードをLinuxで使用するには、ドライバーで少し作業してカーネルを再構築する必要がありました。
- RedHatディストリビューション(2.6.18カーネルのバージョン1.3.30-k2)のデフォルトのixgbドライバーでは、テストの実行時にネットワークインターフェイスがハングアップしました。
- そのため、インテルのWebサイト(1.3.56.11-2-NAPI)からドライバーをダウンロードして、再構築する必要がありました。 すべてが彼と一緒に機能し、受け取った最大帯域幅は同じカーネルバージョン2.6.18で232Kオペレーション/秒でした。 ただし、このバージョンのカーネルはマルチスレッドデータ転送をサポートしていません( 約Translator-元の乗算リングで)。
- カーネルバージョン2.6.29にはマルチスレッドデータ転送が含まれていますが、最新のixgbドライバーバージョン1.3.56-2-NAPIは含まれていません。 そのため、新しいバージョンのカーネルとドライバーをダウンロード、コンパイル、およびインストールしました。 これは機能し、少し調整した後、280K op./秒の最大スループットが得られました。
結果
すでに
報告したように、OpenSolarisとmemcached 1.3.2を搭載したシステムでは、最大スループットが約350K op./秒でした。 RHEL5(カーネル2.6.29)と同じバージョンのmemcachedを使用する同じサーバーで、280K op./secを取得しました。 OpenSolarisはLinuxを25%バイパスしていることがわかりました!
Linuxのチューニング
最大のパフォーマンスを得るために、次のシステム値が使用されました。
net.ipv4.tcp_timestamps = 0
net.core.wmem_default = 67108864
net.core.wmem_max = 67108864
net.core.optmem_max = 67108864
net.ipv4.tcp_dsack = 0
net.ipv4.tcp_sack = 0
net.ipv4.tcp_window_scaling = 0
net.core.netdev_max_backlog = 300000
net.ipv4.tcp_max_syn_backlog = 200000
次のixgbドライバー固有のパラメーターが設定されました(受信用に2つのキューと送信用に2つのキュー)
RSS = 2.2 InterruptThrottleRate = 1600.1600
OpenSolarisのチューニング
/ etc / systemで、MSI-Xに次のパラメーターを設定します(
翻訳者のメモは元のMSIXにありますが、パラメーターはMSI-Xに特に関連しています)。
ddi_msix_alloc_limit = 4を設定
pcplusmpの設定:apic_intr_policy = 1
ixgbeインターフェースの場合、4番目の送信キューと4番目の受信キューにより、パフォーマンスが向上しました。
tx_queue_number = 4、rx_queue_number = 4
さらに、別のプロセッサコアをネットワークインターフェイスに割り当てました。
dladm set-linkprop -p cpus = 12,13,14,15 ixgbe0
Upd :2x2を使用した理由のシャンティの答え:基本的に、さまざまな設定を試して、どれが最高のパフォーマンスを発揮するかを確認しました。 Linuxでは、2 + 2のリングで最高の結果が得られました。 OpenSolarisでは、4 + 4でした。 複数のリングに対するLinuxの実装はおそらくまだ十分に機能していないと思われます(比較的新しい)。
短い翻訳:グラジオラスだから