以前、UbuntuでOpen vSwitch+DPDKを導入してKVMで利用する手順をここで書かせていただきました。
以前取り上げた方法は全てvHost User Serverモードによって動かす手順です。vHost User ServerモードはOVS-DPDKがリセットされるとソケットが破棄されるため、OVSとQEMUを再起動するまでVMとの接続が再確立されませんでした。
これでは不便だよねということでそのあと開発されたのがvHost User Clientモードです。vHost User ClientモードはOVS-DPDKはvHostクライアントとして動作し、QEMUがサーバーとして動作します。この構成では、Open vSwitchがクラッシュしたとしても、ソケットはQEMUによって管理されるため、vHost User Serverモードよりも接続の復旧が容易になります。
詳細はこちらをご覧ください。
OpenStackでDPDKを使う場合も、Ocata以降ではvHost User Clientモードをサポートしているので、デフォルトではこちらのモードで動作します。vHost User Clientモードを利用するにはOVS 2.6、QEMU 2.7以降が必要です。ただし、RHEL7の場合はqemu-kvm-rhev-2.6.0-23.el7以降のバージョンにバックポートされています。CentOS 7ではバージョン7.3以上で同バージョンのqemu-kvm-evを利用可能です。
vHost User Clientモードに切り替える
以降、これまで紹介した手順でDPDK、OVS、QEMUがインストールされていることを前提に、vHost User Clientモードに切り替える方法をご紹介します。
sockディレクトリー作成
sockファイルを展開するディレクトリーを作成します。
# mkdir -p /usr/local/openvswitch/
sockファイル作成
ファイルを作っておきます。作成したファイルはOpen vSwitchが起動するとsockファイルになるようです。
# touch /usr/local/openvswitch/dpdkvhostclient0 # touch /usr/local/openvswitch/dpdkvhostclient1 (作成するポートの数だけ作成)
ブリッジ作成
dpdkvhostuserclientポートをぶら下げるためのOVSブリッジポートをnetdevタイプで作成します。
# ovs-vsctl add-br ovsbr1 -- set bridge ovsbr1 datapath_type=netdev
ポート作成
ポート作成方法はvHost User Serverモードとほとんど一緒ですが、type=dpdkvhostuserclientという設定とoptionsとしてvhost-server-pathを指定します。
# ovs-vsctl add-port ovsbr1 dpdkvhostclient0 \
-- set Interface dpdkvhostclient0 type=dpdkvhostuserclient \
options:vhost-server-path=/usr/local/openvswitch/dpdkvhostclient0
# ovs-vsctl add-port ovsbr1 dpdkvhostclient1 \
-- set Interface dpdkvhostclient1 type=dpdkvhostuserclient \
options:vhost-server-path=/usr/local/openvswitch/dpdkvhostclient1
DPDKポートのマウント
次に、DPDKデバイスポートを追加します。これはvHost User Serverモードと方法は一緒です。
# ovs-vsctl add-port ovsbr1 dpdk0 -- set Interface dpdk0 type=dpdk
vhostuserclient インターフェイスの追加
virsh editコマンドでvHost User Interfaceを設定します。mode='server'と設定するのがvHost User Serverモードで動かした時と異なる点です。この設定にあるmodeはQEMU側の動作モードを指定します。vHost User ClientモードはQEMUをサーバーモードとして動かすのでmode='server'と設定します。
<interface type='vhostuser'>
<source type='unix'
path='/usr/local/openvswitch/dpdkvhostclient0'
mode='server'/>
<model type='virtio'/>
</interface>
サービスの再起動
Open vSwitchdサービスを再起動します。
# service openvswitch-switch restart
以上で準備完了です。あとは仮想マシンを再起動して、ゲストOSでIPアドレスを設定することでDPDKポートがアクセス可能になります。通信できない場合、またはエラーが出た場合はovs-vswitchd.logを確認してください。
今回取り上げた手順で、CentOS 7 + OVS/DPDK/KVMの構成で稼働していた環境もvHost User Clientモードに切り替えることができたことを最後に付け加えておきます。
作業後のovs-vsctl showコマンドの実行結果
実行結果から、これまでとは異なるモードである「dpdkvhostuserclient」で動いていることがわかります。
# ovs-vsctl show
51bf3a85-d776-47a7-b9cb-2da68f465b3b
Bridge "ovsbr1"
Port "dpdk0"
Interface "dpdk0"
type: dpdk
Port "dpdkvhostclient1"
Interface "dpdkvhostclient1"
type: dpdkvhostuserclient
options: {vhost-server-path="/usr/local/openvswitch/dpdkvhostclient1"}
Port "dpdkvhostclient0"
Interface "dpdkvhostclient0"
type: dpdkvhostuserclient
options: {vhost-server-path="/usr/local/openvswitch/dpdkvhostclient0"}
Port "dpdkvhostclient2"
Interface "dpdkvhostclient2"
type: dpdkvhostuserclient
options: {vhost-server-path="/usr/local/openvswitch/dpdkvhostclient2"}
Port "dpdkvhostclient3"
Interface "dpdkvhostclient3"
type: dpdkvhostuserclient
options: {vhost-server-path="/usr/local/openvswitch/dpdkvhostclient3"}
Port "ovsbr1"
Interface "ovsbr1"
type: internal
ovs_version: "2.6.1"