Linux Kernelのnetwork方式に対するリクエスト考察


OLS2009で発表されているように、MultiQueueやRPS、そしてFDIRのようにネットワークを取り囲む環境は今ちょうど新しい機能が次々と導入されつつある。
それは、CPUのシングルスレッド性能の向上が止まったのを回避するための施策であるが、これらの対応はkernelにとどまることなく、アプリケーション側からも対応しなければ速度を引き出すことは出来ない。
ここでは、UltraMonkey-L7のMultiThreadModelを考慮して検証を行う

MultiQueueを利用した時の起動シーケンスと必要データ
l7vsd_startup_mq.png.PNG
起動時にMultiQueueを使用してるときほしい情報

情報名概要
MQのON/OFFMQ対応のNICでもON/OFFが出来るため
FlowDirectorのON/OFF将来的にFlowDirectorがON固定になるかもしれないが、使えない環境ではプログラムが変更になる
Queueの振り分け種別接続を振り分けるときにIP/PORTやMACアドレス等色々な種類で振り分けるはず。振り分け種類は起動時に確定するはず
Queue総数Queue:ThreadPoolの比率で作成するため、全thread数はQueueの数 x ThreadPool一つあたりの数になる
各Queueに紐づけられているCPUThreadPoolはCPUごとに(sched_set_affinityを利用して)くくりつけるため、最初に必要

RPSを使用したときの起動シーケンスと必要データ
l7vsd_startup_rps.png.PNG
起動時にFlowDirectorを利用している時ほしい情報

情報名概要
FlowDirectorのON/OFFkernel機能であるFlowDirectorが有効かどうか
使用するCPUMask現状sysfsで提供されている(未確認)
CPU振り分け種別RPSで振り分けるキーはIP/PORT?(要調査)

HTTPサーバをMultiQueue + FlowDirector=OFFで中継する場合
l7vsd_http_seq_mq.png
FlowDirector=OFFの場合は送信から始まるRealServerSideThreadを考慮する必要がある。
上記シーケンスを解説すると、

  1. LisningThreadがClientからの接続をacceptしたときに、以降Clientとの通信を行うThreadが動くCPUの情報を得る。
  2. LisningThreadは取得したCPUに結びついているThreadPoolよりThreadを一つ取り出しClientSideThreadとしてFDをコピーする(そして、LisningThreadは再びLisnに戻る)
  3. ClientSideThreadはl7vsdのプロトコルモジュール処理を行い、RealServerのアドレスを確定する。
  4. 確定したRealServerのアドレスから使用するQueueにくくりついたCPU情報を取得する。
  5. 取得したCPUに結びついているThreadPoolよりThreadを一つ取り出し、RealServerSideThreadとしてアドレス情報をコピーする。
  6. RealServerSideThreadはアドレス情報よりRealServerに対してConnectを行う

と、なりkernelより取得すべき情報は

情報名概要
acceptしたFDからのCPU情報今現在使用しているコネクションのFDが使用しているqueueにくくりついたCPU番号
ADDRINFOからのCPU情報振り分け種類がIP/PORTの時のみ、ADDRINFOにて使用するqueueにくくりついたCPU番号

これらの情報は一接続ごとに問い合わせを行う必要があるため、sysfsでは速度的にコストがかかりすぎる懸念があり、ioctlもしくは、専用APIでのアクセスが望ましい。
ちなみにFlowDirectorがOnの場合には送信時に使ったQueueが受信時にも使われるため、プログラムとしてはラウンドロビン的にThreadPoolからRealServerThreadをActiveにすればよい。

HTTPサーバをRPS+MultiQueueで中継する場合
l7vsd_http_seq_rps.png
RPSを使用しているときのシーケンスは

  1. LisningThreadがClientからの接続をacceptしたときに、以降Clientとの通信を行うThreadが動くCPUの情報を得る。
  2. LisningThreadは取得したCPUに結びついているThreadPoolよりThreadを一つ取り出しClientSideThreadとしてFDをコピーする(そして、LisningThreadは再びLisnに戻る)
  3. 送信処理のCPUMaskは起動時得られる?

と、なりkernelより取得すべき情報は

情報名概要
acceptしたFDからのCPU情報今現在使用しているコネクションのFDがのパケット処理を行うCPU番号
送信するNICに割り込みを上げているCPU動的に変化するわけではないから、.confで間に合う?

RPSとMQの同時使用の場合は考察すべき部分がもう少し増えます。
受信CPU選択時にRPSのほうが有効になる?か、要調査。 Pour participer garder le numéro, vous aurez Bill opérateur d'identification (obligatoire à votre portabilité du numéro) numero rio. Vous obtiendrez pouvez obtenir pour totalement gratuit par appelant mots du serveur ou du service à la clientèle votre propre fournisseur rio bouygues . Vous ne obtenir un SMS utilisant votre. Avec votre actuelle numero rio orange, alors vous êtes capable d' à l' offre de votre à propos rouge.