0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

perf 在內(nèi)核中的實(shí)現(xiàn)原理

Linux閱碼場(chǎng) ? 來(lái)源:Linux閱碼場(chǎng) ? 作者:Linux閱碼場(chǎng) ? 2022-10-17 09:24 ? 次閱讀

我們?cè)凇兑晃目炊?a href="http://ttokpm.com/v/tag/538/" target="_blank">Linux性能分析|perf 原理》一文中介紹過(guò),perf 是基于采樣來(lái)對(duì)程序進(jìn)行分析的。采樣的步驟如下:

通過(guò)設(shè)置一個(gè)定時(shí)器,定時(shí)器的觸發(fā)時(shí)間可以由用戶設(shè)定。

定時(shí)器被觸發(fā)后,將會(huì)調(diào)用采集函數(shù)收集當(dāng)前運(yùn)行環(huán)境的數(shù)據(jù)(如當(dāng)前正在執(zhí)行的進(jìn)程和函數(shù)等)。

將采集到的數(shù)據(jù)寫入到一個(gè)環(huán)形緩沖區(qū)(ring buffer)中。

應(yīng)用層可以通過(guò)內(nèi)存映射來(lái)讀取環(huán)形緩沖區(qū)中的采樣數(shù)據(jù)。

上述步驟如下圖所示:

bd863970-4db2-11ed-a3b6-dac502259ad0.png

接下來(lái),我們將會(huì)介紹 perf 在 Linux 內(nèi)核中的實(shí)現(xiàn)。

事件

perf 是基于事件進(jìn)行采樣的,上面所說(shuō)的定時(shí)器就是其中一種事件,被稱為:CPU時(shí)鐘事件。除了 CPU 時(shí)鐘事件外,perf 還支持多種事件,如:

上下文切換事件:當(dāng)調(diào)度器切換進(jìn)程時(shí)觸發(fā)。

缺頁(yè)異常事件:當(dāng)進(jìn)程訪問(wèn)還沒(méi)有映射到物理內(nèi)存的虛擬內(nèi)存地址時(shí)觸發(fā)。

CPU遷移事件:當(dāng)進(jìn)程從一個(gè) CPU 遷移到另一個(gè) CPU 時(shí)觸發(fā)。

...

由于 perf 支持的事件眾多,所以本文只挑選CPU時(shí)鐘事件進(jìn)行分析。

1. perf_event 結(jié)構(gòu)體

Linux 內(nèi)核使用perf_event結(jié)構(gòu)體來(lái)描述一個(gè)事件(如 CPU 時(shí)鐘事件),其定義如下(由于 perf_event 結(jié)構(gòu)體過(guò)于龐大,所以對(duì)其進(jìn)行簡(jiǎn)化):

structperf_event{
...
structlist_headevent_entry;
conststructpmu*pmu;
enumperf_event_active_statestate;
atomic64_tcount;//事件被觸發(fā)的次數(shù)
...
structperf_event_attrattr;//事件的屬性(由用戶提供)
structhw_perf_eventhw;
structperf_event_context*ctx;//事件所屬的上下文
...
};

我們現(xiàn)在只需關(guān)注其中的兩個(gè)成員變量:count和ctx。

count:表示事件被觸發(fā)的次數(shù)。

ctx:表示當(dāng)前事件所屬的上下文。

count成員變量容易理解,所以就不作詳細(xì)介紹了。我們注意到 ctx 成員變量的類型為perf_event_context結(jié)構(gòu),那么這個(gè)結(jié)構(gòu)代表什么?

2. perf_event_context 結(jié)構(gòu)體

因?yàn)橐粋€(gè)進(jìn)程可以同時(shí)分析多種事件,所以就使用perf_event_context結(jié)構(gòu)來(lái)記錄屬于進(jìn)程的所有事件。我們來(lái)看看perf_event_context結(jié)構(gòu)的定義,如下所示:

structperf_event_context{
...
structlist_headevent_list;//連接所有屬于當(dāng)前上下文的事件
intnr_events;//屬于當(dāng)前上下文的所有事件的總數(shù)
...
structtask_struct*task;//當(dāng)前上下文屬于的進(jìn)程
...
};

我們對(duì)perf_event_context結(jié)構(gòu)進(jìn)行了簡(jiǎn)化,下面介紹一下各個(gè)成員的作用:

event_list:連接所有屬于當(dāng)前上下文的事件。

