mtcp-stack / mtcp

mTCP: A Highly Scalable User-level TCP Stack for Multicore Systems
Other
1.97k stars 434 forks source link

fail to run epserver #255

Open kwjjyn opened 5 years ago

kwjjyn commented 5 years ago

hi , mtcp team when I run the epserver using the command:

./epserver -p /root/mtcp/html/ -f epserver.conf -N 8

something wrong happened with rte_eth_dev_configure() ,the output is :

# ./epserver -p /root/mtcp/html/ -f epserver.conf -N 8
Configuration updated by mtcp_setconf().
---------------------------------------------------------------------------------
Loading mtcp configuration from : epserver.conf
Loading interface setting
EAL: Detected 32 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Auto-detected process type: PRIMARY
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: No free hugepages reported in hugepages-1048576kB
EAL: Probing VFIO support...
EAL: WARNING: cpu flags constant_tsc=yes nonstop_tsc=no -> using unreliable clock cycles !
EAL: PCI device 0000:00:07.0 on NUMA socket -1
EAL:   Invalid NUMA socket, default to 0
EAL:   probe driver: 1af4:1000 net_virtio
Total number of attached devices: 1
Interface name: dpdk0
EAL: Auto-detected process type: PRIMARY
Configurations:
Number of CPU cores available: 8
Number of CPU cores to use: 8
Maximum number of concurrency per core: 10000
Maximum number of preallocated buffers per core: 10000
Receive buffer size: 8192
Send buffer size: 8192
TCP timeout seconds: 30
TCP timewait seconds: 0
NICs to print statistics: dpdk0
---------------------------------------------------------------------------------
Interfaces:
name: dpdk0, ifindex: 0, hwaddr: 00:16:3E:10:32:E7, ipaddr: 192.168.0.101, netmask: 255.255.255.255
Number of NIC queues: 8
---------------------------------------------------------------------------------
Loading routing configurations from : config/route.conf
fopen: No such file or directory
Skip loading static routing table
Routes:
Destination: 192.168.0.101/32, Mask: 255.255.255.255, Masked: 192.168.0.101, Route: ifdx-0
---------------------------------------------------------------------------------
Loading ARP table from : config/arp.conf
fopen: No such file or directory
Skip loading static ARP table
ARP Table:
(blank)
---------------------------------------------------------------------------------
Initializing port 0... Ethdev port_id=0 requested Rx offloads 0xe doesn't match Rx offloads capabilities 0x21d in rte_eth_dev_configure()
EAL: Error - exiting with code: 1
  Cause: Cannot configure device: err=-22, port=0, cores: 8

Could you give me some advices? Actually there are 32 lcores. After I shut down the HT using the below command because the adjacent processor id has the same core id, there're 16 cpu cores :

echo 0 > /sys/devices/system/cpu/cpu1/online
echo 0 > /sys/devices/system/cpu/cpu3/online
echo 0 > /sys/devices/system/cpu/cpu5/online
[...]
echo 0 > /sys/devices/system/cpu/cpu29/online
echo 0 > /sys/devices/system/cpu/cpu31/online

However , the left cpu ID is even number like cpu0 ,cpu2, cpu4...cpu30. Will this have an effect on the running results ? Actually the RSS RX queue is 8 , so I run the below command to configure the mtcp:

./configure --with-dpdk-lib=$RTE_SDK/$RTE_TARGET CFLAGS="-DMAX_CPUS=8"

I would appreciate it if you could offer me any help .

ajamshed commented 5 years ago

@kwjjyn,

Can you please post the following information:

1) The version of dpdk you are using, 2) The NIC adapter that you are using, and 3) The contents of the ./epserver.conf file.

Thanks.

kwjjyn commented 5 years ago

hi @ajamshed , 1 the version of dpdk is 18.11.2 .
2 about the NIC adapter , the output of ethtool -i eth1 is :

driver: virtio_net
version: 1.0.0
firmware-version:
expansion-rom-version:
bus-info: 0000:00:03.0
supports-statistics: no
supports-test: no
supports-eeprom-access: no
supports-register-dump: no
supports-priv-flags: no

3 the contents of the ./epserver.conf is :

############### mtcp configuration file ###############

# The underlying I/O module you want to use. Please
# enable only one out of the four.
#io = psio
#io = netmap
#io = onvm
io = dpdk

# No. of cores setting (enabling this option will override
# the `cpu' config for those applications that accept
# num_cores as command line arguments)
#
# e.g. in case ./epserver is executed with `-N 4', the
# mtcp core will still invoke 8 mTCP threads if the
# following line is uncommented.
num_cores = 8

# Core mask
core_mask = 000000FF

# Number of memory channels per processor socket (dpdk-only)
num_mem_ch = 4

#--- ONVM specific args ---#
# Service id (required)
#onvm_serv = 1
# Instance id (optional)
#onvm_inst = 1
# Destination id (will forward to another NF)
# If not set will send packets out
#onvm_dest = 2

# Sample ONVM configurations
# Single node epserver <-> epwget
#onvm_serv = 1
#onvm_dest = 2

# Simple endpoint server multi node setup
#onvm_serv = 1
#--------------------------#

