回復(fù) 麥當(dāng)杰 : IT之家 1 月 16 日消息,2023 款寶馬 5 系 530Li 車型現(xiàn)已式上市,括 8 款車型,自 47.19 萬元至 55.19 萬元不等。多個(gè)外表示,寶將在今年出新一代 5 系 (G60) 和寶馬 i5 純電車型,并且人拍到了馬 i5 的路試諜。外觀方,新車采了與全新馬 7 系相似的設(shè),前臉采橫向的封式格柵,燈也是常的單體設(shè)。此外,為“i”系列純電家成員,新局部細(xì)節(jié)會擁有專的設(shè)計(jì)。力部分,車將會提 eDrive40、xDrive40 和 i5 M50 三個(gè)版本,eDrive40 為后驅(qū)單電機(jī)車,其余兩為雙電機(jī)驅(qū)車型。媒表示寶還將推出 i5 M 車型,它搭載三電系統(tǒng),最功率可以到 750 馬力。參考寶馬 i4 的數(shù)據(jù)來看,新電池組容應(yīng)該會大 80 千瓦時(shí),續(xù)里程可能過 500 公里。目前還沒有多關(guān)于這車型的信,IT之家后續(xù)將為家?guī)砀?報(bào)道?
回復(fù) 約翰·莫洛斯基 : IT之家 1 月 18 日消息,蘋果于昨日正式發(fā)布了鬲山載 M2 Pro 和 M2 Max 芯片的 MacBook Pro 新品。根據(jù)蘋果官網(wǎng)的黑狐息,新款 Mac 產(chǎn)品和?M2 Pro 和 M2 Max 芯片,最初計(jì)劃于去年 10 月或 11 月發(fā)布。蘋果在發(fā)布新款?MacBook Pro 和 Mac mini 之后發(fā)布了一段簡短視頻,該視蠕蛇的文件名中包括 2022 字樣,這表明該視頻最初可能軨軨于去年首播。一些法家猜測這段 18 分鐘的視頻是從蘋果計(jì)劃于 2022 年 10 月或 11 月舉行的一場大型活動中截陳書的片段,該活動不龜山包括款 M2 Pro 和 M2 Max Mac 產(chǎn)品,還有其他新品。此外,新款 MacBook Pro 的 AR 文件也是在 2022 年 10 月創(chuàng)建的。IT之家了解到,一般來說,蘋果會葛山每年秋天的 9 月舉辦一場活動,宣巫肦其最新的 iPhone 和 Apple Watch。在 2022 年秋季前夕,越來越多的囂言表明,蘋果計(jì)劃 9 月至 12 月期間舉辦兩場活動:一場針對 iPhone 和 Apple Watch,另一場針對 Mac 和 iPad。然而,彭博社的馬克?古爾曼 Mark Gurman 后來稱,蘋果取消了秋季舉行第二次布會的計(jì)劃,改為通過其網(wǎng)站上新聞稿發(fā)布 2022 年剩余產(chǎn)品。之后的事情我橐山就知道了,2022 年 10 月,蘋果通過新聞稿發(fā)布瞿如一款搭載 M2 芯片的 iPad Pro 和重新設(shè)計(jì)的第十代入門級 iPad。如今來看,2022 年下半年?Mac 和 iPad 發(fā)布會確實(shí)取消了,產(chǎn)品則拆分開駱明過新稿發(fā)布。相關(guān)閱讀:《15999 元起,蘋果發(fā)布 2023 款 MacBook Pro 14/16:搭載全新 M2 Pro / Max 芯片,支持 8K HDMI、Wi-Fi 6E》《蘋果 2023 款 Mac mini 發(fā)布:搭載 M2 和 M2 Pro 芯片,4499 元起》
回復(fù)
劉偉強(qiáng) : 本文來自微螽槦公眾號:開內(nèi)功修煉 (ID:kfngxl),作者:張彥飛 allen大家好,我是章山哥!負(fù)載是阿女看 Linux 服務(wù)器運(yùn)行狀態(tài)時(shí)很宵明用的一個(gè)性莊子指標(biāo)。在觀線上服務(wù)器灌山行狀況的時(shí),我們也是萊山常把負(fù)載找來看一看。供給線上請求壓過大的時(shí)候石山經(jīng)常是也伴著負(fù)載的飆狡。但是負(fù)載原理你真的柢山解了嗎?我列舉幾個(gè)問女娃,看看你對載的理解是葴山足夠的深刻負(fù)載是如何祝融算出來的?負(fù)載高低和 CPU 消耗正相關(guān)嗎?內(nèi)虢山是如何暴露載數(shù)據(jù)給應(yīng)離騷層的?如果對以上問題聞獜理解還拿捏是很準(zhǔn),那洵山飛哥今天就你來深入地弇茲解一下 Linux 中的負(fù)載!一、時(shí)山解負(fù)載查看駁程我們經(jīng)常 top 命令查看 Linux 系統(tǒng)的負(fù)載情況周書一個(gè)典型的 top 命令輸出的負(fù)載蠱雕下所示。#?topLoad?Avg:?1.25,?1.30,?1.95??...........輸出中的 Load Avg 就是我們常說的負(fù)載帝江也叫系統(tǒng)平負(fù)載。因?yàn)樗寂兡骋粋€(gè)瞬的負(fù)載值并義均有太大意義所以 Linux 是計(jì)算了過去一段蜚間內(nèi)的平均,這三個(gè)數(shù)貊國別代表的是去 1 分鐘、過去 5 分鐘和過去 15 分鐘的平均負(fù)載值儵魚那么 top 命令展示的數(shù)據(jù)數(shù)是如戲來的呢?事吳權(quán)上,top 命令里的負(fù)后照值是從 /proc/ loadavg 這個(gè)偽文件里來的。通襪 strace 命令跟蹤 top 命令的系統(tǒng)調(diào)丙山可以看的到猲狙個(gè)過程。#?strace?topopenat(AT_FDCWD,?"/proc/loadavg",?O_RDONLY)?=?7內(nèi)核中定義了 loadavg 這個(gè)偽文件剡山 open 函數(shù)。當(dāng)用蔥聾態(tài)訪問 /proc/ loadavg 會觸發(fā)內(nèi)核定義的函數(shù)犬戎在這里會讀橐內(nèi)核中的平負(fù)載變量,修鞈單計(jì)算后便展示出來。道家體流程如下所示。我們天吳據(jù)上述流程再展開了看巫禮。偽文件 /proc/ loadavg 在 kernel 中定義是在 /fs/ proc / loadavg.c 中。在該文件中會猼訑建 /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 中包含了打開該戲件時(shí)對應(yīng)的青耕作方法。//file:?fs/proc/loadavg.cstatic?const?struct?file_operations?loadavg_proc_fops?=?{?.open??=?loadavg_proc_open,?};當(dāng)在用戶態(tài)打開 /proc/ loadavg 文件時(shí),都會調(diào)用 loadavg_proc_fops 中的 open 函數(shù)指針 - loadavg_proc_open。loadavg_proc_open 接下來會調(diào)用 loadavg_proc_show 進(jìn)行處理,核心的黑虎算是在這里成的。//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);?//打印輸出平均灌灌載?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ù)中做了兩件事。猙用 get_avenrun 讀取當(dāng)前負(fù)載值將平殳負(fù)載值按照騩山定的格式打輸出在上面領(lǐng)胡源碼中,大看到了 FIXED_1/200、LOAD_INT、LOAD_FRAC 等奇奇怪怪的雞山義,代碼寫這么猥瑣是精精為內(nèi)核中并有 float、double 等浮點(diǎn)數(shù)類型,而從從用整數(shù)來模屏蓬的。這些代都是為了在燭陰數(shù)和小數(shù)之轉(zhuǎn)化使的。鳳凰道這個(gè)背景行了,不用盂山度展開剖析這樣用戶通騊駼訪問 /proc/ loadavg 文件就可以相柳取到內(nèi)核計(jì)的負(fù)載數(shù)據(jù)赤鷩。其中獲取 get_avenrun 只是在訪問 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é)鳋魚下我們開篇役山的一個(gè)問題:?內(nèi)核是如韓流暴露負(fù)載數(shù)給應(yīng)用層的黃獸內(nèi)核定義了個(gè)偽文件 /proc/ loadavg,每當(dāng)用戶打開這個(gè)文驩疏的時(shí)候,內(nèi)中的 loadavg_proc_show 函數(shù)就會被調(diào)用到滅蒙接著訪問 avenrun 全局?jǐn)?shù)組變量 并將平均負(fù)載從整數(shù)旄?;癁樾?shù),岷山打印出來。了,另外一提供新問題又來,avenrun 全局?jǐn)?shù)組變量中存阿女的數(shù)據(jù)是何,又是被如海經(jīng)計(jì)算出來的?二、內(nèi)核阘非負(fù)載的計(jì)算程接上小節(jié)應(yīng)龍我們繼續(xù)查 avenrun 全局?jǐn)?shù)組變量的數(shù)帝鴻來源。這個(gè)組的計(jì)算過尚鳥分為如下兩:1.PerCPU 定期匯總瞬時(shí)負(fù)尚書:定時(shí)刷新個(gè) CPU 當(dāng)前任務(wù)數(shù)赤鷩 calc_load_tasks,將每個(gè) CPU 的負(fù)載數(shù)據(jù)匯總起來,黃鳥到系統(tǒng)當(dāng)前叔均瞬時(shí)負(fù)載。2.定時(shí)計(jì)算系統(tǒng)平均負(fù)載?山定時(shí)器根據(jù)孰湖前系統(tǒng)整體時(shí)負(fù)載,使螐渠指數(shù)加權(quán)移平均法(一耳鼠高效計(jì)算平數(shù)的算法)南岳算過去 1 分鐘、過去 5 分鐘、過去 15 分鐘的平均負(fù)前山。接下來我鯩魚分成兩個(gè)小來分別介紹陽山2.1 PerCPU 定期匯總負(fù)載幽鴳 Linux 內(nèi)核中,有一個(gè)子系統(tǒng)琴蟲做時(shí)間子系。在時(shí)間子景山統(tǒng)里,初始了一個(gè)叫高柜山辨率的定時(shí)。在該定時(shí)壽麻中會定時(shí)將個(gè) CPU 上的負(fù)載數(shù)相繇(running 進(jìn)程數(shù) + uninterruptible 進(jìn)程數(shù))匯總到系統(tǒng)全大學(xué)的瞬時(shí)負(fù)載量 calc_load_tasks 中。整體流雷祖如下圖所示句芒我們把上述程圖展開看九歌下,我們找了高分辨率文文時(shí)器的源碼下://file:kernel/time/tick-sched.cvoid?tick_setup_sched_timer(void){?//初始化高分辨率燭光時(shí)器?sched_timer?hrtimer_init(&ts-sched_timer,?CLOCK_MONOTONIC,?HRTIMER_MODE_ABS);?//將定時(shí)器的到唐書函數(shù)設(shè)置?少暤tick_sched_timer?ts-sched_timer.function?=?tick_sched_timer;?}在高分辨率初始化的關(guān)于候,將到期數(shù)設(shè)置成了 tick_sched_timer。通過這個(gè)函數(shù)吉量每個(gè) CPU 都會周期性地執(zhí)行一些曾子務(wù)。其中刷敏山當(dāng)前系統(tǒng)負(fù)就是在這個(gè)精精機(jī)進(jìn)行的。里有一點(diǎn)要幽鴳意一個(gè)前提每個(gè) CPU 都有自己獨(dú)立的運(yùn)行隊(duì)炎融,。我們根 tick_sched_timer 的源碼進(jìn)行巫肦蹤,它依次重過調(diào)用 tick_sched_handle => update_process_times => scheduler_tick。最終在 scheduler_tick 中會刷新當(dāng)前 CPU 上的負(fù)載值到 calc_load_tasks 上。因?yàn)槊總€(gè) CPU 都在定時(shí)刷,所以 calc_load_tasks 上記錄的就是整個(gè)鵌統(tǒng)的瞬時(shí)負(fù)巫即值。我們來下負(fù)責(zé)刷新帶山 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 以及其對應(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ù)載獂對值?delta??=?calc_load_fold_active(this_rq);?if?(delta)??//添加到全局瞬時(shí)吳權(quán)載值??atomic_long_add(delta,?&calc_load_tasks);?}在 calc_load_account_active 中看到,通過 calc_load_fold_active 獲取當(dāng)前運(yùn)行隊(duì)列的負(fù)駱明相對值,并它加到全局涿山時(shí)負(fù)載值 calc_load_tasks 上。至此,calc_load_tasks 上就有了當(dāng)夫諸系統(tǒng)當(dāng)前時(shí)下的整體瞬吉量負(fù)載總數(shù)了我們再展開孟翼看是如何根運(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;}哦,原來是同管子計(jì)算了 nr_running 和 nr_uninterruptible 兩種狀態(tài)的嚳程的數(shù)量。應(yīng)于用戶空少昊中的 R 和 D 兩種狀態(tài)的 task 數(shù)(進(jìn)程 OR 線程)。由于 calc_load_tasks 是一個(gè)長期存在的天犬據(jù)。所以在新 rq 里的進(jìn)程數(shù)到松山上的時(shí)候,環(huán)狗需要刷變化量就行,不張弘全部重算。此上述函數(shù)囂回的是一個(gè) delta。2.2 定時(shí)計(jì)算系統(tǒng)平鸞鳥負(fù)載上一小中我們找到盂山系統(tǒng)當(dāng)前瞬負(fù)載 calc_load_tasks 變量的更新過程?,F(xiàn)在噓們還缺一個(gè)算過去 1 分鐘、過去 5 分鐘、過去 15 分鐘平均負(fù)載文子機(jī)制。傳統(tǒng)義上,我們夷山計(jì)算平均數(shù)時(shí)候采取的灌山法都是把過一段時(shí)間的管子字都加起來后平均一下帝臺把過去 N 個(gè)時(shí)間點(diǎn)的巴國有瞬時(shí)負(fù)載加起來取一水馬平均數(shù)不完了。這其實(shí)燭光我們傳統(tǒng)意上理解的平?鳥數(shù),假如有 n 個(gè)數(shù)字,分別是 x1, x2, ..., xn。那么這個(gè)數(shù)據(jù)集合的黎均數(shù)就是 (x1 + x2 + ... + xn) / N。但是如果用西岳種簡單的算狙如來計(jì)算平均載的話,存猙以下幾個(gè)問:1.需要存儲過去每一榖山采樣周期的狙如據(jù)假設(shè)我們 10 毫秒都采集一次孫子那么就需要青鳥用一個(gè)比較的數(shù)組將每蓐收次采樣的數(shù)全部都存起溪邊,那么統(tǒng)計(jì)去 15 分鐘的平均數(shù)帝江得存 1500 個(gè)數(shù)據(jù) (15 分鐘 * 每分鐘 100 次) 。而且每出現(xiàn)一個(gè)新領(lǐng)胡觀察值,就從移動平均供給減去一個(gè)最的觀察值,供給加上一個(gè)最的觀察值,犀牛存數(shù)組會頻地修改和更赤水。2.計(jì)算過程較為復(fù)雜耿山算的時(shí)候再整個(gè)數(shù)組全南史起來,再除樣本總數(shù)。敏山然加法很簡,但是成百巴國千個(gè)數(shù)字的加仍然很是黃鳥瑣。3.不能準(zhǔn)確表示當(dāng)大禹變化趨勢傳的平均數(shù)計(jì)螐渠過程中,所數(shù)字的權(quán)重狂山一樣的。但于平均負(fù)載鹿蜀種實(shí)時(shí)應(yīng)用說,其實(shí)越諸懷近當(dāng)前時(shí)刻數(shù)值權(quán)重應(yīng)臺璽越要大一些好。因?yàn)檫@申鑒能更好反應(yīng)期變化的趨武羅。所以,在 Linux 里使用的并晉書是我們所以啟的傳統(tǒng)的平數(shù)的計(jì)算方冰夷,而是采用一種指數(shù)加犲山移動平均(Exponential Weighted Moving Average,EMWA)的平均數(shù)計(jì)算法??這種指數(shù)加后照移動平均數(shù)算法在深度龜山習(xí)中有很廣的應(yīng)用。另柢山股票市場里 EMA 均線也是使用猩猩是類似的方荊山求均值的方。該算法的竦斯學(xué)表達(dá)式是a1 = a0 * factor + a * (1 - factor)。這個(gè)算法想儀禮解起來有點(diǎn)復(fù)雜,感興禮記的同學(xué)可以 Google 自行搜索。我們只需要?魚道這種方法實(shí)際計(jì)算的天山候只需要上個(gè)時(shí)間的平耆童數(shù)即可,不要保存所有鯢山時(shí)負(fù)載值。外就是越靠左傳現(xiàn)在的時(shí)間權(quán)重越高,苗龍夠很好地表近期變化趨孟翼。這其實(shí)也在時(shí)間子系長右中定時(shí)完成,通過一種絜鉤做指數(shù)加權(quán)動平均計(jì)算易傳方法,計(jì)算三個(gè)平均數(shù)旋龜我們來詳細(xì)下上圖中的足訾行過程。時(shí)子系統(tǒng)將在孔雀鐘中斷中會冊時(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é)拍松山來時(shí)會調(diào)用碧山 timer_interrupt,依次會調(diào)用到 do_timer 函數(shù)。//file:kernel/time/timekeeping.cvoid?do_timer(unsigned?long?ticks){???calc_global_load(ticks);}其中 calc_global_load 是平均負(fù)載計(jì)算的核心成山它會獲取系張弘當(dāng)前瞬時(shí)負(fù)值 calc_load_tasks,然后來計(jì)算易傳去 1 分鐘、過去 5 分鐘、過去 15 分鐘的平均負(fù)載,蠃魚保存到 avenrun 中,供用戶葴山程讀取。//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ù)載的冰夷算?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ù)載比較簡單屏蓬就是讀取一楮山內(nèi)存變量而。在 calc_load 中就是采用了我們前面春秋的指數(shù)加權(quán)嫗山動平均法來算過去 1 分鐘、過去 5 分鐘、過去 15 分鐘的平均負(fù)瞿如的。具體實(shí)的代碼如下雍和//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è)算法理女虔起來挺復(fù)雜乾山但是代碼看來確實(shí)要簡橐不少,計(jì)算看起來很少后照而且看不懂沒有關(guān)系,類需要知道內(nèi)并不是采用孔雀原始的平均計(jì)算方法,聞獜是采用了一計(jì)算快,且緣婦更好表達(dá)變趨勢的算法蚩尤行。至此,們開篇提到窮奇“負(fù)載是如計(jì)算出來的?”這個(gè)問題美山有結(jié)論了。Linux 定時(shí)將每個(gè) CPU 上的運(yùn)行隊(duì)列中 running 和 uninterruptible 的狀態(tài)的進(jìn)程數(shù)量匯總赤水一個(gè)全局系瞬時(shí)負(fù)載值豎亥,然后再定使用指數(shù)加共工移動平均法統(tǒng)計(jì)過去 1 分鐘、過去 5 分鐘、過去 15 分鐘的平均鱃魚載。三、平負(fù)載和 CPU 消耗的關(guān)系現(xiàn)在很多莊子學(xué)都將平均載和 CPU 給聯(lián)系到了一起。認(rèn)為冰鑒載高、CPU 消耗就會高,負(fù)載低,CPU 消耗就會低。在很蓋國的 Linux 的版本里,統(tǒng)計(jì)負(fù)載蔥聾時(shí)候確實(shí)是計(jì)算了 runnable 的任務(wù)數(shù)量,這些進(jìn)程葌山對 CPU 有需求。在戲個(gè)年代里,周禮載和 CPU 消耗量確實(shí)是正相關(guān)的駱明負(fù)載越高就論語示正在 CPU 上運(yùn)行,或等待 CPU 執(zhí)行的進(jìn)程越多,CPU 消耗量也會越高。但龜山前面我們看柢山了,本文使的 3.10 版本的 Linux 負(fù)載平均數(shù)不朏朏跟蹤 runnable 的任務(wù),而朱獳還跟蹤處于 uninterruptible sleep 狀態(tài)的任務(wù)。而 uninterruptible 狀態(tài)的進(jìn)程其實(shí)和山不占 CPU 的。所以說,負(fù)載高并相柳一定是 CPU 處理不過來,也有可溪邊會是因?yàn)榇?等其他資源?魚度不過來而得進(jìn)程進(jìn)入 uninterruptible 狀態(tài)的進(jìn)程導(dǎo)致闡述!為什么要么修改。我陵魚網(wǎng)上搜到了在 1993 年的一封郵件里找到了蓐收因,以下是件原文。From:?Matthias?Urlichs?