nr_events:屬于當(dāng)前上下文的所有事件的總數(shù)。

task:當(dāng)前上下文所屬的進(jìn)程。

perf_event_context結(jié)構(gòu)通過(guò)event_list字段把所有屬于本上下文的事件連接起來(lái),如下圖所示:

bdbe49fa-4db2-11ed-a3b6-dac502259ad0.png

另外,在進(jìn)程描述結(jié)構(gòu)體task_struct中,有個(gè)指向perf_event_context結(jié)構(gòu)的指針。如下所示:

structtask_struct{
...
structperf_event_context*perf_event_ctxp;
...
};

這樣,內(nèi)核就能通過(guò)進(jìn)程描述結(jié)構(gòu)體的perf_event_ctxp成員,來(lái)獲取屬于此進(jìn)程的事件列表。

3. pmu 結(jié)構(gòu)體

前面我們說(shuō)過(guò) perf 支持多種事件,而不同的事件應(yīng)該有不同的啟用和禁用動(dòng)作。為了讓不同的事件有不同的啟用和禁用動(dòng)作,所以內(nèi)核定義了pmu結(jié)構(gòu)。其定義如下:

structpmu{
int(*enable)(structperf_event*event);
void(*disable)(structperf_event*event);
void(*read)(structperf_event*event);
...
};

下面介紹一下各個(gè)字段的作用:

enable:?jiǎn)⒂檬录?/p>

disable:禁用事件。

read:事件被觸發(fā)時(shí)的回調(diào)。

perf_event結(jié)構(gòu)的pmu成員是一個(gè)指向pmu結(jié)構(gòu)的指針。如果當(dāng)前事件是個(gè) CPU 時(shí)鐘事件時(shí),pmu成員將會(huì)指向perf_ops_cpu_clock變量。

我們來(lái)看看perf_ops_cpu_clock變量的定義:

staticconststructpmuperf_ops_cpu_clock={
.enable=cpu_clock_perf_event_enable,
.disable=cpu_clock_perf_event_disable,
.read=cpu_clock_perf_event_read,
};

也就是說(shuō):

當(dāng)要啟用一個(gè) CPU 時(shí)鐘事件時(shí),內(nèi)核將會(huì)調(diào)用cpu_clock_perf_event_enable()函數(shù)來(lái)啟用這個(gè)事件。

當(dāng)要禁用一個(gè) CPU 時(shí)鐘事件時(shí),內(nèi)核將會(huì)調(diào)用cpu_clock_perf_event_disable()函數(shù)來(lái)禁用這個(gè)事件。

當(dāng)事件被觸發(fā)時(shí),內(nèi)核將會(huì)調(diào)用cpu_clock_perf_event_read()函數(shù)來(lái)進(jìn)行特定的動(dòng)作。

啟用事件

前面說(shuō)過(guò),當(dāng)要啟用一個(gè) CPU 時(shí)鐘事件時(shí),內(nèi)核會(huì)調(diào)用cpu_clock_perf_event_enable()函數(shù)來(lái)啟用它。我們來(lái)看看cpu_clock_perf_event_enable()函數(shù)的實(shí)現(xiàn),代碼如下:

staticint
cpu_clock_perf_event_enable(structperf_event*event)
{
...
perf_swevent_start_hrtimer(event);

return0;
}

從上面代碼可以看出,cpu_clock_perf_event_enable()函數(shù)實(shí)際上調(diào)用了perf_swevent_start_hrtimer()函數(shù)來(lái)進(jìn)行初始化工作。我們?cè)賮?lái)看看perf_swevent_start_hrtimer()函數(shù)的實(shí)現(xiàn):

staticvoid
perf_swevent_start_hrtimer(structperf_event*event)
{
structhw_perf_event*hwc=&event->hw;

// 1. 初始化一個(gè)定時(shí)器,定時(shí)器的回調(diào)函數(shù)為:perf_swevent_hrtimer()
hrtimer_init(&hwc->hrtimer,CLOCK_MONOTONIC,HRTIMER_MODE_REL);
hwc->hrtimer.function=perf_swevent_hrtimer;

if(hwc->sample_period){
...

//2.啟動(dòng)定時(shí)器
__hrtimer_start_range_ns(&hwc->hrtimer,ns_to_ktime(period),0,
HRTIMER_MODE_REL,0);
}
}

