dpvs学习笔记: 13 部署问题汇总

后续测试及部署遇到的问题都会写在这里,官方 faq 里面有常见的问题汇总,强烈建义先读一遍并完全理解内容。

编绎报错问题

/root/dpvs/src//../include/ipvs/conn.h:296:17: error: inline function 'dp_vs_conn_hashkey' declared but never defined [-Werror]
 inline uint32_t dp_vs_conn_hashkey(int af,

测试环境 kernel 4.4.0 gcc 5.4.0 报 inline 函数未定义的错误,需要在 Makefile FLAGS 加入 -fgnu89-inline 参数

vim src/Makefile
CFLAGS += -Wall -Werror -Wstrict-prototypes -Wmissing-prototypes -mcmodel=medium -fgnu89-inline

cpu性能问题

一定要注意 cpu model, 调成高性能模式,否则性能特别差,其它程序也有同样问题,具体可以 google 查看

cpufreq-set -g performance

安装依赖

缺什么就安装什么,线上机器是 ubuntu, 其它版本一样。特别是 dpdk 的 ko 驱动,不同内核版本是不通用的,需要重新编绎

apt-get install libnuma-dev -y
apt-get install libssl-dev -y
apt-get install libpopt-dev -y

网卡 dpdkN 序号确定

Network devices using DPDK-compatible driver
============================================
0000:85:00.0 '82599ES 10-Gigabit SFI/SFP+ Network Connection 10fb' drv=igb_uio unused=ixgbe
0000:85:00.1 '82599ES 10-Gigabit SFI/SFP+ Network Connection 10fb' drv=igb_uio unused=ixgbe

Network devices using kernel driver
===================================
0000:05:00.0 'I350 Gigabit Network Connection 1521' if=eth0 drv=igb unused=igb_uio
0000:05:00.1 'I350 Gigabit Network Connection 1521' if=eth1 drv=igb unused=igb_uio
0000:08:00.0 'I350 Gigabit Network Connection 1521' if=eth2 drv=igb unused=igb_uio
0000:08:00.1 'I350 Gigabit Network Connection 1521' if=eth3 drv=igb unused=igb_uio
0000:83:00.0 '82599ES 10-Gigabit SFI/SFP+ Network Connection 10fb' if=eth4 drv=ixgbe unused=igb_uio
0000:83:00.1 '82599ES 10-Gigabit SFI/SFP+ Network Connection 10fb' if=eth5 drv=ixgbe unused=igb_uio

系统 ethN 和 dpdkN 的这个序号 N 是没有对应关系的,但是可以根据 pci bus id 来确定顺序,比如 0000:85:00.0 就是 dpdk0, 0000:85:00.1 就是 dpdk1,按照序号顺序来排列的。搭建 fnat 如果不确定网卡号可以参考。

关于机器配置

CPU 至少双物理核,24 核心。16 个网卡列队 + 1 个管理核,就需要 17 个了。内存至少 64G,文件描术符硬限制必须要 655350,我司线上 dpvs 启动就用了 40W 个 fd,少了不够用。

关于 TOA 选择

市面上很多 TOA 版本,功能都是一样的,在 option 字段中植入真实的源 ip. 但是一定要注意 opt code, 有的是 200,有的是 254,如果 real server 看不到 src ip, 一定要 tcpdump -x 抓包查看 option

我司线上 lvs 的 real server 就是 200,所以我需要修改 dpvs 代码。另外市面上各种 toa 代码,适配的内核是不相同的。lvs toa 适用于 2.6 内核,dpvs toa 适配于 3.X 内核,如果用 4.X 内核可以考滤 华为TOA, 不过这个版本不支持 ipv6

16:07:32.922478 IP 10.20.23.140.netinfo-local > 10.20.58.21.https: Flags [S], seq 378679560, win 65535, options [Unknown Option 200089e675abc52,mss 1300,nop,wscale 6,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,sackOK,eol], length 0
16:07:36.931742 IP 10.20.23.140.netinfo-local > 10.20.58.21.https: Flags [S], seq 378679560, win 65535, options [Unknown Option 200089e675abc52,mss 1300,nop,wscale 

上面的 Unknown Option 就是 toa, 200 开头的就是 opt code,后面是 32位的 ip 和 port 数据。另外一定要注意,real server 程序监听是 ipv4, 如果 ipv6 暂时不识别,后续有时间再支持。

DEBUG 模式下定时器回调不生效

测试的时候肯定打开 DEBUG 模式,日志级别调成 DEBUG,编绎文件 src/config.mk 所有开关打开。会触发定时器不生效,给官方发 issue 了,可能在他们眼里是 feature 吧。

static void rte_timer_tick_cb(struct rte_timer *tim, void *arg)
{
    struct timer_scheduler *sched = arg;
    struct dpvs_timer *timer, *next;
    uint64_t left, hash, off;
    int level, lower;
    uint32_t *cursor;
    bool carry;

    assert(tim && sched);
#ifdef CONFIG_TIMER_MEASURE
    deviation_measure();
    return;
#endif
  ......
}

具体逻辑就在 timer.c 文件中,rte_timer_tick_cb 在 DEBUG 时直接返回了,跳过正常 conn_expire 逻辑。导致 ipvsadm -ln -c 时看到所有 TIME_WAIT 连接不释放

dpdk ip 不可达问题

这块非专业,需要网络同学指导。遇到过两次问题,测试机原有网卡 bond 过的,拆开后测试 dpvs. 但是交换机 bond 配置没有去掉,导致无法 ping 通。另外一个是加路由,如下所示

dpip addr add 202.108.10.1/32 dev dpdk0

dpip route add 202.108.10.0/30 dev dpdk0
dpip route add 192.168.168.0/24 dev dpdk1

ipvsadm --add-laddr -z 192.168.168.1 -t 202.108.10.1:6379 -F dpdk1

双臂模式下 202.108.10.1 是对外 vip,192.168.168.1 是对内的 local ip. dpdk 默认会加掩码 32 的本机路由,还要分别设置网段的默认路由,一定要注意掩码

fullnat fdir 问题

参照我前一篇《返程数据亲和性》文章,低端网卡是不支持 fdir 的,full-nat 只能用单核,性能差。比如 I350 不支持 fdir, 具体哪些网卡支持 fdir, 可以看官方文档,有连接。

大页内存配置

大页应用比较广,oracle 就可在以配置大页,能够有效的减少 TLB miss. DPVS 使用大页,官方文档有如下操作,配置 2M 的大页,每个 numa node 分配 8192 个,也就是 16G 内存。两个 numa 节点共消耗 32G

$ # for NUMA machine
$ echo 8192 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
$ echo 8192 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages

$ mkdir /mnt/huge
$ mount -t hugetlbfs nodev /mnt/huge

可以通过 free -h 看到大页内存是立即分配使用的。由于测试机内存刚刚 32G,立即触发了内存交换,kswapd0 频繁交换,io 消耗掉所有 cpu.调小 nr_hugepages,太小了不行,比如 1024,那共分配 4G 内存大页。启动 dpvs 初始化时会触发问题

IPVS: fail to init conn: no memory
EAL: Error - exiting with code: 1
Cause: Fail to init ipvs: no memory

那么 dpvs 需要如何分配内存呢?可以顺着代码查看初始化,网卡的 mbuf cache, 流表的 dp_vs_conn cache 等等,参数均可调,线上机器一般至少 64G 内存或更高,可以监控 dpvs 调整参数。

你可能感兴趣的:(dpvs学习笔记: 13 部署问题汇总)