# Enable multi-process support
#multiprocess = 1

# Used port (please adjust accordingly)
#------ PSIO ports -------#
#port = xge0 xge1
#port = xge1
#------ DPDK ports -------#
port = dpdk0
#port = dpdk1
#port = dpdk0 dpdk1

# Maximum concurrency per core (default = 10000)
#max_concurrency = 10000

# Maximum number of socket buffers per core (default = 10000)
# Set this to small value if there are many idle connections
#max_num_buffers = 10000

# Receive buffer size of sockets; if not set: rcvbuf = sndbuf
rcvbuf = 8192

# Send buffer size of sockets; if not set: sndbuf = rcvbuf
sndbuf = 8192

# if sndbuf & rcvbuf not set: sndbuf = rcvbuf = 8192

# TCP timeout seconds
# (tcp_timeout = -1 can disable the timeout check)
tcp_timeout = 30

# TCP timewait seconds
tcp_timewait = 0

# Interface to print stats (please adjust accordingly)
# You can enable multiple ports in separate lines
#------ PSIO ports -------#
#stat_print = xge0
#stat_print = xge1
#------ DPDK ports -------#
stat_print = dpdk0
#stat_print = dpdk1

Another thing to mention is that : I use testpmd to find out that the rx offload capabilities is below :

testpmd> show port 0 rx_offload capabilities
Rx Offloading Capabilities of port 0 :
  Per Queue :
  Per Port  : VLAN_STRIP UDP_CKSUM TCP_CKSUM TCP_LRO VLAN_FILTER

which means 0x21d , and I find the rx offload that mtcp required is below from the struct port_conf (111 lines):

.offloads   =   (
#if RTE_VERSION < RTE_VERSION_NUM(18, 5, 0, 0)
                     DEV_RX_OFFLOAD_CRC_STRIP |
#endif /* !18.05 */
                     DEV_RX_OFFLOAD_CHECKSUM  
#ifdef ENABLELRO
                     | DEV_RX_OFFLOAD_TCP_LRO
#endif
                     ),

however, DEV_RX_OFFLOAD_CHECKSUM includes ipv4_checksum which is not included in rx offload capabilities . so I comment DEV_RX_OFFLOAD_CHECKSUM in rx and tx offload . Then the error disappeared . But there is another error occured :

[root@shangqing example]# ./epserver -p /root/mtcp/html/ -f epserver.conf
---------------------------------------------------------------------------------
Loading mtcp configuration from : epserver.conf
Loading interface setting
EAL: Detected 32 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Auto-detected process type: PRIMARY
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: No free hugepages reported in hugepages-1048576kB
EAL: Probing VFIO support...
EAL: WARNING: cpu flags constant_tsc=yes nonstop_tsc=no -> using unreliable clock cycles !
EAL: PCI device 0000:00:07.0 on NUMA socket -1
EAL:   Invalid NUMA socket, default to 0
EAL:   probe driver: 1af4:1000 net_virtio
Total number of attached devices: 1
Interface name: dpdk0
EAL: Auto-detected process type: PRIMARY
Configurations:
Number of CPU cores available: 8
Number of CPU cores to use: 8
Maximum number of concurrency per core: 10000
Maximum number of preallocated buffers per core: 10000
Receive buffer size: 8192
Send buffer size: 8192
TCP timeout seconds: 30
TCP timewait seconds: 0
NICs to print statistics: dpdk0
---------------------------------------------------------------------------------
Interfaces:
name: dpdk0, ifindex: 0, hwaddr: 00:16:3E:10:32:E7, ipaddr: 192.168.0.101, netmask: 255.255.255.255
Number of NIC queues: 8
---------------------------------------------------------------------------------
Loading routing configurations from : config/route.conf
fopen: No such file or directory
Skip loading static routing table
Routes:
Destination: 192.168.0.101/32, Mask: 255.255.255.255, Masked: 192.168.0.101, Route: ifdx-0
---------------------------------------------------------------------------------
Loading ARP table from : config/arp.conf
fopen: No such file or directory
Skip loading static ARP table
ARP Table:
(blank)
---------------------------------------------------------------------------------
Initializing port 0... done:
[dpdk_load_module: 750] Failed to get flow control info!
[dpdk_load_module: 757] Failed to set flow control info!: errno: -95
Port 0, MAC address: 00:16:3E:10:32:E7

Checking link statusdone
Port 0 Link Up - speed 10000 Mbps - full-duplex
third
[mtcp_destroy:1572] All MTCP threads are joined.

So I think this is not the right way.

Another thing worth to be mentioned is that I deployed a vm from vultr.com to run mtcp and followed the install guide of dpdk step by step . There is the same problem.

Could you give me some advices ?

ajamshed commented 5 years ago

@kwjjyn :

Like I said previously, we do not provide support for virtio drivers. However, since you have already made significant progress with the patch-up work, I can try to help you out. It looks like one of the threads quits unexpectedly. Can you please try doing the following:

1- Use ./configure --with-dpdk-lib=$RTE_SDK/$RTE_TARGET --disable-hwcsum and -g gcc switch to re-compile mTCP source. 2- Run epserver on only 1 CPU. 3- Please check the dmesg log in case you see the same output.