從上面的代碼可知,perf_swevent_start_hrtimer()函數(shù)主要完成兩件事情:

初始化一個(gè)定時(shí)器,定時(shí)器的回調(diào)函數(shù)為:perf_swevent_hrtimer()。

啟動(dòng)定時(shí)器。

這個(gè)定時(shí)器結(jié)構(gòu)保存在perf_event結(jié)構(gòu)的hwc成員中,我們?cè)谝院蟮奈恼轮袑?huì)介紹 Linux 高精度定時(shí)器的實(shí)現(xiàn)。

當(dāng)定時(shí)器被觸發(fā)時(shí),內(nèi)核將會(huì)調(diào)用perf_swevent_hrtimer()函數(shù)來(lái)處理事件。我們?cè)賮?lái)分析一下perf_swevent_hrtimer()函數(shù)的實(shí)現(xiàn):

staticenumhrtimer_restart
perf_swevent_hrtimer(structhrtimer*hrtimer)
{
enumhrtimer_restartret=HRTIMER_RESTART;
structperf_sample_datadata;
structpt_regs*regs;
structperf_event*event;
u64period;

//獲取當(dāng)前定時(shí)器所屬的事件對(duì)象
event=container_of(hrtimer,structperf_event,hw.hrtimer);

//前面說(shuō)過(guò),如果是CPU時(shí)鐘事件,將會(huì)調(diào)用cpu_clock_perf_event_read()函數(shù)
event->pmu->read(event);

data.addr=0;
//獲取定時(shí)器被觸發(fā)時(shí)所有寄存器的值
regs=get_irq_regs();

...
if(regs){
if(!(event->attr.exclude_idle&¤t->pid==0)){
//最重要的地方:對(duì)數(shù)據(jù)進(jìn)行采樣
if(perf_event_overflow(event,0,&data,regs))
ret=HRTIMER_NORESTART;
}
}
...
returnret;
}

perf_swevent_hrtimer()函數(shù)最重要的操作就是:調(diào)用perf_event_overflow()函數(shù)對(duì)數(shù)據(jù)進(jìn)行采樣與收集。perf_event_overflow()函數(shù)在后面將會(huì)介紹,我們暫時(shí)跳過(guò)。

那什么時(shí)候會(huì)啟用事件呢?答案就是:進(jìn)程被調(diào)度到 CPU 運(yùn)行時(shí)。調(diào)用鏈如下:

schedule()
└→ context_switch()
   └→ finish_task_switch()
      └→ perf_event_task_sched_in()
         └→ __perf_event_sched_in()
            └→ group_sched_in()
               └→ event_sched_in()
                  └→ event->pmu->enable()
                     └→ cpu_clock_perf_event_enable()

內(nèi)核通過(guò)調(diào)用schedule()函數(shù)來(lái)完成調(diào)度工作。從上面的調(diào)用鏈可知,當(dāng)進(jìn)程選中被調(diào)度到 CPU 運(yùn)行時(shí),最終會(huì)調(diào)用cpu_clock_perf_event_enable()函數(shù)來(lái)啟用這個(gè) CPU 時(shí)鐘事件。

啟用事件的過(guò)程如下圖所示:

bdd390b2-4db2-11ed-a3b6-dac502259ad0.png

所以,當(dāng)進(jìn)程被選中并且被調(diào)度運(yùn)行時(shí),內(nèi)核會(huì)啟用屬于此進(jìn)程的 perf 事件。不難看出,當(dāng)進(jìn)程被調(diào)度出 CPU 時(shí)(停止運(yùn)行),內(nèi)核會(huì)禁用屬于此進(jìn)程的 perf 事件。

數(shù)據(jù)采樣

最后,我們來(lái)看看 perf 是怎么進(jìn)行數(shù)據(jù)采樣的。

通過(guò)上面的分析,我們知道 perf 最終會(huì)調(diào)用perf_event_overflow()函數(shù)來(lái)進(jìn)行數(shù)據(jù)采樣。所以我們來(lái)看看perf_event_overflow()函數(shù)的實(shí)現(xiàn),代碼如下:

int
perf_event_overflow(structperf_event*event,intnmi,
structperf_sample_data*data,
structpt_regs*regs)
{
return__perf_event_overflow(event,nmi,1,data,regs);
}

可以看出,perf_event_overflow()函數(shù)只是對(duì)__perf_event_overflow()函數(shù)的封裝。我們接著來(lái)分析__perf_event_overflow()函數(shù)的實(shí)現(xiàn):

