以前、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"