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閱讀 228,983評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,772評論 3 422
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,947評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,201評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,960評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,350評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,406評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,549評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,104評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,914評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,089評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,647評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,340評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,753評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,007評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,834評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,106評論 2 375

推薦閱讀更多精彩內容