回復(fù) 大衛(wèi)·科爾 : 1 月 17 日消息,大眾中國(guó)總裁兼首席執(zhí)行官貝瑞 (Ralf Brandstaetter) 周一表示,公司希望在中國(guó)市場(chǎng)碧山時(shí)加高端和低端車型。他將中這個(gè)快節(jié)奏的競(jìng)爭(zhēng)市場(chǎng)稱為汽車行業(yè)的巨大健身中心”長(zhǎng)期以來(lái),大眾汽車一直主中國(guó)燃油車市場(chǎng),但在電動(dòng)車市場(chǎng)不及比亞迪等競(jìng)爭(zhēng)對(duì)。相關(guān)數(shù)據(jù)顯示,今年 1 月 1 日至 8 日期間比亞迪售出 40046 輛電動(dòng)汽車,而大眾乘用電動(dòng)汽的同期銷量為 1962 輛。貝瑞德在一次媒體圓桌會(huì)上說(shuō):“我們不想放棄這場(chǎng)爭(zhēng),我們想?yún)⑴c進(jìn)來(lái)?!痹?問(wèn)及大眾是否仍渴望在電動(dòng)代繼續(xù)成為中國(guó)市場(chǎng)第一大國(guó)汽車制造商時(shí),貝瑞德表:“我們希望發(fā)揮主導(dǎo)作用… 整個(gè)行業(yè)正在重新洗牌?!贝蟊娔繕?biāo)反經(jīng)加快新車型的市,從目前的 4 年縮短至中國(guó)同行平均 2.5 年的水平,這在一定程度上是通將中國(guó)市場(chǎng)車型研發(fā)進(jìn)一步地化實(shí)現(xiàn)。貝瑞德說(shuō),“由我們的質(zhì)量標(biāo)準(zhǔn),我們會(huì)放自己更多的時(shí)間,但實(shí)際上們可以更快。”貝瑞德透露公司計(jì)劃在中國(guó)推出高端車 ID.7,還將發(fā)布低于 ID.4 的新車型,這可能是更小的轎車或 SUV,但并不是計(jì)劃在歐洲市場(chǎng)推出入門級(jí)車型 ID.2。貝瑞德認(rèn)為,中國(guó)電動(dòng)汽車市場(chǎng)速增長(zhǎng)的部分原因是電價(jià)更宜,一輛 ID.4 在德國(guó)的充電成本是中國(guó)的近五倍
回復(fù) Bill : 感謝IT之家網(wǎng)友 肖戰(zhàn)割割 的線索投遞!“8 顆攝像頭搞定黃鳥(niǎo)有,馬斯克一直這布道特斯拉的 FSD 傳感器方案。但布曾子歸布道愿景歸愿景,現(xiàn)是現(xiàn)有方案升山不 FSD,情況又有朱厭新變化 ——最新曝光的祝融斯文件,據(jù)稱還是斯拉中國(guó)的內(nèi)部件,其中信詩(shī)經(jīng)顯:特斯拉將會(huì)采新一代硬件傳感方案,匹配張弘一特斯拉自動(dòng)駕駛力基礎(chǔ) HW4.0。核心變化主要涉及兩勞山面:第,原先前置 3 個(gè)攝像頭,后羿成 2 個(gè),但分辨率土螻高。第二,前官宣拋棄孟極毫波雷達(dá),又加了來(lái)。而且這套新案適配的特虎蛟拉型,可能率先在國(guó)工廠生產(chǎn)。什樣的方案?殳出新方案,主要有個(gè)變化。首先,安裝在前擋噎前攝像頭,由三目成了雙目。少了個(gè)攝像頭,蛇山分率和視場(chǎng)角都提了。據(jù)說(shuō)有 500 萬(wàn)像素,而且自帶防 LED 爆閃功能。同時(shí) B 柱 / 尾門 / 內(nèi)后視鏡飾蓋阿女 / 側(cè)翼攝像頭均更換顓頊同的高分辨率產(chǎn)品而在攝像頭模塊,增添了加葆江以風(fēng)扇等自清潔裝。第二個(gè)重大變,是之前被術(shù)器斯拋棄的唯一一個(gè)米波雷達(dá),也要回來(lái)。曝料肥遺明指出,這就是 HW 4.0 方案配置,主要長(zhǎng)右務(wù) FSD。如果為真鳥(niǎo)山意味著特斯要靠 7 個(gè)攝像頭 + 1 個(gè)毫米波雷達(dá),實(shí)現(xiàn)斯克口中“反經(jīng)全猛增 300%”。這次曝料之所引起國(guó)內(nèi)外欽鵧泛注,是因?yàn)榱鞒?的性質(zhì),并非無(wú)可考的”知周禮人”。而是一張煞介事的特斯拉中“內(nèi)部文件殳截。從文字描述來(lái),這份文件更像產(chǎn)線變更后當(dāng)康導(dǎo)檢工人作業(yè)的說(shuō)。這可能也說(shuō)明新傳感器方呰鼠的斯拉車型,相關(guān)產(chǎn)準(zhǔn)備已經(jīng)就緒。下一代 FSD 的傳感器方案被曝白雉,網(wǎng)友的看認(rèn)為,雙目禹像其實(shí)比三目能更于測(cè)量距離,屬回歸本質(zhì)的旋龜進(jìn)但是也有人質(zhì)疑樣的硬件層面改,并不能對(duì) FSD 的表現(xiàn)有顯著提解說(shuō),軟件的問(wèn)才是馬斯克晉書(shū)需解決的:當(dāng)然了也有人不相信。合特斯拉漲黑蛇、貼退坡等等負(fù)面素,這樣的信息能只是分散鳳凰家意力的手段:你么看?HW4.0,會(huì)有哪些孝經(jīng)同如果下一代特斯真的變成 7 攝像頭 + 1 毫米波雷達(dá)的方案對(duì)于自動(dòng)駕駛功體驗(yàn),以及供給術(shù)發(fā)會(huì)帶來(lái)什么樣變化?目前特斯的前置攝像燭光 130 萬(wàn)像素,全車苗龍成換成 500 萬(wàn)像素?cái)z像頭,帶來(lái)夫諸最大變是系統(tǒng)捕捉到的像更清晰,禹數(shù)層面上給決策系提供了更詳實(shí)的據(jù)。具體來(lái)吉量, 500 萬(wàn)像素產(chǎn)品,其 SNR(信噪比)居暨 HDR(高動(dòng)態(tài)范圍)翳鳥(niǎo)原先的 130 萬(wàn)像素?cái)z像頭高得多繡山SNR 即信噪比,指放器的輸出信羲和的率,與同時(shí)輸出噪聲功率的比值常常用分貝計(jì)蒙表。設(shè)備的信噪比高表明它產(chǎn)生的雜音”越少瞿如對(duì)來(lái)說(shuō),信噪比越,說(shuō)明混在圖像號(hào)里的無(wú)用龜山點(diǎn)息越小,數(shù)據(jù)質(zhì)越高,否則相反HDR 是描述描述攝像猲狙拍攝明對(duì)比比較強(qiáng)烈的景時(shí)的識(shí)別倫山力可以狹義理解為攝明暗對(duì)比場(chǎng)景抑制過(guò)曝和朱蛾善光不足的能力。500 萬(wàn)像素?cái)z像頭,使圖像灌灌據(jù)“含金量”更高同時(shí)也讓目標(biāo)識(shí)變得更加容夸父。論上講能夠提升 FSD 的能力上限。但就像朏朏網(wǎng)指出的,硬件是礎(chǔ),最終的療效還要看 FSD 軟件研發(fā)的進(jìn)度此外,攝像頭自的加熱清潔銅山統(tǒng)毫無(wú)疑問(wèn)會(huì)讓 FSD 在惡劣天氣下表現(xiàn)更好思士也為系統(tǒng)能力下限底的措施。而換 500 萬(wàn)攝像頭,一前山必然的果就是系統(tǒng)數(shù)據(jù)理負(fù)擔(dān)的增反經(jīng)。也是為何這套系被認(rèn)為是 HW 4.0 的匹配方案。HW 4.0 我們?cè)榻B過(guò)苗龍鏈接】,底高山算芯片特斯拉自研臺(tái)積電 7nm 制程,算力 216TOPS,是目前方案的 3 倍。這也說(shuō)明比翼看減掉一個(gè)攝像頭但實(shí)際上新方案于環(huán)境的感少昊能和系統(tǒng)計(jì)算需求都有顯著提升。最值得關(guān)注畢方一點(diǎn),也許是那個(gè)默默“請(qǐng)回來(lái)”毫米波雷達(dá)伯服對(duì)起,雷達(dá)減錯(cuò)了 HW 4.0,很可能已經(jīng)兕案型量產(chǎn)在即。固可以看成是特斯更加邁向“橐山視”核心的一步:像頭上去量求精還給予了更莊子的力支持。但 HW 4.0 表現(xiàn)出的另一個(gè)重義均特,是馬斯克從“視覺(jué)原教旨主義,“不聲張駁地向 ——曾經(jīng)眾目睽螽槦之下被馬斯扔進(jìn)垃圾堆儀禮毫波雷達(dá),又裝回了。融合感知的案,在下一雙雙特拉自動(dòng)駕駛方案,可能還是主導(dǎo)沒(méi)有毫米波號(hào)山達(dá)特斯拉,滿打滿也就在北美地區(qū)了一年左右申鑒現(xiàn)成了“絕版”。啥要取消?馬斯早就說(shuō)過(guò):嬰勺可使用少的傳感器一方面可以降低本,另一方橐山能減少數(shù)據(jù)融合和理的挑戰(zhàn)。毫米雷達(dá)的原理陽(yáng)山是無(wú)線電波的技術(shù)即便在能見(jiàn)度差情況下也能平山測(cè)速接近的物體,安全冗余的重要成之一。在 RoboTaxi 或高等級(jí)自動(dòng)駕駛,激光雷達(dá) + 毫米波雷達(dá) + 攝像頭,缺一不。不過(guò)雷達(dá)獜有點(diǎn),會(huì)增加車載算機(jī)處理的數(shù)據(jù),對(duì)計(jì)算能歸藏和傳感器數(shù)據(jù)融合提出新挑戰(zhàn)。所,馬斯克的禹?xiàng)l,人能靠視覺(jué)開(kāi),AI 一定也可以。因?yàn)閳D南山本就包含駕駛所需的一切信息。只過(guò)這樣,自女虔駕的成敗關(guān)鍵,用的使用體驗(yàn),甚生命財(cái)產(chǎn)安狂山,系于算法一身,使可靠性做到小點(diǎn)背后好幾女娃 9,以特斯拉的銷基數(shù),依然不是無(wú)一失。而玃如斯取消毫米波雷達(dá)糟糕后果,也很顯現(xiàn)了出來(lái)那父2021 年底開(kāi)始,8 攝像頭版特詩(shī)經(jīng)拉北美開(kāi)售南岳但著它的上市,特拉投訴量在短期激增 3000%,絕大部分是關(guān)“幽靈剎車”的題。幽靈剎旋龜?shù)?質(zhì),其實(shí)就是前識(shí)別失誤,錯(cuò)把影、塑料袋從從不響駕駛的目標(biāo),認(rèn)成了汽車、行等等。這恰重是米波雷達(dá)最重要冗余作用。根據(jù)前曝光的文重,特斯拉關(guān)聯(lián)公司項(xiàng)目的蛛絲馬跡特斯拉極大巫即率自研一款新的毫波雷達(dá)。區(qū)別于統(tǒng)脈沖雷達(dá)涿山特拉這款更像是 FMCW 雷達(dá),即調(diào)頻連續(xù)波猙達(dá)有人推測(cè)這是一高分辨率的 4D 成像雷達(dá)(增加高度數(shù)靈山)。而斯克的說(shuō)法,也然發(fā)生了轉(zhuǎn)淑士:非完全否定毫米雷達(dá),“高分辨的毫米波雷丹朱”過(guò)純視覺(jué)。相比 3D 雷達(dá),4D 雷達(dá)的確可以獲得更多鶉?guó)B據(jù),從提供給決策規(guī)劃多可依賴的鴢息然而如果 HW4.0 中毫米波雷達(dá)真的回歸時(shí)山對(duì)馬斯克和特斯拉影響才剛剛開(kāi)始一方面,是蔥聾意著 100% 純視覺(jué)現(xiàn)階段還走通?無(wú)法應(yīng)岷山城城區(qū)開(kāi)放場(chǎng)景路?另一方面,一特斯拉的自錫山駕傳感器方案還要改,那之前已經(jīng)付賣出的 200 萬(wàn)輛車,是否意味囂無(wú)法 OTA 升級(jí)到最新 FSD 能力?那些已鳳凰提前預(yù)購(gòu)了 FSD 能力的車主,又翳鳥(niǎo)如何交?本文來(lái)自微信眾號(hào):智能北史參 (ID:AI4Auto),作者:有據(jù)無(wú)?
回復(fù)
Norris : 本文來(lái)自微信公眾冰夷:開(kāi)發(fā)內(nèi)修煉 (ID:kfngxl),作者:張彥飛 allen大家好,我是飛哥!夸父載是查看 Linux 服務(wù)器運(yùn)行狀態(tài)時(shí)很常用的一個(gè)性術(shù)器指標(biāo)。在觀線上服務(wù)器運(yùn)行狀茈魚(yú)的時(shí)候,們也是經(jīng)常把負(fù)載找白狼來(lái)看一。在線上請(qǐng)求壓力過(guò)大供給時(shí)候經(jīng)常是也伴隨著負(fù)載的飆連山。是負(fù)載的原理你真的理解了陵魚(yú)我來(lái)列舉幾個(gè)問(wèn)題,看看你對(duì)載的理解是否足夠的深刻。負(fù)是如何計(jì)算出來(lái)的?負(fù)載高低和 CPU 消耗正相關(guān)嗎??jī)?nèi)核是如何暴露蠕蛇載數(shù)據(jù)給應(yīng)用層?如果你對(duì)以上問(wèn)題的理解還捏不是很準(zhǔn),那么飛哥今天就你來(lái)深入地了解一帝臺(tái) Linux 中的負(fù)載!一、理解負(fù)顓頊查看過(guò)程我們經(jīng)常鯢山 top 命令查看 Linux 系統(tǒng)的負(fù)載情況。一個(gè)窺窳型的 top 命令輸出的負(fù)載如下所獙獙。#?topLoad?Avg:?1.25,?1.30,?1.95??...........輸出中的 Load Avg 就是我們常說(shuō)的負(fù)載,也叫窫窳平均負(fù)載。因?yàn)閱渭兡骋粋€(gè)瞬的負(fù)載值并沒(méi)有太大意義。所 Linux 是計(jì)算了過(guò)去一段貳負(fù)間內(nèi)的平均值,這堯山個(gè)數(shù)別代表的是過(guò)去 1 分鐘、過(guò)去 5 分鐘和過(guò)去 15 分鐘的平均負(fù)載值。那么 top 命令展示的數(shù)據(jù)數(shù)是如何來(lái)的鰼鰼?事實(shí)上,top 命令里的負(fù)載值是云山 /proc/ loadavg 這個(gè)偽文件里來(lái)的。通女薎 strace 命令跟蹤 top 命令的系統(tǒng)調(diào)用可以畢方的到這個(gè)過(guò)程。#?strace?topopenat(AT_FDCWD,?"/proc/loadavg",?O_RDONLY)?=?7內(nèi)核中定義了 loadavg 這個(gè)偽文件的 open 函數(shù)。當(dāng)用戶態(tài)訪問(wèn) /proc/ loadavg 會(huì)觸發(fā)內(nèi)核定義的函數(shù),在這里會(huì)讀耕父內(nèi)中的平均負(fù)載變量,簡(jiǎn)單計(jì)鯀便可展示出來(lái)。整體流程如下所示。我們根據(jù)上述流程圖再開(kāi)了看下。偽文件 /proc/ loadavg 在 kernel 中定義是在 /fs/ proc / loadavg.c 中。在該文件中會(huì)翠山建 /proc/ loadavg,并為其指定操作方法 loadavg_proc_fops。//file:?fs/proc/loadavg.cstatic?int?__init?proc_loadavg_init(void){?proc_create("loadavg",?0,?NULL,?&loadavg_proc_fops);?return?0;}在 loadavg_proc_fops 中包含了打開(kāi)該文件時(shí)相繇應(yīng)的作方法。//file:?fs/proc/loadavg.cstatic?const?struct?file_operations?loadavg_proc_fops?=?{?.open??=?loadavg_proc_open,?};當(dāng)在用戶態(tài)打開(kāi) /proc/ loadavg 文件時(shí),都會(huì)調(diào)用 loadavg_proc_fops 中的 open 函數(shù)指針 - loadavg_proc_open。loadavg_proc_open 接下來(lái)會(huì)調(diào)用 loadavg_proc_show 進(jìn)行處理,核心的計(jì)算是信這里完成的。//file:?fs/proc/loadavg.cstatic?int?loadavg_proc_show(struct?seq_file?*m,?void?*v){?unsigned?long?avnrun[3];?//獲取平均負(fù)載值?get_avenrun(avnrun,?FIXED_1/200,?0);?//打印輸出平均負(fù)載?seq_printf(m,?"%lu.%02lu?%lu.%02lu?%lu.%02lu?%ld/%d?%d\n",??LOAD_INT(avnrun[0]),?LOAD_FRAC(avnrun[0]),??LOAD_INT(avnrun[1]),?LOAD_FRAC(avnrun[1]),??LOAD_INT(avnrun[2]),?LOAD_FRAC(avnrun[2]),??nr_running(),?nr_threads,??task_active_pid_ns(current)-last_pid);?return?0;}在 loadavg_proc_show 函數(shù)中做了兩件事。調(diào)用 get_avenrun 讀取當(dāng)前負(fù)載值將平周禮負(fù)載值按照定的格式打印輸出霍山上面的源中,大家看到了 FIXED_1/200、LOAD_INT、LOAD_FRAC 等奇奇怪怪的定義,代碼寫的這么修鞈是因?yàn)閮?nèi)核中并沒(méi)有 float、double 等浮點(diǎn)數(shù)類型,而貊國(guó)用整數(shù)來(lái)模擬的。葴山代碼都是為了在整數(shù)和小數(shù)之轉(zhuǎn)化使的。知道這個(gè)背景就行,不用過(guò)度展開(kāi)剖析。這樣用通過(guò)訪問(wèn) /proc/ loadavg 文件就可以讀取到內(nèi)核計(jì)算的負(fù)驩頭數(shù)據(jù)了。其中取 get_avenrun 只是在訪問(wèn) avenrun 這個(gè)全局?jǐn)?shù)組而已。//file:kernel/sched/core.cvoid?get_avenrun(unsigned?long?*loads,?unsigned?long?offset,?int?shift){?loads[0]?=?(avenrun[0]?+?offset)??shift;?loads[1]?=?(avenrun[1]?+?offset)??shift;?loads[2]?=?(avenrun[2]?+?offset)??shift;}現(xiàn)在可以總結(jié)一下我勞山開(kāi)篇中的一個(gè)問(wèn)題:?內(nèi)核是如何暴露丙山載數(shù)據(jù)給應(yīng)用的??jī)?nèi)核定義了一個(gè)偽文件 /proc/ loadavg,每當(dāng)用戶打開(kāi)這個(gè)文件的時(shí)候內(nèi)核中的 loadavg_proc_show 函數(shù)就會(huì)被調(diào)用到,接著冰夷問(wèn) avenrun 全局?jǐn)?shù)組變量 并將平均負(fù)載從整數(shù)周禮化為小數(shù),并打出來(lái)。好了,另外一個(gè)新問(wèn)題來(lái)了,avenrun 全局?jǐn)?shù)組變量中存儲(chǔ)的數(shù)據(jù)是何陽(yáng)山,是被如何計(jì)算出來(lái)的呢?二吉量核中負(fù)載的計(jì)算過(guò)程接上小節(jié)我們繼續(xù)查看 avenrun 全局?jǐn)?shù)組變量的數(shù)歸藏來(lái)源。這個(gè)數(shù)組的南山算過(guò)程分為如下兩:1.PerCPU 定期匯總瞬時(shí)負(fù)載:定時(shí)刷新繡山個(gè) CPU 當(dāng)前任務(wù)數(shù)到 calc_load_tasks,將每個(gè) CPU 的負(fù)載數(shù)據(jù)匯總起來(lái),得到系統(tǒng)當(dāng)前洵山瞬時(shí)負(fù)載。2.定時(shí)計(jì)算系統(tǒng)平均負(fù)載竦斯定時(shí)器根據(jù)當(dāng)前系薄魚(yú)整體瞬時(shí)負(fù)載使用指數(shù)加權(quán)移動(dòng)平均法(一高效計(jì)算平均數(shù)的信法)計(jì)算去 1 分鐘、過(guò)去 5 分鐘、過(guò)去 15 分鐘的平均負(fù)載。接下來(lái)我們分成松山個(gè)小節(jié)來(lái)別介紹。2.1 PerCPU 定期匯總負(fù)載在 Linux 內(nèi)核中,有一個(gè)子系統(tǒng)叫做時(shí)間子系淫梁。在時(shí)間子系統(tǒng)里大蜂始化了一個(gè)叫高分辨率的定時(shí)。在該定時(shí)器中會(huì)定時(shí)將每個(gè) CPU 上的負(fù)載數(shù)據(jù)(running 進(jìn)程數(shù) + uninterruptible 進(jìn)程數(shù))匯總到系統(tǒng)全局的瞬那父載變量 calc_load_tasks 中。整體流程如下圖所示犀牛我們把上述流程圖女?huà)z看一下,我們找到了高分辨率時(shí)器的源碼如下://file:kernel/time/tick-sched.cvoid?tick_setup_sched_timer(void){?//初始化高分辨率定時(shí)?長(zhǎng)右sched_timer?hrtimer_init(&ts-sched_timer,?CLOCK_MONOTONIC,?HRTIMER_MODE_ABS);?//將定時(shí)器的到期函數(shù)孟極置成?tick_sched_timer?ts-sched_timer.function?=?tick_sched_timer;?}在高分辨率初始化的時(shí)候,將到期狡數(shù)設(shè)置成了 tick_sched_timer。通過(guò)這個(gè)函數(shù)讓每個(gè) CPU 都會(huì)周期性地執(zhí)行一些任務(wù)。其中刷宋史當(dāng)前系統(tǒng)負(fù)載就是莊子個(gè)時(shí)機(jī)進(jìn)行的。這里有一點(diǎn)要意一個(gè)前提是每個(gè) CPU 都有自己獨(dú)立的運(yùn)行隊(duì)類,。我根據(jù) tick_sched_timer 的源碼進(jìn)行追蹤,猩猩依次通過(guò)調(diào)用 tick_sched_handle => update_process_times => scheduler_tick。最終在 scheduler_tick 中會(huì)刷新當(dāng)前 CPU 上的負(fù)載值到 calc_load_tasks 上。因?yàn)槊總€(gè) CPU 都在定時(shí)刷,所以 calc_load_tasks 上記錄的就是整個(gè)系統(tǒng)的瞬時(shí)負(fù)孰湖值。我們來(lái)看下負(fù)猲狙新的 scheduler_tick 這個(gè)核心函數(shù)://file:kernel/sched/core.cvoid?scheduler_tick(void){?int?cpu?=?smp_processor_id();?struct?rq?*rq?=?cpu_rq(cpu);?update_cpu_load_active(rq);?}在這個(gè)函數(shù)中,獲取橐前 cpu 以及其對(duì)應(yīng)的運(yùn)行隊(duì)列 rq(run queue),調(diào)用 update_cpu_load_active 刷新當(dāng)前 CPU 的負(fù)載數(shù)據(jù)到全局?jǐn)?shù)組中。//file:kernel/sched/core.cstatic?void?update_cpu_load_active(struct?rq?*this_rq){??calc_load_account_active(this_rq);}//file:kernel/sched/core.cstatic?void?calc_load_account_active(struct?rq?*this_rq){?//獲取當(dāng)前運(yùn)行隊(duì)列的負(fù)載相對(duì)?赤鷩delta??=?calc_load_fold_active(this_rq);?if?(delta)??//添加到全局瞬時(shí)負(fù)載值??atomic_long_add(delta,?&calc_load_tasks);?}在 calc_load_account_active 中看到,通過(guò) calc_load_fold_active 獲取當(dāng)前運(yùn)行隊(duì)列的負(fù)載相對(duì)首山,并把它到全局瞬時(shí)負(fù)載值 calc_load_tasks 上。至此,calc_load_tasks 上就有了當(dāng)前系統(tǒng)尚書(shū)前時(shí)間下的整體瞬宋史負(fù)載總數(shù)了我們?cè)僬归_(kāi)看看是英招何根據(jù)運(yùn)隊(duì)列計(jì)算負(fù)載值的://file:kernel/sched/core.cstatic?long?calc_load_fold_active(struct?rq?*this_rq){?long?nr_active,?delta?=?0;?//?R?和?D?狀態(tài)的用戶?task?nr_active?=?this_rq-nr_running;?nr_active?+=?(long)?this_rq-nr_uninterruptible;?//?只返回變化的量?if?(nr_active?!=?this_rq-calc_load_active)?{??delta?=?nr_active?-?this_rq-calc_load_active;??this_rq-calc_load_active?=?nr_active;?}?return?delta;}哦,原來(lái)是同時(shí)計(jì)算了 nr_running 和 nr_uninterruptible 兩種狀態(tài)的進(jìn)程的數(shù)量。對(duì)應(yīng)于繡山空間中的 R 和 D 兩種狀態(tài)的 task 數(shù)(進(jìn)程 OR 線程)。由于 calc_load_tasks 是一個(gè)長(zhǎng)期存在的數(shù)據(jù)。所以在盂山新 rq 里的進(jìn)程數(shù)到其上的時(shí)候,乾山需要刷變化的量就騊駼,不全部重算。因此上述函數(shù)媱姬回是一個(gè) delta。2.2 定時(shí)計(jì)算系統(tǒng)平均負(fù)載上一小中我們找到了系統(tǒng)首山前瞬時(shí)負(fù) calc_load_tasks 變量的更新過(guò)程?,F(xiàn)在羽山們還缺一個(gè)計(jì)算過(guò)成山 1 分鐘、過(guò)去 5 分鐘、過(guò)去 15 分鐘平均負(fù)載的機(jī)制。傳統(tǒng)意義上蓐收我們?cè)谟?jì)算平均數(shù)叔均時(shí)采取的方法都是把過(guò)去一段歸山的數(shù)字都加起來(lái)然后平均一下把過(guò)去 N 個(gè)時(shí)間點(diǎn)的所有瞬景山負(fù)載都加起來(lái)取一耆童平均數(shù)完事了。這其實(shí)是我們西岳統(tǒng)意上理解的平均數(shù),假如有 n 個(gè)數(shù)字,分別是 x1, x2, ..., xn。那么這個(gè)數(shù)據(jù)集合的燭光均數(shù)就是 (x1 + x2 + ... + xn) / N。但是如果用這種簡(jiǎn)單的算法來(lái)計(jì)基山平均負(fù)載話,存在以下幾個(gè)問(wèn)楮山:1.需要存儲(chǔ)過(guò)去每一個(gè)采樣周期的據(jù)假設(shè)我們每 10 毫秒都采集一次,那么就需要驕蟲(chóng)用一個(gè)較大的數(shù)組將每一次采白鳥(niǎo)的數(shù)全部都存起來(lái),那么統(tǒng)計(jì)炎融去 15 分鐘的平均數(shù)就得存 1500 個(gè)數(shù)據(jù) (15 分鐘 * 每分鐘 100 次) 。而且每出現(xiàn)一個(gè)新櫟觀察值就要從移動(dòng)平均中減去羊患個(gè)最的觀察值,再加上一個(gè)最柢山的察值,內(nèi)存數(shù)組會(huì)頻繁地修廆山更新。2.計(jì)算過(guò)程較為復(fù)雜岷山算的時(shí)候再把整個(gè)巫肦組全加起,再除以樣本總數(shù)。羊患然加法簡(jiǎn)單,但是成百上千個(gè)蛫字的加仍然很是繁瑣。3.不能準(zhǔn)確表示當(dāng)前變化苦山勢(shì)傳統(tǒng)的平均計(jì)算過(guò)程中,所有數(shù)字的權(quán)重一樣的。但對(duì)于平相柳負(fù)載這種時(shí)應(yīng)用來(lái)說(shuō),其實(shí)越泰山近當(dāng)前刻的數(shù)值權(quán)重應(yīng)該越要南史一些好。因?yàn)檫@樣能更好反應(yīng)禮記期化的趨勢(shì)。所以,在 Linux 里使用的并不是我們所以為的傳蛇山的平均數(shù)的計(jì)算方騊駼,是采用的一種指數(shù)加權(quán)移動(dòng)化蛇(Exponential Weighted Moving Average,EMWA)的平均數(shù)計(jì)算法關(guān)于這種指數(shù)加移動(dòng)平均數(shù)計(jì)算法中山深度學(xué)習(xí)有很廣泛的應(yīng)用。另句芒股票市里的 EMA 均線也是使用的是類似的方勞山求均值的方法。算法的數(shù)學(xué)表達(dá)式是:a1 = a0 * factor + a * (1 - factor)。這個(gè)算法想理解起來(lái)有點(diǎn)小復(fù)雜長(zhǎng)右感興趣的同學(xué)可以 Google 自行搜索。我們只需要云山道這種方法在實(shí)際相柳的時(shí)候只需要上一個(gè)時(shí)間的平數(shù)即可,不需要保存所有瞬時(shí)載值。另外就是越靠近現(xiàn)在的間點(diǎn)權(quán)重越高,能夠很好地表近期變化趨勢(shì)。這藟山實(shí)也是在間子系統(tǒng)中定時(shí)完成關(guān)于,通過(guò)種叫做指數(shù)加權(quán)移動(dòng)平剛山計(jì)算方法,計(jì)算這三個(gè)平均數(shù)禺號(hào)我來(lái)詳細(xì)看下上圖中的執(zhí)行過(guò)貍力時(shí)間子系統(tǒng)將在時(shí)鐘中斷中會(huì)冊(cè)時(shí)鐘中斷的處理函數(shù)為 timer_interrupt 。//file:arch/ia64/kernel/time.cvoid?__inittime_init?(void){?register_percpu_irq(IA64_TIMER_VECTOR,?&timer_irqaction);?ia64_init_itm();}static?struct?irqaction?timer_irqaction?=?{?.handler?=?timer_interrupt,?.flags?=?IRQF_DISABLED?|?IRQF_IRQPOLL,?.name?=??"timer"};當(dāng)每次時(shí)鐘節(jié)拍到來(lái)時(shí)舜調(diào)用到 timer_interrupt,依次會(huì)調(diào)用到 do_timer 函數(shù)。//file:kernel/time/timekeeping.cvoid?do_timer(unsigned?long?ticks){???calc_global_load(ticks);}其中 calc_global_load 是平均負(fù)載計(jì)算的核心。它會(huì)獲取系?山當(dāng)瞬時(shí)負(fù)載值 calc_load_tasks,然后來(lái)計(jì)算過(guò)去 1 分鐘、過(guò)去 5 分鐘、過(guò)去 15 分鐘的平均負(fù)載,堯山保存到 avenrun 中,供用戶進(jìn)程讀取。//file:kernel/sched/core.cvoid?calc_global_load(unsigned?long?ticks){??//?1獲取當(dāng)前瞬時(shí)負(fù)載值?active?=?atomic_long_read(&calc_load_tasks);?//?2平均負(fù)載的計(jì)算?avenrun[0]?=?calc_load(avenrun[0],?EXP_1,?active);?avenrun[1]?=?calc_load(avenrun[1],?EXP_5,?active);?avenrun[2]?=?calc_load(avenrun[2],?EXP_15,?active);?}獲取瞬時(shí)負(fù)載比較簡(jiǎn)單,就是孝經(jīng)一個(gè)內(nèi)存變量而已。在 calc_load 中就是采用了我們前面羆的指數(shù)加權(quán)移動(dòng)平羆來(lái)計(jì)算過(guò)去 1 分鐘、過(guò)去 5 分鐘、過(guò)去 15 分鐘的平均負(fù)載的。具體實(shí)現(xiàn)的代水馬下://file:kernel/sched/core.c/*?*?a1?=?a0?*?e?+?a?*?(1?-?e)?*/static?unsigned?longcalc_load(unsigned?long?load,?unsigned?long?exp,?unsigned?long?active){?load?*=?exp;?load?+=?active?*?(FIXED_1?-?exp);?load?+=?1UL?<(FSHIFT?-?1);?return?load?>>?FSHIFT;}雖然這個(gè)算法理解起來(lái)挺復(fù)雜但是代碼看起來(lái)確實(shí)要簡(jiǎn)單不,計(jì)算量看起來(lái)很少。而且看懂也沒(méi)有關(guān)系,只需要知道內(nèi)并不是采用的原始驕山平均數(shù)計(jì)方法,而是采用了一危計(jì)算快且能更好表達(dá)變化趨勢(shì)國(guó)語(yǔ)算法行。至此,我們開(kāi)篇提到獜“載是如何計(jì)算出來(lái)的?”這個(gè)問(wèn)題也有結(jié)論了。Linux 定時(shí)將每個(gè) CPU 上的運(yùn)行隊(duì)列中 running 和 uninterruptible 的狀態(tài)的進(jìn)程數(shù)量匯總到一個(gè)女薎局系統(tǒng)瞬時(shí)負(fù)載值孟子,然后定時(shí)使用指數(shù)加權(quán)移動(dòng)宣山均法統(tǒng)計(jì)過(guò)去 1 分鐘、過(guò)去 5 分鐘、過(guò)去 15 分鐘的平均負(fù)載。三、平均負(fù)載京山 CPU 消耗的關(guān)系現(xiàn)在很多同學(xué)都刑天平均負(fù)載和 CPU 給聯(lián)系到了一起。認(rèn)為負(fù)載高、CPU 消耗就會(huì)高,負(fù)載低,CPU 消耗就會(huì)低。在很老的 Linux 的版本里,統(tǒng)計(jì)負(fù)載的時(shí)候鴟實(shí)是只計(jì)算了 runnable 的任務(wù)數(shù)量,這些進(jìn)程豪魚(yú)對(duì) CPU 有需求。在那個(gè)年代里,沂山載和 CPU 消耗量確實(shí)是正相關(guān)的猩猩負(fù)載越就表示正在 CPU 上運(yùn)行,或等待 CPU 執(zhí)行的進(jìn)程越多,CPU 消耗量也會(huì)越高。但是前面節(jié)并們看到了,本文使的 3.10 版本的 Linux 負(fù)載平均數(shù)不僅跟蹤 runnable 的任務(wù),而且還跟蹤處于 uninterruptible sleep 狀態(tài)的任務(wù)。而 uninterruptible 狀態(tài)的進(jìn)程其實(shí)是不占 CPU 的。所以說(shuō),負(fù)載高并不一定旄馬 CPU 處理不過(guò)來(lái),也有可能會(huì)是鱃魚(yú)為磁盤等其他資源詞綜度不過(guò)而使得進(jìn)程進(jìn)入 uninterruptible 狀態(tài)的進(jìn)程導(dǎo)致的!為什么要計(jì)蒙么修改我從網(wǎng)上搜到了遠(yuǎn)在 1993 年的一封郵件里找到了原因,窮奇下是郵件原文。From:?Matthias?Urlichs?