1

ここ数か月間、YCSB 0.1.4 を使用して MongoDB 2.6.7 をテストしてきました。SSD と HDD を比較して良好なデータを取得し、エンジニアリング レポートを作成しています。

テストが完了した後、allanbank 非同期ドライバーを調査したいと思いました。起動して実行したとき (私は開発者ではないので、私にとっては挑戦でした)、最初に再構築された同期ドライバーを試してみたかったのです。ワークロードにもよりますが、パフォーマンスが 30 ~ 100% 向上し、非常に満足しています。

次に、非同期ドライバーを試しました。ネイティブ ドライバーを使用した場合と、私の結果との間に大きな違いは見られませんでした。

私が実行しているコマンドは次のとおりです。

./bin/ycsb run mongodb -s -P workloads/workloadb -p mongodb.url=mongodb://192.168.0.13:27017/ycsb -p mongodb.writeConcern=strict -threads 96

テストの過程で (主にネイティブ ドライバーを使用)、96 より多いスレッドと少ないスレッドを試しました。「noatime」をオンにしました。xfs と ext4 の両方を試しました。ハイパースレッディングを無効にしました。12コアの半分を無効にしました。ジャーナルを別のドライブに置きます。同期を 60 秒から 1 秒に変更。クライアントとサーバー間のネットワーク帯域幅をチェックして、オーバーサブスクライブしていないことを確認しました (10GbE)。

フィードバックや提案は大歓迎です。

4

1 に答える 1

0

Async の動きは私の期待を上回りました。私の経験では、Python Sync (pymongo) と Async ドライバー (モーター) を使用しており、Async ドライバーは 10 倍以上のスループットを達成しました。さらに、 motor は内部でまだ pymongo を使用していますが、非同期機能を追加しています。これは、allanbank ドライバーの場合に簡単に当てはまります。

多くの場合、劇的な変化は、スレッド化ポリシーと OS 構成から生じます。

非同期は、VM またはマシンのコアよりも多くのスレッドを使用する必要はなく、また使用すべきではありません。たとえば、サーバーコードが着信接続ごとに新しいスレッドを生成している場合、すべての賭けはオフになります。ドライバーがどのように利用されているかを調べることから始めます。4 コアのマシンは、<= 4 の着信スレッドを使用します。

OS レベルでは、net.core.somaxconn、net.core.netdev_max_backlog、sys.fs.file_max、/etc/security/limits.conf nofile などのパラメーターを微調整する必要がある場合があり、開始するのに最適な場所は次のとおりです。これを含むnginx 関連のパフォーマンス ガイド。nginx は、多くの Linux sysadmin 愛好家の先頭に立ったか、少なくとも注目を集めたサーバーです。一般的な言い伝えとは反対に、キープアライブ タイムアウトを長くするのではなく、短くする必要があります。デフォルトのキープアライブ タイムアウトは、ばかげた (4 時間) 秒数です。コードを 1 分で切断したい場合があります。基本的に、クライアントとの短い甘い関係を考えてください。

Mongo は非同期ではないため、Mongo ドライバー プールを使用できることに注意してください。ただし、遅いクエリでドライバーが停止しないようにしてください。Javaで次の同等のものを使用して、5〜10秒で切断します。私はここでカットアンドペーストしているだけで、推奨事項はありません。

# Specifies a time limit for a query operation. If the specified time is exceeded, the operation will be aborted and ExecutionTimeout is raised. If max_time_ms is None no limit is applied.
# Raises TypeError if max_time_ms is not an integer or None. Raises InvalidOperation if this Cursor has already been used.
CONN_MAX_TIME_MS = None

# socketTimeoutMS: (integer) How long (in milliseconds) a send or receive on a socket can take before timing out. Defaults to None (no timeout).
CLIENT_SOCKET_TIMEOUT_MS=None

# connectTimeoutMS: (integer) How long (in milliseconds) a connection can take to be opened before timing out. Defaults to 20000.
CLIENT_CONNECT_TIMEOUT_MS=20000

# waitQueueTimeoutMS: (integer) How long (in milliseconds) a thread will wait for a socket from the pool if the pool has no free sockets. Defaults to None (no timeout).
CLIENT_WAIT_QUEUE_TIMEOUT_MS=None

# waitQueueMultiple: (integer) Multiplied by max_pool_size to give the number of threads allowed to wait for a socket at one time. Defaults to None (no waiters).
CLIENT_WAIT_QUEUE_MULTIPLY=None

うまくいけば、あなたも同じように成功するでしょう。async の前に、Python で救済する準備ができていました

于 2015-03-30T20:36:27.033 に答える