118 lines
4.1 KiB
Markdown
118 lines
4.1 KiB
Markdown
|
Getting
|
||
|
============
|
||
|
|
||
|
#### Install required packages
|
||
|
Just use your command line
|
||
|
```sh
|
||
|
sudo apt-get update -y
|
||
|
sudo apt-get -y -q install git doxygen hugepages build-essential \
|
||
|
linux-headers-`uname -r` libdpdk-dev libmnl0 libmnl-dev libkmod2 \
|
||
|
libkmod-dev libnuma-dev libelf1 libelf-dev libc6-dev-i386 autoconf \
|
||
|
flex bison libncurses5-dev libreadline-dev python3 graphviz \
|
||
|
python3-pyelftools libboost-all-dev plantuml
|
||
|
|
||
|
pip3 install --user meson ninja
|
||
|
|
||
|
uname -r #Kernel >= 3.16 required
|
||
|
ldd --version #glibc >= 2.7 required
|
||
|
```
|
||
|
|
||
|
#### install DPDK
|
||
|
1. Download from Website
|
||
|
2. extract: tar xf dpdk.tar.gz
|
||
|
3. into folder: cd dpdk
|
||
|
4. build lib, driver, test:
|
||
|
```sh
|
||
|
meson build # incl all examples: meson -Dexamples=all build
|
||
|
ninja -C build
|
||
|
```
|
||
|
5. include dpdk to path
|
||
|
- only for session: `export PATH=$PATH:</path/to/file>`
|
||
|
- permanently add `export PATH=$PATH:</path/to/file>` to your `~/.bashrc` file (at the end).
|
||
|
|
||
|
or with apt `sudo apt install dpdk`
|
||
|
|
||
|
#### Hugepages
|
||
|
5. reserve Hugepages (in runtime):
|
||
|
1. configure Hugepages
|
||
|
`echo 64 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages`
|
||
|
`echo 32 > /sys/devices/system/node/node0/hugepages/hugepages-1048576kB/nr_hugepages`
|
||
|
2. create directory for mounting
|
||
|
`mkdir -p /mnt/huge`
|
||
|
`mountpoint -q /mnt/huge`
|
||
|
`mount -t hugetlbfs nodev /mnt/huge`
|
||
|
3. Check hugpages `grep Huge /proc/meminfo`
|
||
|
6. Run poll mode driver test: `build/app/dpdk-testpmd -c7 --vdev=net_pcap0,iface=eth0 --vdev=net_pcap1,iface=eth1 -- -i --nb-cores=2 --nb-ports=2 --total-num-mbufs=2048`
|
||
|
|
||
|
##### in boot time
|
||
|
Modify Linux boot time parameters inside `/etc/default/grub`. Huge pages will be spread equally between all NUMA sockets.
|
||
|
`GRUB_CMDLINE_LINUX="default_hugepagesz=1G hugepagesz=1G hugepages=32"`
|
||
|
|
||
|
Update the grub configuration file and reboot.
|
||
|
```sh
|
||
|
grub2-mkconfig -o /boot/grub2/grub.cfg
|
||
|
reboot
|
||
|
```
|
||
|
Create a folder for a permanent mount point of hugetlbfs `mkdir /mnt/huge`
|
||
|
|
||
|
Add the following line to the `/etc/fstab` file: `nodev /mnt/huge hugetlbfs defaults 0 0`
|
||
|
|
||
|
Persistent huge pages are never swapped by the Linux kernel!
|
||
|
|
||
|
#### Mac, IP & PCI adress
|
||
|
1. `ifconfig -a` to view MAC and IP adress
|
||
|
2. `ethtool -i <interface name>` to get PCI adress
|
||
|
3. Load ibuverbs on each reboot with `modprobe -a ib_uverbs`
|
||
|
|
||
|
##### TX side
|
||
|
```sh
|
||
|
testpmd \
|
||
|
-l <core-list> \
|
||
|
-n <num of mem channels> \
|
||
|
-w <pci address of the device you plan to use> \
|
||
|
--vdev="net_vdev_netvsc<id>,iface=<the iface to attach to>" \
|
||
|
-- --port-topology=chained \
|
||
|
--nb-cores <number of cores to use for test pmd> \
|
||
|
--forward-mode=txonly \
|
||
|
--eth-peer=<port id>,<receiver peer MAC address> \
|
||
|
--stats-period <display interval in seconds>
|
||
|
```
|
||
|
|
||
|
##### RX side
|
||
|
```sh
|
||
|
testpmd \
|
||
|
-l <core-list> \
|
||
|
-n <num of mem channels> \
|
||
|
-w <pci address of the device you plan to use> \
|
||
|
--vdev="net_vdev_netvsc<id>,iface=<the iface to attach to>" \
|
||
|
-- --port-topology=chained \
|
||
|
--nb-cores <number of cores to use for test pmd> \
|
||
|
--forward-mode=rxonly \
|
||
|
--eth-peer=<port id>,<sender peer MAC address> \
|
||
|
--stats-period <display interval in seconds>
|
||
|
```
|
||
|
|
||
|
#### Problem at Crash
|
||
|
DPDK won't free hugepages and can therefore not be restartet with no hugepages free in system.
|
||
|
|
||
|
Issue could be like you removed `/mnt/huge` and trying to modify the nr_hugepage
|
||
|
```sh
|
||
|
echo 0 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages #Numa case
|
||
|
echo 0 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages #non-NUMA case
|
||
|
```
|
||
|
|
||
|
steps to follow while un-mapping hugepage:
|
||
|
1. `ls -l /mnt/huge/ `
|
||
|
`rm -rf rtemap_*` (if there are any "rtemap_*" delete all)
|
||
|
2. `mount | grep huge`
|
||
|
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,seclabel)
|
||
|
3. `ls /dev/hugepages`
|
||
|
```sh
|
||
|
rtemap_0 rtemap_1202 rtemap_1408 rtemap_1613 rtemap_1819 rtemap_2023 rtemap_387 rtemap_592 rtemap_798
|
||
|
rtemap_1 rtemap_1203 rtemap_1409 rtemap_1614 rtemap_182 rtemap_2024 rtemap_388 rtemap_593 rtemap_799
|
||
|
```
|
||
|
4. If abive files are present delete all of them.
|
||
|
1. `sudo umount /mnt/huge`
|
||
|
2. `sudo rm -R /mnt/huge`
|
||
|
3. Then write 0 to nr_hugepages mentioned at start
|