staticint
__perf_event_overflow(structperf_event*event,intnmi,intthrottle,
structperf_sample_data*data,structpt_regs*regs)
{
...
perf_event_output(event,nmi,data,regs);

returnret;
}

從上面代碼可知,__perf_event_overflow()會(huì)調(diào)用perf_event_output()函數(shù)來(lái)進(jìn)行數(shù)據(jù)采樣。perf_event_output()函數(shù)的實(shí)現(xiàn)如下:

staticvoid
perf_event_output(structperf_event*event,intnmi,
structperf_sample_data*data,
structpt_regs*regs)
{
structperf_output_handlehandle;
structperf_event_headerheader;

//進(jìn)行數(shù)據(jù)采樣,并且把采樣到的數(shù)據(jù)保存到data變量中
perf_prepare_sample(&header,data,event,regs);
...

//把采樣到的數(shù)據(jù)保存到環(huán)形緩沖區(qū)中
perf_output_sample(&handle,&header,data,event);
...
}

perf_event_output()函數(shù)會(huì)進(jìn)行兩個(gè)操作:

調(diào)用perf_prepare_sample()函數(shù)進(jìn)行數(shù)據(jù)采樣,并且把采樣到的數(shù)據(jù)保存到 data 變量中。

調(diào)用perf_output_sample()函數(shù)把采樣到的數(shù)據(jù)保存到環(huán)形緩沖區(qū)中。

我們來(lái)看看 perf 是怎么把采樣到的數(shù)據(jù)保存到環(huán)形緩沖區(qū)的:

void
perf_output_sample(structperf_output_handle*handle,
structperf_event_header*header,
structperf_sample_data*data,
structperf_event*event)
{
u64sample_type=data->type;
...

//1.保存當(dāng)前IP寄存器地址(用于獲取正在執(zhí)行的函數(shù))
if(sample_type&PERF_SAMPLE_IP)
perf_output_put(handle,data->ip);

//2.保存當(dāng)前進(jìn)程ID
if(sample_type&PERF_SAMPLE_TID)
perf_output_put(handle,data->tid_entry);

//3.保存當(dāng)前時(shí)間
if(sample_type&PERF_SAMPLE_TIME)
perf_output_put(handle,data->time);
...

//n.保存函數(shù)的調(diào)用鏈
if(sample_type&PERF_SAMPLE_CALLCHAIN){
if(data->callchain){
intsize=1;

if(data->callchain)
size+=data->callchain->nr;

size*=sizeof(u64);

perf_output_copy(handle,data->callchain,size);
}else{
u64nr=0;
perf_output_put(handle,nr);
}
}
...
}

perf_output_sample()通過(guò)調(diào)用perf_output_put()函數(shù)把用戶感興趣的數(shù)據(jù)保存到環(huán)形緩沖區(qū)中。

用戶感興趣的數(shù)據(jù)是在創(chuàng)建事件時(shí)指定的,例如,如果我們對(duì)函數(shù)的調(diào)用鏈感興趣,那么可以在創(chuàng)建事件時(shí)指定PERF_SAMPLE_CALLCHAIN標(biāo)志位。

perf 事件可以通過(guò)pref_event_open()系統(tǒng)調(diào)用來(lái)創(chuàng)建,關(guān)于pref_event_open()系統(tǒng)調(diào)用的使用,讀者可以自行參考相關(guān)的資料。

當(dāng) perf 把采樣的數(shù)據(jù)保存到環(huán)形緩沖區(qū)后,用戶就可以通過(guò)mmap()系統(tǒng)調(diào)用把環(huán)形緩沖區(qū)的數(shù)據(jù)映射到用戶態(tài)的虛擬內(nèi)存地址來(lái)進(jìn)行讀取。由于本文只關(guān)心數(shù)據(jù)采樣部分,所以 perf 的其他實(shí)現(xiàn)細(xì)節(jié)可以參考 perf 的源代碼。

數(shù)據(jù)采樣的流程如下圖所示:

be04b110-4db2-11ed-a3b6-dac502259ad0.png

總結(jié)

本文主要介紹了 perf 的 CPU 時(shí)鐘事件的實(shí)現(xiàn)原理,另外 perf 除了需要內(nèi)核支持外,還需要用戶態(tài)應(yīng)用程序支持,例如:把采樣到的原始數(shù)據(jù)生成可視化的數(shù)據(jù)或者使用圖形化表現(xiàn)出來(lái)。

