<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Dpdk on sysarcher/@ich_code</title><link>https://sysarcher.github.io/categories/dpdk/</link><description>Recent content in Dpdk on sysarcher/@ich_code</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Mon, 08 Jul 2019 21:22:37 +0200</lastBuildDate><atom:link href="https://sysarcher.github.io/categories/dpdk/index.xml" rel="self" type="application/rss+xml"/><item><title>Benchmarking DPDK</title><link>https://sysarcher.github.io/posts/dpdk-benchmarking/</link><pubDate>Mon, 08 Jul 2019 21:22:37 +0200</pubDate><guid>https://sysarcher.github.io/posts/dpdk-benchmarking/</guid><description>&lt;p&gt;&lt;em&gt;My reference: &lt;a href="https://software.intel.com/en-us/articles/set-up-open-vswitch-with-dpdk-on-ubuntu-server"&gt;https://software.intel.com/en-us/articles/set-up-open-vswitch-with-dpdk-on-ubuntu-server&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;So I got to play with the Data Plane Development Kit (DPDK) from Intel recently. I planned on replicating the PVP benchmark for my use-case. I set up the following environment:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ubuntu 18.04 (bionic) host with:
&lt;ul&gt;
&lt;li&gt;KVM&lt;/li&gt;
&lt;li&gt;QEMU&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Debian 10 guest images downloaded from: &lt;a href="https://cdimage.debian.org/cdimage/openstack/current/"&gt;https://cdimage.debian.org/cdimage/openstack/current/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A useful tool is &lt;code&gt;numactl&lt;/code&gt; (use &lt;code&gt;apt&lt;/code&gt; to install it). On my non-server system, I don&amp;rsquo;t have multiple socks and multiple cores per sock etc.&lt;/p&gt;</description><content:encoded><![CDATA[<p><em>My reference: <a href="https://software.intel.com/en-us/articles/set-up-open-vswitch-with-dpdk-on-ubuntu-server">https://software.intel.com/en-us/articles/set-up-open-vswitch-with-dpdk-on-ubuntu-server</a></em></p>
<p>So I got to play with the Data Plane Development Kit (DPDK) from Intel recently. I planned on replicating the PVP benchmark for my use-case. I set up the following environment:</p>
<ul>
<li>Ubuntu 18.04 (bionic) host with:
<ul>
<li>KVM</li>
<li>QEMU</li>
</ul>
</li>
<li>Debian 10 guest images downloaded from: <a href="https://cdimage.debian.org/cdimage/openstack/current/">https://cdimage.debian.org/cdimage/openstack/current/</a></li>
</ul>
<p>A useful tool is <code>numactl</code> (use <code>apt</code> to install it). On my non-server system, I don&rsquo;t have multiple socks and multiple cores per sock etc.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>root@machine:~# numactl  -s
</span></span><span style="display:flex;"><span>policy: default
</span></span><span style="display:flex;"><span>preferred node: current
</span></span><span style="display:flex;"><span>physcpubind: 2 3 4 5 6 7 
</span></span><span style="display:flex;"><span>cpubind: 0 
</span></span><span style="display:flex;"><span>nodebind: 0 
</span></span><span style="display:flex;"><span>membind: 0 
</span></span></code></pre></div><h2 id="setting-up-ovsdpdk">Setting up (OVS+DPDK)</h2>
<p>First of all set install OVS-dpdk using <code>apt</code></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo apt-get install openvswitch-switch-dpdk 
</span></span><span style="display:flex;"><span>sudo update-alternatives --set ovs-vswitchd /usr/lib/openvswitch-switch-dpdk/ovs-vswitchd-dpdk
</span></span></code></pre></div><p>Restart the systemd service: <code>sudo systemctl restart openvswitch-switch.service</code></p>
<p>Hugepages will need to be set up. But we need to tell DPDK about that.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>root@machine:~# cat /etc/dpdk/dpdk.conf
</span></span><span style="display:flex;"><span>   ...
</span></span><span style="display:flex;"><span>NR_1G_PAGES=4
</span></span><span style="display:flex;"><span>   ...
</span></span></code></pre></div><h3 id="isolate-some-cpus">Isolate some CPUs</h3>
<p>Edit the value of <code>GRUB_CMDLINE_LINUX_DEFAULT</code> to:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-ini" data-lang="ini"><span style="display:flex;"><span><span style="color:#a6e22e">GRUB_CMDLINE_LINUX_DEFAULT</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;default_hugepagesz=1G hugepagesz=1G hugepages=4 hugepagesz=2M hugepages=2048 iommu=pt intel_iommu=on isolcpus=0,1&#34;</span>
</span></span></code></pre></div><p>And run <code>sudo update-grub</code>.</p>
<p><em>this setting will not need to change afterwards. A reboot of the machine is required. See if the parameters got passed correctly by doing <code>cat /proc/cmdline</code></em></p>
<h3 id="set-up-hugepages">Set up Hugepages</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo mkdir -p /mnt/huge
</span></span><span style="display:flex;"><span>sudo mkdir -p /mnt/huge_2mb
</span></span><span style="display:flex;"><span>sudo mount -t hugetlbfs none /mnt/huge
</span></span><span style="display:flex;"><span>sudo mount -t hugetlbfs none /mnt/huge_2mb -o pagesize<span style="color:#f92672">=</span>2MB
</span></span><span style="display:flex;"><span>sudo mount -t hugetlbfs none /dev/hugepages
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>root@machine:~# grep HugePages_ /proc/meminfo 
</span></span><span style="display:flex;"><span>HugePages_Total:       4
</span></span><span style="display:flex;"><span>HugePages_Free:        1
</span></span><span style="display:flex;"><span>HugePages_Rsvd:        0
</span></span><span style="display:flex;"><span>HugePages_Surp:        0
</span></span></code></pre></div><h2 id="configure-ovs-dpdk">Configure OVS-DPDK</h2>
<p>The database needs to be set up only once (<code>sudo ovs-vsctl --no-wait init</code>)</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-lcore-mask<span style="color:#f92672">=</span>0x03  <span style="color:#75715e"># hopefully: cores, 0,1 </span>
</span></span><span style="display:flex;"><span>sudo ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-socket-mem<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;1024&#34;</span>
</span></span><span style="display:flex;"><span>sudo ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask<span style="color:#f92672">=</span>0x0C <span style="color:#75715e"># we have just one NUMA node</span>
</span></span></code></pre></div><h3 id="create-ovs-dpdk-bridge-and-ports">Create OVS-DPDK Bridge and Ports</h3>
<p><code>dpdkvhostuser</code> is a predefined type. <code>vhost-user</code> is understood by Qemu 2.2 and above.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo ovs-vsctl add-br br0 -- set bridge br0 datapath_type<span style="color:#f92672">=</span>netdev
</span></span><span style="display:flex;"><span>sudo ovs-vsctl add-port br0 vhost-user1 -- set Interface vhost-user1 type<span style="color:#f92672">=</span>dpdkvhostuser
</span></span><span style="display:flex;"><span>sudo ovs-vsctl add-port br0 vhost-user2 -- set Interface vhost-user2 type<span style="color:#f92672">=</span>dpdkvhostuser
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>root@machine:~# ovs-vsctl show
</span></span><span style="display:flex;"><span>c3459670-39b8-43f7-bc57-569672ed79c6
</span></span><span style="display:flex;"><span>    Bridge &#34;br0&#34;
</span></span><span style="display:flex;"><span>        Port &#34;br0&#34;
</span></span><span style="display:flex;"><span>            Interface &#34;br0&#34;
</span></span><span style="display:flex;"><span>                type: internal
</span></span><span style="display:flex;"><span>        Port &#34;vhost-user2&#34;
</span></span><span style="display:flex;"><span>            Interface &#34;vhost-user2&#34;
</span></span><span style="display:flex;"><span>                type: dpdkvhostuser
</span></span><span style="display:flex;"><span>        Port &#34;vhost-user1&#34;
</span></span><span style="display:flex;"><span>            Interface &#34;vhost-user1&#34;
</span></span><span style="display:flex;"><span>                type: dpdkvhostuser
</span></span><span style="display:flex;"><span>    ovs_version: &#34;2.9.2&#34;
</span></span></code></pre></div><h3 id="binding-devices-to-dpdk">Binding Devices to DPDK</h3>
<p><em>We should check <a href="https://core.dpdk.org/supported/">whether the NIC is compatible</a> with DPDK first. The <a href="https://core.dpdk.org/supported/">list</a> on DPDK doesn&rsquo;t seem to have been updated e.g. the <a href="https://doc.dpdk.org/guides-18.11/nics/igb.html?highlight=i210#supported-chipsets-and-nics">documentation itself for newer versions</a> states that the I210 is supported.</em></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo modprobe vfio-pci
</span></span><span style="display:flex;"><span>sudo dpdk-devbind --bind<span style="color:#f92672">=</span>vfio-pci eno1 <span style="color:#75715e"># eno1 is the interface I want to bind to DPDK</span>
</span></span></code></pre></div><p><code>dpdk-devbind --status</code> can be used to check whether the NIC is now using the DPDK compatible driver.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>root@machine:~# dpdk-devbind --status
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span>Network devices using DPDK-compatible driver
</span></span><span style="display:flex;"><span>============================================
</span></span><span style="display:flex;"><span>0000:00:19.0 &#39;Ethernet Connection I217-V 153b&#39; drv=vfio-pci unused=e1000e
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span>Network devices using kernel driver
</span></span><span style="display:flex;"><span>===================================
</span></span><span style="display:flex;"><span>0000:02:00.0 &#39;Killer E220x Gigabit Ethernet Controller e091&#39; if=enp2s0 drv=alx unused=vfio-pci *Active*
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span>    ...
</span></span></code></pre></div><h2 id="vms-quick-start">VMs Quick Start</h2>
<p><a href="https://cdimage.debian.org/cdimage/openstack/current/debian-10.0.1-20190708-openstack-amd64.qcow2">Download Debian 10 (buster)</a> and change the password for <code>root</code> using <code>guestfish</code>. (Debian was an arbitrary choice here.)</p>
<p>Add anything to the images at this point. I downloaded <code>qperf</code> with all it&rsquo;s dependencies and added it:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>PACKAGES<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;qperf iperf&#34;</span>
</span></span><span style="display:flex;"><span>apt-get download <span style="color:#66d9ef">$(</span>apt-cache depends --recurse --no-recommends --no-suggests <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --no-conflicts --no-breaks --no-replaces --no-enhances <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --no-pre-depends <span style="color:#e6db74">${</span>PACKAGES<span style="color:#e6db74">}</span> | grep <span style="color:#e6db74">&#34;^\w&#34;</span><span style="color:#66d9ef">)</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>virt-copy-in -a ./debian-10.0.0-openstack-amd64-2.qcow2  *.deb  /home/
</span></span></code></pre></div><p><code>openssl passwd -1 &lt;password&gt;</code> can be used to generate a password entry, and this can be added to the guest image using:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>guestfish --rw --add ../debian-10.0.0-openstack-amd64.qcow2 --mount /dev/sda1:/ vi /etc/shadow
</span></span></code></pre></div><p>And make 2 copies of the <code>debian-10.0.1-20190708-openstack-amd64.qcow2</code> file. We&rsquo;ll use it as our hard drives for guests.</p>
<h4 id="some-resources-to-read">Some resources to read</h4>
<ul>
<li>File-sharing: <code>https://www.linux-kvm.org/page/9p_virtio</code></li>
<li>OVS+KVM: <code>https://docs.paloaltonetworks.com/vm-series/8-1/vm-series-deployment/set-up-the-vm-series-firewall-on-kvm/performance-tuning-of-the-vm-series-for-kvm/enable-open-vswitch-on-kvm.html#</code></li>
<li>Using <code>testpmd</code> to test DPDK Performance: <code>https://software.intel.com/en-us/articles/testing-dpdk-performance-and-features-with-testpmd</code></li>
<li>Vhost/Virtio in DPDK: <code>https://software.intel.com/en-us/articles/configuration-and-performance-of-vhost-virtio-in-data-plane-development-kit-dpdk</code></li>
</ul>
<h3 id="launching-the-guests">Launching the Guests</h3>
<p>I launched the guests in two separate terminal windows (i.e., copy-paste instead of executing).</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>root@machine:~# cat ./launch-os.sh 
</span></span><span style="display:flex;"><span># Launch OS1
</span></span><span style="display:flex;"><span>qemu-system-x86_64 -m 1024 -smp 4 -cpu host -hda ./debian-10.0.0-openstack-amd64.qcow2 -boot c -enable-kvm -no-reboot -net none -nographic -chardev socket,id=char1,path=/run/openvswitch/vhost-user1 -netdev type=vhost-user,id=mynet1,chardev=char1,vhostforce -device virtio-net-pci,mac=00:00:00:00:00:01,netdev=mynet1 -object memory-backend-file,id=mem,size=1G,mem-path=/dev/hugepages,share=on -numa node,memdev=mem -mem-prealloc
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span># Launch OS2
</span></span><span style="display:flex;"><span>qemu-system-x86_64 -m 1024 -smp 4 -cpu host -hda ./debian-10.0.0-openstack-amd64-2.qcow2 -boot c -enable-kvm -no-reboot -net none -nographic -chardev socket,id=char2,path=/run/openvswitch/vhost-user2 -netdev type=vhost-user,id=mynet2,chardev=char2,vhostforce -device virtio-net-pci,mac=00:00:00:00:00:02,netdev=mynet2 -object memory-backend-file,id=mem,size=1G,mem-path=/dev/hugepages,share=on -numa node,memdev=mem -mem-prealloc -fsdev local,security_model=passthrough,id=fsdev0,path=/tmp/share -device virtio-9p-pci,id=fs0,fsdev=fsdev0,mount_tag=hostshare
</span></span></code></pre></div><p>Godspeed!</p>
]]></content:encoded></item></channel></rss>