作者:李斌,趙學(xué)峰,金融技術(shù)工程師,建筑師,社區(qū)嘉賓作者!應(yīng)用程序服務(wù)性能調(diào)整是每個(gè)系統(tǒng)投入生產(chǎn)之前需要注意的問(wèn)題。
在系統(tǒng)和軟件級(jí)別上有很多關(guān)于調(diào)優(yōu)方法的文章,但是在使用了所有技巧之后,有沒(méi)有挖掘潛力?如果您了解Linux內(nèi)核的運(yùn)行特性并且經(jīng)過(guò)簡(jiǎn)單配置,仍然有許多可行的解決方案。
本文將介紹一種基于Linux內(nèi)核CPU親和力參數(shù)調(diào)整的解決方案,以壓縮最后一條性能優(yōu)勢(shì)。
& nbsp; 1.背景知識(shí)CPU是常規(guī)應(yīng)用程序計(jì)算的核心。
從性能的角度來(lái)看,您至少需要了解物理CPU,邏輯CPU和超線程技術(shù)的實(shí)現(xiàn)。
1.物理CPU:計(jì)算機(jī)上實(shí)際安裝的CPU數(shù)量。
2.邏輯CPU:一個(gè)物理CPU具有多個(gè)邏輯計(jì)算核心。
基于英特爾的超線程技術(shù),可以在此基礎(chǔ)上形成更多的核心計(jì)算能力。
3.超線程技術(shù)(Hyper-Threading):它使用特殊的硬件指令將一個(gè)CPU內(nèi)核模擬為多個(gè)邏輯CPU,從而形成一個(gè)多核和多線程CPU。
總之,這三個(gè)之間的邏輯關(guān)系如下:邏輯CPU的數(shù)量=物理CPU的數(shù)量* CPU核心的數(shù)量* 2(如果支持并啟用了超線程)。
2. CPU親和力參數(shù)原理CPU的親和力是一個(gè)調(diào)度屬性,可以將一個(gè)進(jìn)程綁定到一個(gè)或一組CPU。
CPU親和力分為兩種類型:軟親和力和硬親和力。
1)軟CPU親和性意味著該進(jìn)程應(yīng)在??指定的CPU上盡可能長(zhǎng)地運(yùn)行,而不必遷移到其他處理器上運(yùn)行。
Linux內(nèi)核的特性意味著進(jìn)程通常不會(huì)在處理器之間頻繁遷移,以避免這種遷移消耗計(jì)算能力并實(shí)現(xiàn)最佳平衡。
2)Linux內(nèi)核還包括硬CPU親和力機(jī)制,該機(jī)制使開(kāi)發(fā)人員可以實(shí)現(xiàn)硬CPU親和力。
這意味著您可以顯式指定該進(jìn)程在哪個(gè)處理器上運(yùn)行。
在Linux內(nèi)核中,進(jìn)程數(shù)據(jù)結(jié)構(gòu)是task_struct,與親和性相關(guān)的結(jié)構(gòu)是cpus_allowed位掩碼。
該位掩碼由n位組成,并且與系統(tǒng)中的n個(gè)邏輯CPU一對(duì)一對(duì)應(yīng)。
如果為給定進(jìn)程設(shè)置了給定位,則該進(jìn)程可以在相關(guān)的CPU上運(yùn)行。
以32個(gè)邏輯CPU服務(wù)器為例:0x00000001處理器0邏輯CPU可以運(yùn)行0x00000003處理器0-1邏輯CPU可以遷移并運(yùn)行0xFFFFFFFF處理器0-31邏輯CPU可以遷移并運(yùn)行(Linux內(nèi)核默認(rèn)狀態(tài))。
通常,Linux內(nèi)核可以很好地調(diào)度進(jìn)程并在應(yīng)運(yùn)行的位置(即在可用處理器上運(yùn)行)運(yùn)行它們,并獲得良好的整體性能。
Linux內(nèi)核包含一些用于檢測(cè)CPU之間的任務(wù)負(fù)載遷移的算法,并且可以啟用進(jìn)程遷移以減輕繁忙處理器的壓力。
& nbsp;第三,CPU相似性設(shè)置Linux提供了一些方法,這些方法允許用戶修改位掩碼以指定該進(jìn)程只能在特定(或特定)CPU上運(yùn)行。
通常,您只需要在應(yīng)用程序中使用默認(rèn)的調(diào)度程序行為。
但是,有時(shí)我們可能希望修改這些默認(rèn)行為以實(shí)現(xiàn)性能優(yōu)化。
一般來(lái)說(shuō),出于以下三個(gè)原因,我們想使用硬CPU親和力:有很多計(jì)算要做;應(yīng)用程序很復(fù)雜;并且時(shí)間敏感且決定性的過(guò)程正在運(yùn)行。
總結(jié)了各種方法之后,以下兩個(gè)清晰的示例說(shuō)明了CPU親和力的配置。
1)在應(yīng)用程序源代碼中設(shè)置CPU親和力。
可以通過(guò)編程來(lái)實(shí)現(xiàn)硬CPU親和力設(shè)置。
Linux內(nèi)核提供了一些系統(tǒng)API,例如:sched_set_affinity(),sched_get_affinity(),CPU_ZERO(),CPU_SET()等。
設(shè)置硬CPU親和性的簡(jiǎn)單示例如下:#include #include #include #include #include& nbsp; int main(void){int i,nrcpus; cpu_set_t掩碼;無(wú)符號(hào)長(zhǎng)位掩碼= 0; CPU_ZERO(& amp; mask); //清空一組CPU_SET(0,& amp; mask); //將給定的CPU0添加到集合CPU_SET(2,& amp; mask); //如果(sched_setaffinity(0,sizeof(cpu_set_t),& amp; mask)== -1 ){perror(“ sched_setaffinity”); exit(-1);}返回0;}& nbsp; 2)通過(guò)命令設(shè)置CPU親和力。
硬CPU親和性設(shè)置也可以由taskset命令設(shè)置。
任務(wù)集的命令格式為:任務(wù)集[選項(xiàng)]掩碼命令[arg]…任務(wù)集[選項(xiàng)]& nbsp; –p [掩碼] pid& nbsp; mask是CPU關(guān)聯(lián)性命令,是可執(zhí)行程序arg,是命令pid的參數(shù),是進(jìn)程ID。
第一個(gè)命令是我們