この質問で、単一のサーバーから40Gbpsを配信するのに最適な構成/ハードウェアを見つけたいと思います。
状況
背後にある低速のストレージサーバーからピークをオフロードするビデオ共有プロキシサーバーがあります。すべてのトラフィックはHTTPのみです。サーバーは、リバースプロキシ(サーバーにキャッシュされないファイル)およびWebサーバー(ローカルドライブに保存されるファイル)として機能します。
現在、100 TB程度のファイルがあり、バックエンドストレージサーバーで増加しています。
キャッシングメカニズムは独立して実装されており、非常にうまく機能するため、この質問はそれ自体をキャッシングすることに関するものではありません。したがって、キャッシュの使用状況は良好です。
ゴール
1台のマシンで40Gbps以上のスループットを実現します。
ハードウェア1
ハードウェア:Supermicro SC825、X11SSL-F、Xeon E3-1230v5(4C/8T@3.4GHz)、16GB DDR4 RAM、2x Supermicro 10G STGN-i1S(LACP L3 + 4)
SSD:512GB Samsung x 1、500GB Samsung x 2、480GB Intel 535 x 2、240GB Intel S3500 x 1
システム:
- irqbalancerが停止しました
- 各インターフェースのset_irq_affinity(ixgbeドライバーtarballのスクリプトを使用)
- ixgbe-4.3.15
- I / Oスケジューラーの期限
- iptables空(アンロードされたモジュール)
- ファイルシステム:XFS
Nginx:
- sendfile off
- aioスレッド
- directio 1M
- tcp_nopush on
- tcp_nodelay on
グラフからわかるように、12.5Gbpsをプッシュすることができました。残念ながら、サーバーは応答していませんでした。
気になったことが2つあります。1つ目は、大量のIRQです。この場合、残念ながら/ proc / interruptsからのグラフはありません。2番目の問題は、システム負荷が高いことでした。これは、kswapd0が16GのRAMでしか機能しないために発生したと考えられます。
ハードウェア2
ハードウェア:Supermicro SC119TQ、X10DRW-i、2x Xeon E5-2609v4(8C/8T@1.70GHz)、128GB DDR4 RAM、2x Supermicro 10G STGN-i1S
SSD、システム構成はハードウェア1と同じです。nginxはsendfileです(さらにaio / sendfileを比較)。
これはより良いように思えるので、ピーク時に動作するサーバーがあるので、いくつかの最適化を試すことができます。
Sendfileとaioスレッド
sendfileを無効にして、代わりにaioスレッドを使用しようとしました。
- sendfile off
- aioスレッド
- directio 1M(すべてのファイルに一致します)
対
- sendfileを
その後、15:00にsendfileに切り替えてnginxをリロードしました(そのため、既存の接続を完了するのにしばらく時間がかかりました)。ドライブ使用率(iostatで測定)が下がったのは素晴らしいことです。トラフィックに変更はありません(残念ながら、zabbixはbond0からデータを収集しないことを決定しました)。
sendfileのオン/オフ
送信のオン/オフを切り替えてみました。割り込みの再スケジュール以外は何も変更されていません。
server / cron / disabledとしてのirqbalancer
@lsdで述べたように、cron経由で実行されるようにirqbalancerを設定しようとしました:
*/5 * * * * root /usr/sbin/irqbalance --oneshot --debug 3 > /dev/null
残念ながら、私の場合は役に立ちませんでした。ネットワークカードの1つが異常な動作を始めました:
グラフのどこに問題があるのかを見つけることができませんでした。翌日に再び発生したため、サーバーにログインして、1つのコアが100%(システム使用率)であることがわかりました。
irqbalanceをサービスとして開始しようとしましたが、結果は同じでした。
次に、set_irq_affinityスクリプトを使用することを決定し、それによって問題がすぐに修正され、サーバーは再び17Gbpsをプッシュしました。
ハードウェア3
新しいハードウェアにアップグレードしました:2U 24(+2)ドライブシャーシ(6xSFF)、2x Xeon E5-2620v4、64GB DDR4 RAM(4x16GBモジュール)、13x SSD、2x Supermicro(Intelチップ搭載)ネットワークカード。新しいCPUはパフォーマンスを大幅に改善しました。
現在の設定はそのままです-sendfileなど。唯一の違いは、(set_irq_affinityスクリプトを介して)単一のCPUで両方のネットワークカードを処理できることです。
20Gbpsの制限に達しました。
次の目標は?30Gbps。
パフォーマンスを改善する方法についてのアイデアを私に自由に発射してください。私はそれをライブでテストし、ここでいくつかの重いグラフを共有したいと思います。
CPUで大量のSoftIRQを処理する方法はありますか?
これはキャパシティプランニングについての質問ではありません。すでにハードウェアとトラフィックを持っています。私はいつでもトラフィックをいくつかのサーバーに分割し(とにかくこれをやらなければならないでしょう)、お金の問題を解決できます。ただし、これは、実際のシナリオでのシステムの最適化とパフォーマンスの調整に関する問題です。