當(dāng)然,本文主要是介紹 perf 在內(nèi)核中的實(shí)現(xiàn),用戶態(tài)的程序可以參考 Linux 源碼tools/perf目錄下的源代碼。

當(dāng)然,perf 是非常復(fù)雜的,本文也忽略了很多細(xì)節(jié)(如果把所有細(xì)節(jié)都闡明,那么篇幅將會(huì)非常長(zhǎng)),所以讀者如果有什么疑問(wèn)也可以留言討論。

審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1361

    瀏覽量

    40185
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    6819

    瀏覽量

    88746
  • 時(shí)鐘
    +關(guān)注

    關(guān)注

    10

    文章

    1714

    瀏覽量

    131277
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4723

    瀏覽量

    68237

原文標(biāo)題:一文看懂 Linux 性能分析|perf 源碼實(shí)現(xiàn)

文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    全球最高性能RISC-V處理器的Perf性能分析工具發(fā)布

    探測(cè)的性能監(jiān)控。通過(guò)Perf分析工具,用戶可以使用可編程的硬件性能監(jiān)控計(jì)數(shù)器監(jiān)測(cè)預(yù)定義的硬件事件、預(yù)定義的硬件緩存事件和硬件原始事件的性能數(shù)據(jù)。Perf能針對(duì)硬件事件的每個(gè)任務(wù)、每個(gè)內(nèi)核和每個(gè)工作負(fù)載的計(jì)數(shù)器進(jìn)行采樣。 ? 賽昉
    的頭像 發(fā)表于 04-24 14:53 ?1877次閱讀
    全球最高性能RISC-V處理器的<b class='flag-5'>Perf</b>性能分析工具發(fā)布

    一文詳解Linux的perf_event

    Linux性能子系統(tǒng)在性能分析中非常有用。以下顯示了這篇文章perf子系統(tǒng)componenet 。
    發(fā)表于 10-11 09:04 ?2032次閱讀

    內(nèi)核的電源管理

    之前介紹的電源管理機(jī)制基本都是在Linux實(shí)現(xiàn)的,可以看到很復(fù)雜,各種框架,明明一個(gè)操作非要轉(zhuǎn)來(lái)轉(zhuǎn)去,而且在內(nèi)核里面實(shí)現(xiàn),跟內(nèi)核的各種框架
    的頭像 發(fā)表于 11-29 09:33 ?834次閱讀
    微<b class='flag-5'>內(nèi)核</b><b class='flag-5'>中</b>的電源管理

    全志Tina中使用perf分析CPU使用率

    perf簡(jiǎn)介Perf是是內(nèi)置于Linux內(nèi)核源碼樹的性能剖析(profiling)工具。不僅可以用于應(yīng)用程序的性能統(tǒng)計(jì)分析,還可以用于內(nèi)核
    發(fā)表于 05-20 14:25

    I.MX8MM開發(fā)板Linux如何在內(nèi)核添加驅(qū)動(dòng)呢

    迅為I.MX8MM開發(fā)板編譯驅(qū)動(dòng)到內(nèi)核,在平時(shí)的驅(qū)動(dòng)開發(fā),經(jīng)常需要在內(nèi)核配置某種功能,為了方便大家開發(fā)和學(xué)習(xí),本小節(jié)講解如何在內(nèi)核
    發(fā)表于 08-29 17:46

    你知道perf學(xué)習(xí)-linux自帶性能分析工具怎么用?

    Linux性能調(diào)優(yōu)工具,32內(nèi)核以上自帶的工具,軟件性能分析。在2.6.31及后續(xù)版本的linux內(nèi)核里,安裝perf非常的容易。
    發(fā)表于 05-16 14:54 ?2576次閱讀

    米爾科技改內(nèi)核調(diào)整GPIO在內(nèi)核啟動(dòng)階段方案

    米爾用戶在使用i.MX6UL/i.MX6ULL系列產(chǎn)品開發(fā)時(shí),需要調(diào)整GPIO在內(nèi)核啟動(dòng)階段的狀態(tài),這怎么操作呢?
    的頭像 發(fā)表于 11-26 16:31 ?2817次閱讀
    米爾科技改<b class='flag-5'>內(nèi)核</b>調(diào)整GPIO<b class='flag-5'>在內(nèi)核</b>啟動(dòng)階段方案

    Coolbpf 在perf 事件的增強(qiáng)

    Perf 是內(nèi)置于 Linux 內(nèi)核源碼樹的性能剖析(profiling)工具。它基于事件采樣的原理,以性能事件為基礎(chǔ),支持針對(duì)處理器相關(guān)性能指標(biāo)與操作系統(tǒng)相關(guān)性能指標(biāo)的性能剖析。
    的頭像 發(fā)表于 10-25 09:00 ?1082次閱讀

    解構(gòu)內(nèi)核 perf 框架的實(shí)現(xiàn)講解

    perf 框架,前端承接用戶態(tài)的各種事件(event)的屬性配置,后端將 event 嫁接到內(nèi)核的調(diào)度、文件系統(tǒng)等框架,底層對(duì)接各種 PMU 硬件,所以其必然要建立一個(gè)復(fù)雜、嚴(yán)謹(jǐn)?shù)哪P停ǔ橄螅┫到y(tǒng)。
    發(fā)表于 01-16 09:49 ?1233次閱讀

    萬(wàn)字長(zhǎng)文解讀Linux內(nèi)核追蹤機(jī)制

    Linux 存在眾多 tracing tools,比如 ftrace、perf,他們可用于內(nèi)核的調(diào)試、提高內(nèi)核的可觀測(cè)性。
    的頭像 發(fā)表于 06-11 11:05 ?753次閱讀
    萬(wàn)字長(zhǎng)文解讀Linux<b class='flag-5'>內(nèi)核</b>追蹤機(jī)制

    Linux內(nèi)核的宏/container_of分析

    今天在看平臺(tái)設(shè)備實(shí)現(xiàn)的時(shí)候,看到to_xxx開頭的“函數(shù)”。包括在內(nèi)核也有很多此類的“函數(shù)”,其實(shí)他們都是container_of的宏。因?yàn)?b class='flag-5'>內(nèi)核是鏈表和結(jié)構(gòu)體的世界,因此
    發(fā)表于 06-23 14:26 ?355次閱讀
    Linux<b class='flag-5'>內(nèi)核</b><b class='flag-5'>中</b>的宏/container_of分析

    Linux perf性能、實(shí)際應(yīng)用與案例

    Linux perf(性能分析工具)是一個(gè)功能強(qiáng)大且靈活的性能剩余工具,它可以在Linux系統(tǒng)上檢測(cè)和調(diào)試各種性能問(wèn)題。Linux內(nèi)核集成了perf工具,可用于探測(cè)內(nèi)核性能事件、硬件性
    發(fā)表于 07-03 10:22 ?632次閱讀

    如何使用perf性能分析工具

    在功能上,perf很強(qiáng)大,可以對(duì)眾多的軟硬件事件采樣,還能采集出跟蹤點(diǎn)(trace points)的信息(比如系統(tǒng)調(diào)用、TCP/IP事件和文件系統(tǒng)操作。perf的代碼和Linux內(nèi)核代碼
    的頭像 發(fā)表于 11-08 15:36 ?1394次閱讀
    如何使用<b class='flag-5'>perf</b>性能分析工具

    Linux perf 簡(jiǎn)要介紹

    的性能剩余工具,它可以在Linux系統(tǒng)上檢測(cè)和調(diào)試各種性能問(wèn)題。Linux內(nèi)核集成了perf工具,可用于探測(cè)內(nèi)核性能事件、硬件性能計(jì)數(shù)器以及用戶級(jí)應(yīng)用程序性能事件。 perf工具可以用
    的頭像 發(fā)表于 11-09 17:06 ?770次閱讀

    如何在內(nèi)核啟動(dòng)secondary cpu

    啟動(dòng)secondary cpu 內(nèi)核在啟動(dòng)secondary cpu之前當(dāng)然需要為其準(zhǔn)備好執(zhí)行環(huán)境,因?yàn)?b class='flag-5'>內(nèi)核cpu最終都將由調(diào)度器管理,故此時(shí)調(diào)度子系統(tǒng)應(yīng)該要初始化完成。 同時(shí)cpu啟動(dòng)完成轉(zhuǎn)交
    的頭像 發(fā)表于 12-05 15:46 ?510次閱讀
    如何<b class='flag-5'>在內(nèi)核</b><b class='flag-5'>中</b>啟動(dòng)secondary cpu