一種動態實現核隔離的方法

天翼雲開發者社群發表於2023-10-30

本文分享自天翼雲開發者社群《 一種動態實現核隔離的方法 》,作者: y****n

一、技術背景

相關概念:

核隔離:指定的cpu核心只參與最低限度的OS核心計算; 

DPDK(Date planedevelopment kit):是一個用來進行包資料處理加速的軟體庫。

Cpu親和性:程式要在某個給定的CPU上儘量長時間地執行而不被遷移到其他處理器的傾向性。

背景:

網元節點上,對cpu消耗比較多的程式可以分為幾個類別:

1、系統執行相關程式(透過systemd啟動和管理的程式以及核心執行緒)

2、網元相關程式(比如dpos、gobgpd程式)。

然而在現網中發現,由於系統執行相關程式與網元相關程式在同核心下執行時,會機率性的搶佔pmd執行緒的cpu,從而導致dpdk丟包,影響網元效能。一般使用的隔離系統程式方法如修改grub檔案、tuned調優方式都需要重啟才能生效,對於已經部署到現網的網元而言,這些方式會對使用者業務造成極大的影響。

因此,需要尋求一種核隔離方法,使得系統程式和網元程式互相隔離,互不影響,以解決網元裝置在系統程式搶佔業務程式cpu核心時可能出現的網路延時變高,丟包等問題,提高網路通訊的效能和可靠性。並且對於現網上執行的網元節點能夠做到無感知。

二、方案設計及實現

本方案主要是隔離systemd啟動和管理的程式的cpu核,限制其執行在網元程式的預留核上。

1、確定cpu預留核分配策略

根據系統規格的不同,確定不同的cpu核心分配策略。如1Numa8Cores的系統,可將系統程式分配到0-2核上;或者2Numa96Cores的系統。可將系統程式分配到numa0的前3個cpu核以及numa1的後3個cpu核上,其餘的核心為網元程式所佔用。分配策略需按照伺服器規格以及實際需求進行設計。

2、設定systemd程式親和性

透過修改/etc/systemd/system.conf檔案中的CPUAffinity中的值,將其改為第一步中的預留核數,如0-2。

透過systemd 

3、設定systemd子程式親和性

對於systemd啟動和建立的程式主要分為幾類:

1、正在執行的systemd子程式

2、後續由systemd建立或者重啟的子程式

對於後續需要由systemd建立的程式或者重啟的程式,其cpu親和性會自動與systemd保持一致,因此只需要考慮正在執行的systemd子程式的核隔離。對此,採用taskset -cp cpus pid的方式進行設定。taskset是linux作業系統中的一個命令,它可以對程式進行CPU親和性設定,即讓程式在指定的CPU核心或者CPU核心集合上執行。

透過cgroup和taskset兩種方式的結合,可以實現在現網執行過程中,動態的對系統相關的程式(尤其是systemd啟動和管理的程式)進行核隔離的目的。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70014251/viewspace-2991753/,如需轉載,請註明出處,否則將追究法律責任。

相關文章