仮想化通信

日本仮想化技術株式会社の公式エンジニアブログ

Ubuntu Xenial (16.04) でOpen vSwitch+DPDKな環境を作る(vHost User Clientモード編)

以前、UbuntuでOpen vSwitch+DPDKを導入してKVMで利用する手順をここで書かせていただきました。

tech.virtualtech.jp

tech.virtualtech.jp

tech.virtualtech.jp

以前取り上げた方法は全て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モードよりも接続の復旧が容易になります。

詳細はこちらをご覧ください。

software.intel.com

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"