dpvs学习笔记: 17 压测性能及优化

测试环境

DPVS: Inspur NF5270M3, E5-2630 2.60GHz 24 cores, memory 96G
Real Server: 6 台核数不同的机器,148 个 redis-server
Bench Client: 8 台核数不同的机器,24000 个连接 ping
官方推荐用 f-stack nginx 压测,还要让 real server 跑 dpdk 太麻烦。使用 redis ping 模拟小包,平均 74 bytes, 使用 set 指定 1000 bytes value 来模拟大包。

测试配置及脚本

启动 redis-server 实例,一定要 taskset 绑核

taskset -c 8 ./redis-server ./redis6380.conf
taskset -c 9 ./redis-server ./redis6381.conf
taskset -c 10 ./redis-server ./redis6382.conf
......

测试机启动 redis-benchmark pipeline 压测 ping

#!/bin/sh
cpus=`lscpu | grep '^CPU(s)' | awk '{print $2}'`
for i in `seq 8 $cpus`
do
    nohup taskset -c $i ./redis-benchmark -h 10.20.23.241 -p 6379 -c 100 -n 100000000 -t ping -P 10 -l&
done

统计InPkts OutPkts

ipvsadm -ln --stats 
ipvsadm --zero
dpip link show dpdk0 -s

dpvs配置: two-arm, full-nat, 8 lcores,nic intel 82599ES

性能问题排查

模拟大包时,two-arm 双 10G 网卡很快打满,符合预期。关键转发能力要看小包,也就是 pps (packets per second),发现只有 250w/pps, 远低于官方数据最理想的 1500w

打开 dpvs debug 模式,可以看到增加了 -g ,并且优化级别是 0

# cat src/Makefile | grep -i debug
DEBUG := 1      # enable for debug
ifeq ($(DEBUG),)
    CFLAGS += -g -O0 -D DEBUG

重新压测,并使用 perf 抓取性能数据

perf record -g -p `pidof dpvs` #约 30 秒后 ctrl+c
perf report -i ./perf.data
perf top1

perf top2

由于 dpvs 是多核程序,所以看 lcore-slave-3 即可,一步步观察,INET_HOOK占了 9.85% cpu, 里面的 dp_vs_in 占了 4.21%,rte_rwlock_read_lock/unlock 相关的占了合计 5.1%. 再深入 dp_vs_in 函数,发现 xmit_inbound xmit_outbound tcp_conn_lookup 占用较高,具体到底层函数都是 tcp header checksum 计算相关函数,比较符合预期。那值得怀疑的就是 rte_rwlock_read_lock/unlock,贴上源码:

int INET_HOOK(int af, unsigned int hook, struct rte_mbuf *mbuf,
              struct netif_port *in, struct netif_port *out,
              int (*okfn)(struct rte_mbuf *mbuf))
{
    struct list_head *hook_list;
    struct inet_hook_ops *ops;
    struct inet_hook_state state;
    int verdict = INET_ACCEPT;

    state.hook = hook;
    hook_list = af_inet_hooks(af, hook);

    rte_rwlock_read_lock(af_inet_hook_lock(af));

    ops = list_entry(hook_list, struct inet_hook_ops, list);

    if (!list_empty(hook_list)) {
        verdict = INET_ACCEPT;
        list_for_each_entry_continue(ops, hook_list, list) {
repeat:
            verdict = ops->hook(ops->priv, mbuf, &state);
            if (verdict != INET_ACCEPT) {
                if (verdict == INET_REPEAT)
                    goto repeat;
                break;
            }
        }
    }

    rte_rwlock_read_unlock(af_inet_hook_lock(af));

    if (verdict == INET_ACCEPT || verdict == INET_STOP) {
        return okfn(mbuf);
    } else if (verdict == INET_DROP) {
        rte_pktmbuf_free(mbuf);
        return EDPVS_DROP;
    } else { /* INET_STOLEN */
        return EDPVS_OK;
    }
}
static inline rte_rwlock_t *af_inet_hook_lock(int af)
{
    assert(af == AF_INET || af == AF_INET6);

    if (af == AF_INET)
        return &inet_hook_lock;
    else
        return &inet6_hook_lock;
}

锁的内容是 af_inet_hook_lock(af), 再看实现,居然锁的是一个全局 lock !!! dpdk 程序最忌多个核之间共享数据,特别是锁竞争。查看 git 提交纪录,由 cc5369c1a3bd4fa7bd838c62fc1cb8797db61b4e ipv6/ipvs: ipvs core support ipv6 引入的问题。仔细阅读代码,这个锁只在初始化期有用,运行期完全可以忽略,何况还是个读锁,也就是 INET_HOOK 根本用不到,果断注释掉重新压测。

perf top3

关掉后再次压测,上面的 perf 图里,没有了锁争用问题,占 cpu 比例最高的是 dp_vs_in,集中在 tcp header checksum,这部分没有办法,本身就是 cpu 消耗型的。符合预期。

NETIF: Fail to send 1 packets on dpdk1 tx3
NETIF: Fail to send 7 packets on dpdk1 tx2
NETIF: Fail to send 4 packets on dpdk1 tx2
NETIF: Fail to send 2 packets on dpdk1 tx1
NETIF: Fail to send 1 packets on dpdk1 tx1

如果遇到丢包,也就是 imiss 问题,需要调大 dpvs.conf 队列的 descriptor_number 值,默认的可能有点小,大并发时丢包。

最终压测数据

关掉 DEBUG 模式,77 bytes 小包打到 700w pps, 两个万兆网卡打到 8.5G,网卡先于 dpvs 达到瓶颈,性能比较平稳没有抖动。以后有机会测网卡 bonding 的数据。


grafana

锁的问题和 iqiyi 研发沟通了一下,他们之前的压测数据是引入 ipv6 之前的,后续会再内部进行压测优化性能。多核编程锁还是永恒的话题,一个读锁也会有这么大影响,看来有机会得研究下底层锁的实现。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容