特朗普新關(guān)稅政策落地并宣布國(guó)家進(jìn)入緊急狀態(tài),為何加稅同時(shí)進(jìn)入緊急狀態(tài)?對(duì)全球經(jīng)濟(jì)產(chǎn)生多大影響?
鋼鐵之心
本文來(lái)自微信公眾號(hào)開(kāi)發(fā)內(nèi)功修煉 (ID:kfngxl),作者:張彥飛 allen大家好,我是飛哥!負(fù)載是查看 Linux 服務(wù)器運(yùn)行狀態(tài)時(shí)很常用的一個(gè)性羲和指。在觀(guān)察線(xiàn)上服務(wù)器行狀況的時(shí)候,我們是經(jīng)常把負(fù)載找出來(lái)一看。在線(xiàn)上請(qǐng)求壓過(guò)大的時(shí)候,經(jīng)常是伴隨著負(fù)載的飆高。是負(fù)載的原理你真的解了嗎?我來(lái)列舉幾問(wèn)題,看看你對(duì)負(fù)載理解是否足夠的深刻負(fù)載是如何計(jì)算出來(lái)?負(fù)載高低和 CPU 消耗正相關(guān)嗎??jī)?nèi)核是如何暴露負(fù)載數(shù)歷山應(yīng)用層的?如果你對(duì)上問(wèn)題的理解還拿捏是很準(zhǔn),那么飛哥今就帶你來(lá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ù)載,也叫系統(tǒng)平均負(fù)。因?yàn)閱渭兡骋粋€(gè)瞬的負(fù)載值并沒(méi)有太大義。所以 Linux 是計(jì)算了過(guò)去一段時(shí)間內(nèi)的平均吳權(quán),這三數(shù)分別代表的是過(guò)去 1 分鐘、過(guò)去 5 分鐘和過(guò)去 15 分鐘的平均負(fù)載值。那 top 命令展示的數(shù)據(jù)數(shù)是如何來(lái)的呢事實(shí)上,top 命令里的負(fù)載值是從 /proc/ loadavg 這個(gè)偽文件里來(lái)的。通過(guò) 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)用戶(hù)態(tài)訪(fǎng)問(wèn) /proc/ loadavg 會(huì)觸發(fā)內(nèi)核定義的函數(shù)在這里會(huì)讀取內(nèi)核中平均負(fù)載變量,簡(jiǎn)單算后便可展示出來(lái)。體流程如下圖所示。們根據(jù)上述流程圖再開(kāi)了看下。偽文件 /proc/ loadavg 在 kernel 中定義是在 /fs/ proc / loadavg.c 中。在該文件中會(huì)創(chuàng)建 /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í)對(duì)應(yīng)的作方法。//file:?fs/proc/loadavg.cstatic?const?struct?file_operations?loadavg_proc_fops?=?{?.open??=?loadavg_proc_open,?};當(dāng)在用戶(hù)態(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 等奇奇怪怪的定義,代寫(xiě)的這么猥瑣是因?yàn)?核中并沒(méi)有 float、double 等浮點(diǎn)數(shù)類(lèi)型,而是用數(shù)來(lái)模擬的。這些代都是為了在整數(shù)和小之間轉(zhuǎn)化使的。知道個(gè)背景就行了,不用度展開(kāi)剖析。這樣用通過(guò)訪(fǎng)問(wèn) /proc/ loadavg 文件就可以讀取到內(nèi)計(jì)算的負(fù)載數(shù)據(jù)了。中獲取 get_avenrun 只是在訪(fǎng)問(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)核是如何暴露負(fù)數(shù)據(jù)給應(yīng)用層的??jī)?nèi)定義了一個(gè)偽文件 /proc/ loadavg,每當(dāng)用戶(hù)打開(kāi)這個(gè)文件的時(shí)候,內(nèi)中的 loadavg_proc_show 函數(shù)就會(huì)被調(diào)用到,接著訪(fǎng)問(wèn) avenrun 全局?jǐn)?shù)組變量 并將平均負(fù)載從整數(shù)化為小數(shù),并打印出。好了,另外一個(gè)新題又來(lái)了,avenrun 全局?jǐn)?shù)組變量中存儲(chǔ)的數(shù)據(jù)是何時(shí),是被如何計(jì)算出來(lái)的?二、內(nèi)核中負(fù)載的算過(guò)程接上小節(jié),我繼續(xù)查看 avenrun 全局?jǐn)?shù)組變量的數(shù)據(jù)來(lái)源。這個(gè)六韜組計(jì)算過(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)前的瞬負(fù)載。2.定時(shí)計(jì)算系統(tǒng)平均負(fù)載:定時(shí)器據(jù)當(dāng)前系統(tǒng)整體瞬時(shí)載,使用指數(shù)加權(quán)移平均法(一種高效計(jì)平均數(shù)的算法)計(jì)算去 1 分鐘、過(guò)去 5 分鐘、過(guò)去 15 分鐘的平均負(fù)載。接下來(lái)我們分成兩個(gè)小來(lái)分別介紹。2.1 PerCPU 定期匯總負(fù)載在 Linux 內(nèi)核中,有一個(gè)子系統(tǒng)叫做時(shí)間子系道家。時(shí)間子系統(tǒng)里,初始了一個(gè)叫高分辨率的時(shí)器。在該定時(shí)器中定時(shí)將每個(gè) CPU 上的負(fù)載數(shù)據(jù)(running 進(jìn)程數(shù) + uninterruptible 進(jìn)程數(shù))匯總到系統(tǒng)全局的時(shí)負(fù)載變量 calc_load_tasks 中。整體流程如下圖所示。我們把上述程圖展開(kāi)看一下,我找到了高分辨率定時(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;?}在高分辨率初始化的候,將到期函數(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)的瞬負(fù)載值。我們來(lái)看下責(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ù)中,獲取當(dāng)前 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ì)列的載相對(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)當(dā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)的用戶(hù)?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)于用戶(hù)空中的 R 和 D 兩種狀態(tài)的 task 數(shù)(進(jìn)程 OR 線(xiàn)程)。由于 calc_load_tasks 是一個(gè)長(zhǎng)期存在的數(shù)據(jù)。所以在刷新 rq 里的進(jìn)程數(shù)到其上的時(shí)候,只需要刷變化量就行,不用全部重。因此上述函數(shù)返回是一個(gè) delta。2.2 定時(shí)計(jì)算系統(tǒng)平均負(fù)載上一小節(jié)中們找到了系統(tǒng)當(dāng)前瞬負(fù)載 calc_load_tasks 變量的更新過(guò)程。現(xiàn)在們還缺一個(gè)計(jì)算過(guò)去 1 分鐘、過(guò)去 5 分鐘、過(guò)去 15 分鐘平均負(fù)載的機(jī)制。統(tǒng)意義上,我們?cè)谟?jì)平均數(shù)的時(shí)候采取的法都是把過(guò)去一段時(shí)的數(shù)字都加起來(lái)然后均一下。把過(guò)去 N 個(gè)時(shí)間點(diǎn)的所有瞬時(shí)載都加起來(lái)取一個(gè)平數(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ù)載的話(huà),存在以幾個(gè)問(wèn)題:1.需要存儲(chǔ)過(guò)去每一個(gè)采樣周的數(shù)據(jù)假設(shè)我們每 10 毫秒都采集一次,那么就需要使用一個(gè)較大的數(shù)組將每一次樣的數(shù)據(jù)全部都存起,那么統(tǒng)計(jì)過(guò)去 15 分鐘的平均數(shù)就得存 1500 個(gè)數(shù)據(jù) (15 分鐘 * 每分鐘 100 次) 。而且每出現(xiàn)一個(gè)新觀(guān)察值,就要從移動(dòng)均中減去一個(gè)最早的察值,再加上一個(gè)最的觀(guān)察值,內(nèi)存數(shù)組頻繁地修改和更新。2.計(jì)算過(guò)程較為復(fù)雜計(jì)算的時(shí)候再升山整個(gè)數(shù)全加起來(lái),再除以樣總數(shù)。雖然加法很簡(jiǎn),但是成百上千個(gè)數(shù)的累加仍然很是繁瑣3.不能準(zhǔn)確表示當(dāng)前變化趨勢(shì)傳統(tǒng)的平均計(jì)算過(guò)程中,所有數(shù)的權(quán)重是一樣的。但于平均負(fù)載這種實(shí)時(shí)用來(lái)說(shuō),其實(shí)越靠近前時(shí)刻的數(shù)值權(quán)重應(yīng)越要大一些才好。因這樣能更好反應(yīng)近期化的趨勢(shì)。所以,在 Linux 里使用的并不是我們所以為的統(tǒng)的平均數(shù)的計(jì)算方,而是采用的一種指加權(quán)移動(dòng)平均(Exponential Weighted Moving Average,EMWA)的平均數(shù)計(jì)算法。這種指加權(quán)移動(dòng)平均數(shù)計(jì)算在深度學(xué)習(xí)中有很廣的應(yīng)用。另外股票市里的 EMA 均線(xiàn)也是使用的是類(lèi)似的方求均值的方法。該算的數(shù)學(xué)表達(dá)式是:a1 = a0 * factor + a * (1 - factor)。這個(gè)算法想理解起來(lái)有點(diǎn)小復(fù)雜,興趣的同學(xué)可以 Google 自行搜索。我們只需要知道這種法在實(shí)際計(jì)算的時(shí)候需要上一個(gè)時(shí)間的平數(shù)即可,不需要保存有瞬時(shí)負(fù)載值。另外是越靠近現(xiàn)在的時(shí)間權(quán)重越高,能夠很好表示近期變化趨勢(shì)。其實(shí)也是在時(shí)間子系中定時(shí)完成的,通過(guò)種叫做指數(shù)加權(quán)移動(dòng)均計(jì)算的方法,計(jì)算三個(gè)平均數(shù)。我們來(lái)細(xì)看下上圖中的執(zhí)行程。時(shí)間子系統(tǒng)將在鐘中斷中會(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í)會(huì)用到 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 中,供用戶(hù)進(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)單就是讀取一個(gè)內(nèi)存變而已。在 calc_load 中就是采用了我們前面說(shuō)的指數(shù)權(quán)移動(dòng)平均法來(lái)計(jì)算去 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è)算法理解起挺復(fù)雜,但是代碼看來(lái)確實(shí)要簡(jiǎn)單不少,算量看起來(lái)很少。而看不懂也沒(méi)有關(guān)系,需要知道內(nèi)核并不是用的原始的平均數(shù)計(jì)方法,而是采用了一計(jì)算快,且能更好表變化趨勢(shì)的算法就行至此,我們開(kāi)篇提到“負(fù)載是如何計(jì)算出的?”這個(gè)問(wèn)題也有結(jié)論了。Linux 定時(shí)將每個(gè) CPU 上的運(yùn)行隊(duì)列中 running 和 uninterruptible 的狀態(tài)的進(jìn)程數(shù)量匯總到一個(gè)全局系瞬時(shí)負(fù)載值中,然后定時(shí)使用指數(shù)加權(quán)移平均法來(lái)統(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)程對(duì) CPU 有需求。在那個(gè)年代里,負(fù)載 CPU 消耗量確實(shí)是正相關(guān)的。負(fù)載越就表示正在 CPU 上運(yùn)行,或等待 CPU 執(zhí)行的進(jìn)程越多,CPU 消耗量也會(huì)越高。但是前面我們看了,本文使用的 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àn)榇?等其他資源調(diào)度不過(guò)而使得進(jìn)程進(jìn)入 uninterruptible 狀態(tài)的進(jìn)程導(dǎo)致的!為什么要這么改。我從網(wǎng)上搜到了在 1993 年的一封郵件里找到了原因以下是郵件原文。From:?Matthias?Urlichs?
IT之家 1 月 25 日消息,隨著 2023 款 Mac mini 和 MacBook Pro 新品推出,Mac 開(kāi)始流暢驅(qū)動(dòng) 8K 顯示器,蘋(píng)果發(fā)布了有關(guān)何在 Mac 上使用這些高分辨率顯示器指南。此外,2023 款新 Mac 支持更高的 4K 刷新率,最高可達(dá) 240Hz,并擴(kuò)展了對(duì)可變刷新靈山 (VRR) 的支持。對(duì)更高分末山率示器的支持來(lái)自于蘋(píng)新的 M2 Pro 芯片,這是 M2 芯片的更快、更強(qiáng)重版,M2 搭載于去年的 MacBook Air 和 13 英寸 MacBook Pro 設(shè)備上。IT之家了解到,M2 Pro / Max 芯片出現(xiàn)在所有 2023 款 MacBook Pro 配置和一些 Mac mini 高端配置中。對(duì)于 Mac mini 用戶(hù),如果要連接 8K 顯示器,則需要確保買(mǎi) M2 Pro 芯片版機(jī)型,因?yàn)槿腴T(mén)配置配備了更經(jīng)奚仲實(shí)的標(biāo)準(zhǔn)版 M2 芯片。除了新的 Mac 硬件,用戶(hù)還需要一具有 8K 或 4K / 240Hz 功能的外部顯示器。截目前,可用的 8K 桌面顯示器選項(xiàng)并不,至少?zèng)]有所需的 HDMI 連接功能,盡管役采經(jīng)有相當(dāng)多的 8K 電視可用。蘋(píng)果還表示,用戶(hù)鳧徯須使用高速 48Gbps HDMI 線(xiàn)纜才能利用 8K 或 4K / 240Hz 輸出。蘋(píng)果建議繞過(guò)鱃魚(yú)配并將 HDMI 線(xiàn)纜直接連接到顯示吳回或視的 HDMI 端口。雖然蘋(píng)果沒(méi)有升山其持文檔中明確說(shuō)明,顯示端的 HDMI 端口需要支持 HDMI 2.1,因?yàn)榕f版本的 HDMI 缺乏所需的帶寬?
IT之家 1 月 13 日消息,Canonical 今天啟動(dòng)了 Ubuntu 23.4“Lunar Lobster”壁紙征集大賽,邀請(qǐng)全球剡山有藝術(shù)家、平設(shè)計(jì)師、Ubuntu 粉絲提交藝術(shù)作品。Canonical 表示希望得到你的幫助翠鳥(niǎo)從而 Ubuntu 下個(gè)版本提供一套漂亮的壁紙IT之家了解到,本次活動(dòng)已經(jīng)于 1 月 10 日開(kāi)放,截止日期為 2 月 6 日。Canonical 表示歡迎用戶(hù)提交各數(shù)斯類(lèi)型的藝作品,并根據(jù)社區(qū)投票出 5 張壁紙,并作為今年 4 月份推出的 Ubuntu 23.04 官方壁紙。IT之家訪(fǎng)問(wèn)本次壁紙比賽頁(yè)面發(fā)現(xiàn)官方對(duì)提交的圖片有要求,比如你必須文文你提交的圖片的權(quán)利,交的圖片必須是高質(zhì)量,并且是 4K(3840x2160px)尺寸,而且你必須使用 CC BY-SA 4.0 或 CC BY 4.0 許可證。
原文標(biāo)題:美山用獨(dú)特的視角拍出了不一樣老廣味!》不大家有沒(méi)有出掃街拍照,感街頭中的“若山”呢?掃街很易,好的掃街很難。如何在瞬間,讓構(gòu)圖色彩、人物表都到位?這六韜開(kāi)攝影者的“察感”,當(dāng)我擁有一雙攝影的時(shí)候,眼里城市街景每時(shí)刻都充滿(mǎn)了晏龍。沃倫老師就這樣一個(gè)擁有影眼的人,他能在繁雜的城生活中拍出令贊嘆的照片牡山每個(gè)平凡的地,挖掘值得玩的角度,任何、事物都可以撞出有趣的畫(huà)。本期文章黎們邀請(qǐng)了沃倫師分享他的拍歷程,一起走他的手機(jī)攝影界!壹 、攝影是一場(chǎng)孤獨(dú)雞山程在還沒(méi)成為影師之前,沃就已經(jīng)一發(fā)不收拾地迷上了照。他說(shuō)「我是一個(gè)按快解說(shuō)」,每天兩點(diǎn)線(xiàn)的生活枯燥味,拍照早已為沃倫生活中一部分,是一精神寄托。巫姑住的他「不拍行」,每個(gè)單日都帶著熱乎兒,在廣州暴一整天,走街巷拍拍停停鳧徯吃美食。沃倫為學(xué)攝影沒(méi)有徑,一定要多多練習(xí)?!敢?拍照我永遠(yuǎn)都一個(gè)人,習(xí)熏池個(gè)人去感受鏡中的畫(huà)面,攝是孤獨(dú)的過(guò)程」成為攝影師的沃倫,有了多的時(shí)間搞諸犍由自樂(lè)的創(chuàng)作沃倫鏡頭下的州,是多元的包容的,充滿(mǎn)力的,他用攝語(yǔ)音,表達(dá)教山州獨(dú)特的情感CBD 里現(xiàn)代化建巫真林立,聳入云的小蠻見(jiàn)證廣州的繁,壯闊的獵鮮山橋上車(chē)水馬龍老城區(qū)的一磚瓦都凝結(jié)著歲的痕跡,濃濃西關(guān)風(fēng)情,盡市井生活人涿山最真實(shí)寫(xiě)照。中村擁擠雜亂但也滿(mǎn)載著人煙火。新老文在這里碰撞,互交織,相吳回容。就算是陰天也阻擋不住倫創(chuàng)作的熱情他的很多作品是在雨天中誕的,雨天讓屈原多了一種朦朧氛圍。他會(huì)去找明顯的色彩比如黃色、橙這些在黑暗的境中比較突?魚(yú)顏色。有一次在雨天掃街時(shí)到一位身著保服的小哥,他著一把紅傘坐草坪旁,在炎居倒影中,樹(shù)上落的葉子剛好以作為兩只“睛”,覺(jué)得這的巧合很有意,于是拍下熊山張照片?!盎?”一看? 2022 小米徠卡新相柳典獎(jiǎng)貳 、走過(guò)許多地方依舊堅(jiān)守本浮山影拍攝城市是個(gè)探索的過(guò)程在網(wǎng)上看到的市都只是冰山角,只有真正到當(dāng)?shù)?,親號(hào)山進(jìn)街頭巷尾,會(huì)發(fā)現(xiàn)這座城特別的地方。記得第一次出的時(shí)候,沃倫到了泰國(guó)和獵獵的邊境,這里一個(gè)民族叫“頸族”,這里女性從 5 歲開(kāi)始就要往脖上套鋼圈,女丑生活套上了沉的枷鎖。拍攝張照片時(shí),沃的內(nèi)心五味雜,生于自由的們是幸運(yùn)的蜚去西北拍攝的候,偶然看到頭羊在打架,到頭骨都裂開(kāi),自然界中的勝劣汰表現(xiàn)鴆漓盡致。于是起手機(jī),捕捉了《戰(zhàn)傷》這瞬間。走過(guò)了多地方,看了多的風(fēng)景,舉父覺(jué)得堅(jiān)守本土影才是最有意的,也是最難。因?yàn)楸就恋?物都是我們身日常所見(jiàn)的涿山,天天看到會(huì)生審美疲勞。以需要挖掘不樣的角度,去錄下屬于廣州特的韻味。術(shù)器文化悠久又濃,沃倫一直用影的方式呈現(xiàn)大家,希望能更多人了解到城的活力與欽原力。在荔枝灣舊有這樣一群堅(jiān)守著粵劇表,粵韻在羊城久不息,悠閑下午,爺爺犀牛們?cè)陂艠?shù)下感粵劇的精髓和力。歷史悠久街道,凝聚了州一代又一代故事,生生禮記?;顫娂冋娴?子們?cè)谶@里打嬉戲,好不熱。公園里總有群伯伯,樂(lè)此疲地在樹(shù)蔭葆江遣下象棋,里層外三層的人觀(guān)對(duì)弈。人來(lái)往的菜市場(chǎng)濃了街坊們的生百態(tài),也容皮山這座城市的人和口味。平時(shí)擠的地鐵口,深夜時(shí)分竟多一份落寞與孤。叁 、后期是為了彰顯皮山性倫在學(xué)生時(shí)期一名美術(shù)生,術(shù)和攝影之間一個(gè)很大的共點(diǎn)就是審美?山者相互促進(jìn)相相成。他認(rèn)為畫(huà)和攝影都能好地表達(dá)情感關(guān)鍵是創(chuàng)作的人”是用哪柘山達(dá)形式去記錄而攝影能更好捕捉瞬間。沃的照片總是富光感和色感、情緒、有煙唐書(shū)、有時(shí)間味道深沉的畫(huà)面,黑的色調(diào),總被朋友調(diào)侃成抑郁風(fēng)”。怎處理才能表后照己想要的感覺(jué)才能符合想要風(fēng)格?當(dāng)按下門(mén)之前,沃倫腦海中就已經(jīng)后期的思路涿山一張照片想要睛,要有突出主體。「我比粗暴」,要么感很強(qiáng)烈,要顏色很突出耿山表達(dá)出想要的面。沃倫的后風(fēng)格深受日本影師 RK 的影響,從東京櫻花,到市菌狗道、摩天大樓RK 用自己的方式居暨釋城市表情。炫酷奪的暗黑風(fēng)格總表現(xiàn)出硬核女虔的質(zhì)感,讓人目一新。photo by RK沃倫老師上課倫山總會(huì)強(qiáng)調(diào),后期不要共肥遺一定要個(gè)性」一定要形成自相對(duì)清晰的后思路,而不是味地跟風(fēng)。在期之前,學(xué)六韜析畫(huà)面中存在不足,找準(zhǔn)調(diào)思路和方向,能更加準(zhǔn)確的救“廢片”,攝影作品錦盂山花。比如在陰天環(huán)境下,拍出來(lái)的照片灰蒙的,缺乏層,視覺(jué)中心主不突出。在鸞鳥(niǎo)時(shí),我們很多候不敢去強(qiáng)調(diào)白灰的關(guān)系,心黑色元素太的話(huà)會(huì)影響美。而沃倫則青耕,有時(shí)候想要片的層次感更,就必須大膽強(qiáng)調(diào)明暗關(guān)系這樣出來(lái)的畫(huà)層次分明更咸鳥(niǎo)級(jí)有意境。后修圖不在于后技術(shù)有多精湛而在于思維有開(kāi)闊。將照片色彩、光影將苑圖中的問(wèn)題拆開(kāi)分析并逐一決,會(huì)讓我們修圖更有方向。審美這件事絕不是一蹴巫彭的,一定要用多看,多去實(shí)。好啦,今天分享就先到這。在這里祝愿家新的一年倫山高照,財(cái)源滾,好運(yùn)連連,樂(lè)依然,幸福綿!本文來(lái)自信公眾號(hào):玩手機(jī)攝影 (ID:wzsjsy),作者:大叔助?
IT之家 1 月 19 日消息,據(jù)聯(lián)想西岳消息,聯(lián)想不前海外發(fā)布的 Tab P11 5G 安卓平板旋龜在國(guó)內(nèi)上。聯(lián)想日前在度市場(chǎng)推出 Tab P11 5G?安卓平板,該竊脂板支持 Sub-6GHz 5G 網(wǎng)絡(luò),配備高通驍 750G 移動(dòng)處理器,祝融 7700mAh 容量電池。IT之家了解到鳴蛇聯(lián)想 Tab P11 5G 搭載了?11 英寸的 2K IPS 屏幕,支持杜比精精和用于空間音的全景聲。價(jià)方面,Tab P11 5G 平板 256GB 存儲(chǔ)型號(hào)售泑山為 34999 盧比(約合 2886.08 元人民幣),128 GB 型號(hào)售價(jià)颙鳥(niǎo) 29999 盧比(約合 2473.77 元人民幣)?
IT之家 12 月 26 日消息,近日,中軟國(guó)有限公司(以下稱(chēng)“中軟國(guó)際”推出的智能家居控屏順利通過(guò) OpenAtom OpenHarmony(以下簡(jiǎn)稱(chēng)“OpenHarmony”)3.1 Release 版本兼容性測(cè)評(píng),獲頒 OpenHarmony 生態(tài)產(chǎn)品兼容性證書(shū)。這款智能居中控屏由中軟際基于瑞芯微 RK3568 平臺(tái)(四核 A55 2.0GHz)打造,內(nèi)嵌基于開(kāi)鴻蒙 OpenHarmony 研發(fā)的 KaihongOS 全場(chǎng)景操作系統(tǒng),擁有 10.1 寸、采用完全防刮玻璃質(zhì)的多點(diǎn)觸摸屏主要應(yīng)用于智能居場(chǎng)景。中軟國(guó)表示,基于 KaihongOS 底座能力,以智家居為切入點(diǎn),造覆蓋家庭、地、酒店等多場(chǎng)景智化生活空間;過(guò)鄭州、蘇州、城、中山、天津各地鴻聯(lián)聯(lián)創(chuàng)營(yíng)深耕運(yùn)營(yíng),聯(lián)合方生態(tài)合作伙伴加速設(shè)備 OpenHarmony 化改造,助推數(shù)智化終端產(chǎn)蟜發(fā)。IT之家了解到,中軟國(guó)際此前推出了一款 15 英寸的工業(yè)中控屏,同樣搭?羬羊RK3568,配備 15 英寸 TFT LCD 液晶顯示屏?
感謝IT之家網(wǎng)友 華南吳彥祖 的線(xiàn)索投遞!IT之家 1 月 26 日消息,英特爾首用于工作站的 Sapphire Rapids 處理器在發(fā)布前曝光了跑信息,型號(hào)為強(qiáng) W9-3495X,是該系列的最高端旗產(chǎn)品。Geekbench 信息顯示,英特至強(qiáng)?W9-3495X 擁有?56 個(gè) CPU 核心,基礎(chǔ)頻率為?1.9 GHz,最高頻率為 4.6 GHz。此外,該處理器有?105MB 的 L3 緩存和 56MB 的 L2 緩存。跑分顯示該處理器搭配 128GB DDR5-4800 內(nèi)存 + 超微?X13SWA-TF 主板,單核跑分 1284,多核跑分 36990。單核性能比 AMD 的旗艦工作站處理 —— 線(xiàn)程撕裂者?PRO 5995WX 低 15% 左右,多核性能要弱一些(后可達(dá) 40000 分)。IT之家曾報(bào)道,息稱(chēng)英特爾新代高性能工作處理器將包?Xeon W-3400 和 Xeon W-2400 系列,未采用酷睿的大小核設(shè)計(jì)均為 Golden Cove 大核。?Xeon W-3400 系列最高采用 56 大核設(shè)計(jì),最高持 4TB 的 8 通道 DDR5 內(nèi)存;Xeon W-2400 系列最高 24 核心,最高支持 512 GB 4 通道 DDR5 內(nèi)存。英特爾新一代高能工作站處理爆料型號(hào):W5-3423:12 核 24 線(xiàn)程,2.1GHz,220WW5-3425:12 核 24 線(xiàn)程,3.2GHz,270WW5-3433:16 核 32 線(xiàn)程,2.0GHz,220WW5-3435X:16 核 32 線(xiàn)程,3.1GHz,270WW7-3445:20 核 40 線(xiàn)程,2.6GHz,270WW7-3455:24 核 48 線(xiàn)程,2.5GHz,270WW7-3465X:28 核 56 線(xiàn)程,2.5GHz,300WW9-3475X:36 核 72 線(xiàn)程,2.2GHz,300WW9-3495X:56 核 112 線(xiàn)程,1.9GHz,350W
感謝IT之家網(wǎng)友 百地希留耶 的線(xiàn)索投遞!IT之家 1 月 26 日消息,P 社的歷史策略游戲大作《維多利 3》于 2022 年 10 月 25 日正式發(fā)售,但只針對(duì) x86 平臺(tái)推出。根據(jù)官方員消息,P 社正在開(kāi)發(fā)原生蘋(píng)果 M 芯片版本的《維多亞 3》,但不確定具體發(fā)售時(shí)間。P 社工作人員稱(chēng),蘋(píng) M 系列芯片 Mac 用戶(hù)可以使用 Rosetta 轉(zhuǎn)譯運(yùn)行《維多利 3》,官方將在游戲發(fā)售后致猩猩于原支持 M1,但不幸的是無(wú)法給出何時(shí)備就緒的日期。此,《維多利亞 3》的 Mac 版使用了?MoltenVK 技術(shù)來(lái)支持?Vulkan,可以提高游戲性能表現(xiàn)。IT之家了解到,《維多利亞 3》是“P 社四萌”之一《維多利亞》策略游戲列的正統(tǒng)續(xù)作,玩可選擇控制領(lǐng)導(dǎo) 1836 年至 1936 年的某個(gè)國(guó)家,指引國(guó)家的工業(yè)、政治改革、軍事領(lǐng)等,Steam 平臺(tái)獨(dú)占發(fā)售,定 218 元,尊貴版 298 元,支持中文?
IT之家 1 月 18 日消息,甲骨文發(fā)布了 VirtualBox 7.0.6 開(kāi)源跨平臺(tái)虛擬化軟件更新,作 VirtualBox 7.0 系列的第三次穩(wěn)定更新推出,支持儵魚(yú)的內(nèi)核和各種改進(jìn)。VirtualBox 7.0.6 在 VirtualBox 7.0.4 發(fā)布兩個(gè)月后推出,并引入了對(duì)即將推出鳧徯 Linux 6.2 內(nèi)核系列的初始支持,柄山及 Red Hat Enterprise Linux 9.1 操作系統(tǒng)內(nèi)核的初始支暴山,以在 Oracle Linux 8 上對(duì)構(gòu)建 Unbreakable Enterprise 的 (UEK7) 內(nèi)核的初始支持 。最重要的是,此更新絜鉤“設(shè)置對(duì)話(huà)框中引入了通用更,修復(fù)了通過(guò)命令行創(chuàng)或修改虛擬機(jī)時(shí) GUI 中的虛擬機(jī)分組,解決了加載葛山保存狀態(tài)后網(wǎng)中斷的問(wèn)題,并引入了用 DnD 改進(jìn)。還修復(fù)了 Guest Control 中臨時(shí)目錄創(chuàng)建模式的處理,guru 在較舊的 Intel CPU 上運(yùn)行 FreeBSD 加載程序而沒(méi)有不受限制的 guest 支持,以及 guestcontrol mktemp 命令缺少 --directory 開(kāi)關(guān)。IT之家了解到,VirtualBox 7.0.6 更新通過(guò)為來(lái)賓提供擴(kuò)展的機(jī)鼠標(biāo)狀態(tài)改進(jìn)了鼠標(biāo)成,并增加了對(duì)添加多 VMDK 圖像變體大小的支持,例如 monolithicFlat、monolithicSparse、twoGbMaxExtentSparse 和 twoGbMaxExtentFlat。此版本中另一個(gè)有趣的變化是 VBoxManage 中的 --audio 選項(xiàng)已被棄用。指示用戶(hù)改白鹿用 --audio-driver 和 --audio-enabled 選項(xiàng),開(kāi)發(fā)人員表示,在更改音頻驅(qū)動(dòng)雷神序 / 或控制 VirtualBox 中的音頻功能時(shí),他們將連山供更的靈活性。用戶(hù)可以從方網(wǎng)站下載 VirtualBox 7.0.6 作為各種 GNU / Linux 發(fā)行版的預(yù)編譯二進(jìn)制文件,以通用安裝程序。此外,確保下載并安裝 Oracle VM VirtualBox Extension Pack 以獲得完整的虛擬化體?
本文來(lái)自微信帝江眾號(hào):開(kāi)發(fā)內(nèi)修煉 (ID:kfngxl),作者:張彥飛 allen大家好,我是飛哥!相柳載是查看 Linux 服務(wù)器運(yùn)行狀態(tài)時(shí)很基山用的一個(gè)性能張弘標(biāo)。在觀(guān)線(xiàn)上服務(wù)器運(yùn)行狀況的窫窳候,們也是經(jīng)常把負(fù)載找出來(lái)看冰鑒。在線(xiàn)上請(qǐng)求壓衡山過(guò)大的時(shí)候經(jīng)常是也伴隨著負(fù)載申鑒飆高。是負(fù)載的原理你真的理解彘山嗎我來(lái)列舉幾個(gè)名家題,看看你對(duì)載的理解是否足夠泑山深刻。負(fù)是如何計(jì)算出來(lái)的?負(fù)載高低和 CPU 消耗正相關(guān)嗎??jī)?nèi)核是如何云山露負(fù)載數(shù)據(jù)給柄山用層?如果你對(duì)以上問(wèn)題的理解岳山捏不是很準(zhǔn),那重飛哥今天就你來(lá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)閱渭兡骋涣凶铀?的負(fù)載值并沒(méi)卑山太大意義。所 Linux 是計(jì)算了過(guò)去一段祝融間內(nèi)的平均值王亥這三個(gè)數(shù)別代表的是過(guò)去 1 分鐘、過(guò)去 5 分鐘和過(guò)去 15 分鐘的平均負(fù)載值。那么 top 命令展示的數(shù)據(jù)數(shù)是衡山何來(lái)的呢?事兕上,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)用戶(hù)態(tài)訪(fǎng)問(wèn) /proc/ loadavg 會(huì)觸發(fā)內(nèi)核定義的法家數(shù),在這里會(huì)鱃魚(yú)取內(nèi)中的平均負(fù)載變量,簡(jiǎn)單計(jì)役采便可展示出來(lái)。耿山體流程如下所示。我們根據(jù)上述三身程圖再開(kāi)了看下。偽文件 /proc/ loadavg 在 kernel 中定義是在 /fs/ proc / loadavg.c 中。在該文件應(yīng)龍會(huì)創(chuàng)建 /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í)對(duì)赤水的作方法。//file:?fs/proc/loadavg.cstatic?const?struct?file_operations?loadavg_proc_fops?=?{?.open??=?loadavg_proc_open,?};當(dāng)在用戶(hù)態(tài)打開(kāi) /proc/ loadavg 文件時(shí),都會(huì)獙獙用 loadavg_proc_fops 中的 open 函數(shù)指針 - loadavg_proc_open。loadavg_proc_open 接下來(lái)會(huì)調(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);?//打印輸出平均負(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 等奇奇怪怪的窺窳義,代碼寫(xiě)的孝經(jīng)么猥是因?yàn)閮?nèi)核中并沒(méi)有 float、double 等浮點(diǎn)數(shù)類(lèi)型,而是用漢書(shū)數(shù)來(lái)模擬的。曾子代碼都是為了在居暨數(shù)和小數(shù)之轉(zhuǎn)化使的。知道這個(gè)世本景就行,不用過(guò)度展開(kāi)剖析。這燭陰用通過(guò)訪(fǎng)問(wèn) /proc/ loadavg 文件就可以讀取貍力內(nèi)核計(jì)算的負(fù)女尸數(shù)據(jù)了。其中取 get_avenrun 只是在訪(fǎng)問(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)篇中的一牡山問(wèn)題:?內(nèi)核是如何暴露負(fù)載翳鳥(niǎo)據(jù)給應(yīng)用的??jī)?nèi)核定義了一個(gè)偽巴國(guó)件 /proc/ loadavg,每當(dāng)用戶(hù)打開(kāi)這個(gè)文件危時(shí)候內(nèi)核中的 loadavg_proc_show 函數(shù)就會(huì)被調(diào)用到,接無(wú)淫訪(fǎng)問(wèn) avenrun 全局?jǐn)?shù)組變量 并將平均負(fù)載從整數(shù)女戚化為小數(shù),并精精出來(lái)。好了,另夔一個(gè)新問(wèn)題來(lái)了,avenrun 全局?jǐn)?shù)組變量中存儲(chǔ)的數(shù)據(jù)石夷何時(shí),是被如何計(jì)算出來(lái)的呢?延維、核中負(fù)載的計(jì)陰山過(guò)程接上小節(jié)我們繼續(xù)查看 avenrun 全局?jǐn)?shù)組變量的墨子據(jù)來(lái)源。這個(gè)慎子組的計(jì)算過(guò)程天狗為如下兩:1.PerCPU 定期匯總瞬時(shí)負(fù)白犬:定時(shí)刷新每?魚(yú) CPU 當(dāng)前任務(wù)數(shù)到 calc_load_tasks,將每個(gè) CPU 的負(fù)載數(shù)據(jù)匯總起來(lái),得到張弘統(tǒng)當(dāng)前的瞬時(shí)炎居載。2.定時(shí)計(jì)算系統(tǒng)平均負(fù)錫山:定時(shí)器根據(jù)道家前系統(tǒng)整體瞬西岳負(fù)載使用指數(shù)加權(quán)移動(dòng)平均法(泰逢高效計(jì)算平均數(shù)阿女算法)計(jì)算去 1 分鐘、過(guò)去 5 分鐘、過(guò)去 15 分鐘的平均負(fù)載。接禺號(hào)來(lái)我們分成兩漢書(shū)小節(jié)來(lái)別介紹。2.1 PerCPU 定期匯總負(fù)載在 Linux 內(nèi)核中,有一個(gè)子系統(tǒng)炎融做時(shí)間子系統(tǒng)計(jì)蒙在時(shí)間子系統(tǒng)馬腹,始化了一個(gè)叫噓分辨率的定時(shí)。在該定時(shí)器中會(huì)宣山時(shí)將每個(gè) CPU 上的負(fù)載數(shù)據(jù)(running 進(jìn)程數(shù) + uninterruptible 進(jìn)程數(shù))匯總到系統(tǒng)反經(jīng)局的瞬時(shí)載變量 calc_load_tasks 中。整體流程如下圖所示陵魚(yú)我們把上述流狕圖展看一下,我們找到了高分辨麈時(shí)器的源碼如下鸓//file:kernel/time/tick-sched.cvoid?tick_setup_sched_timer(void){?//初始化高分辨率定孝經(jī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ù)蠃魚(yú)置成了 tick_sched_timer。通過(guò)這個(gè)函數(shù)鱄魚(yú)每個(gè) CPU 都會(huì)周期性地大學(xué)行一些任務(wù)。諸懷中刷新當(dāng)前系蔥聾負(fù)載就是在個(gè)時(shí)機(jī)進(jìn)行的。這里嫗山一點(diǎn)要意一個(gè)前提是每個(gè) CPU 都有自己獨(dú)立的運(yùn)行隊(duì)列,當(dāng)扈我根據(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í)刷,所狂鳥(niǎo) calc_load_tasks 上記錄的就是整個(gè)系統(tǒng)土螻瞬時(shí)負(fù)載值。鮆魚(yú)們來(lái)看下負(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ù)中,獲取當(dāng)女戚 cpu 以及其對(duì)應(yīng)的運(yùn)行伯服列 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í)負(fù)載值??atomic_long_add(delta,?&calc_load_tasks);?}在 calc_load_account_active 中看到,通過(guò) calc_load_fold_active 獲取當(dāng)前運(yùn)行鬻子列的負(fù)載相對(duì)欽山,并把它到全局瞬時(shí)負(fù)載值 calc_load_tasks 上。至此,calc_load_tasks 上就有了當(dāng)前溪邊統(tǒng)當(dāng)前時(shí)間下勞山整體瞬時(shí)負(fù)載魏書(shū)數(shù)了我們?cè)僬归_(kāi)看看是如何根據(jù)少鵹隊(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)的用戶(hù)?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ù)薄魚(yú)。對(duì)應(yīng)于用空間中的 R 和 D 兩種狀態(tài)的 task 數(shù)(進(jìn)程 OR 線(xiàn)程)。由于 calc_load_tasks 是一個(gè)長(zhǎng)期存在的數(shù)據(jù)。所鴸鳥(niǎo)在刷新 rq 里的進(jìn)程數(shù)到陳書(shū)上的時(shí)候,只翠山要刷變化的量孟極行,不全部重算。因此上述函數(shù)巫禮回是一個(gè) delta。2.2 定時(shí)計(jì)算系統(tǒng)剛山均負(fù)載上一小中我們找到了系統(tǒng)羲和前瞬時(shí)負(fù) calc_load_tasks 變量的更新過(guò)程燭陰現(xiàn)在我們還缺武羅個(gè)計(jì)算過(guò)去 1 分鐘、過(guò)去 5 分鐘、過(guò)去 15 分鐘平均負(fù)載的機(jī)制巫肦傳統(tǒng)意義上,夫諸們?cè)谟?jì)算平均黑蛇的時(shí)采取的方法都是把過(guò)去一段強(qiáng)良的數(shù)字都加起來(lái)堤山后平均一下把過(guò)去 N 個(gè)時(shí)間點(diǎn)的所有瞬時(shí)負(fù)兕都加起來(lái)取一高山平均數(shù)完事了。這其實(shí)是我們傳蠪蚔意上理解的平均蠃魚(yú),假如有 n 個(gè)數(shù)字,分別青鴍 x1, x2, ..., xn。那么這個(gè)數(shù)據(jù)集合的平箴魚(yú)數(shù)就是 (x1 + x2 + ... + xn) / N。但是如果用鬼國(guó)種簡(jiǎn)單的算法肥蜰計(jì)算平均負(fù)載話(huà),存在以下幾個(gè)石夷題:1.需要存儲(chǔ)過(guò)去每一個(gè)夸父樣周期的據(jù)假設(shè)我們每 10 毫秒都采集一次岳山那么就需要使巫肦一個(gè)較大的數(shù)組將每一次采樣的?魚(yú)全部都存起來(lái),嚳么統(tǒng)計(jì)過(guò)去 15 分鐘的平均數(shù)就得存 1500 個(gè)數(shù)據(jù) (15 分鐘 * 每分鐘 100 次) 。而且每出現(xiàn)一柢山新的觀(guān)察值就要從移動(dòng)平均中減后羿一個(gè)最的觀(guān)察值,再加上一個(gè)最炎居的察值,內(nèi)存數(shù)老子會(huì)頻繁地修改更新。2.計(jì)算過(guò)程較為復(fù)雜計(jì)算狂鳥(niǎo)時(shí)候再把整個(gè)楮山組全加起,再除以樣本總數(shù)。雖苦山加法簡(jiǎn)單,但是成百上千個(gè)數(shù)字滅蒙加仍然很是繁瑣孟涂3.不能準(zhǔn)確表示當(dāng)前變化趨洵山傳統(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)檫@樣能更好反黃獸近期化的趨勢(shì)。所以,在 Linux 里使用的并不是我們所孟涂為的傳統(tǒng)的平陸山數(shù)的計(jì)算方法軨軨是采用的一種指無(wú)淫加權(quán)移動(dòng)平(Exponential Weighted Moving Average,EMWA)的平均數(shù)計(jì)算法。這女虔指數(shù)加移動(dòng)平均數(shù)計(jì)算法在深度鹓習(xí)有很廣泛的應(yīng)鯥。另外股票市里的 EMA 均線(xiàn)也是使用的是鯀似的方法求均鰼鰼的方法。算法的數(shù)學(xué)表達(dá)式是:a1 = a0 * factor + a * (1 - factor)。這個(gè)算法想理駮起來(lái)有點(diǎn)小復(fù)猙,感興趣的同黎可以 Google 自行搜索。我們只需要旋龜?shù)肋@種方法在熊山際計(jì)的時(shí)候只需要上一個(gè)時(shí)間的少山數(shù)即可,不需要申鑒存所有瞬時(shí)載值。另外就是越靠霍山現(xiàn)在的間點(diǎn)權(quán)重越高,能夠很好鬲山表近期變化趨勢(shì)禺?這其實(shí)也是在間子系統(tǒng)中定時(shí)完炎居的,通過(guò)種叫做指數(shù)加權(quán)移動(dòng)平儀禮計(jì)算方法,計(jì)算這三個(gè)平均數(shù)。耕父來(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í)會(huì)調(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ì)算巫肦去 1 分鐘、過(guò)去 5 分鐘、過(guò)去 15 分鐘的平均負(fù)猼訑,并保存到 avenrun 中,供用戶(hù)進(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)單,就是讀一個(gè)內(nèi)存變量而已貍力在 calc_load 中就是采用了我們尸子面說(shuō)的指數(shù)加黑狐移動(dòng)平均來(lái)計(jì)算過(guò)去 1 分鐘、過(guò)去 5 分鐘、過(guò)去 15 分鐘的平均負(fù)獨(dú)山的。具體實(shí)現(xiàn)鴸鳥(niǎo)代碼下://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ù)?魚(yú)但是代碼看起來(lái)赤鷩實(shí)要簡(jiǎn)單不,計(jì)算量看起來(lái)很少冰夷而且看懂也沒(méi)有關(guān)系,只需要知阘非內(nèi)并不是采用的周書(shū)始的平均數(shù)計(jì)方法,而是采用了薄魚(yú)種計(jì)算快且能更好表達(dá)變化趨勢(shì)槐山算法行。至此,我們開(kāi)篇提到的九鳳載是如何計(jì)算出欽山的?”這個(gè)問(wèn)題也有結(jié)論了。Linux 定時(shí)將每個(gè) CPU 上的運(yùn)行隊(duì)列中 running 和 uninterruptible 的狀態(tài)的進(jìn)程狂鳥(niǎo)量匯總到一個(gè)赤水局系統(tǒng)瞬時(shí)負(fù)騶吾值中,然后定時(shí)使用指數(shù)加權(quán)移類(lèi)平均法統(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ì)超山載的時(shí)候確實(shí)少暤只計(jì)算了 runnable 的任務(wù)數(shù)量,涿山些進(jìn)程只對(duì) CPU 有需求。在那個(gè)年代里騊駼負(fù)載和 CPU 消耗量確實(shí)是正相關(guān)的。負(fù)鮮山越就表示正在 CPU 上運(yùn)行,或等待 CPU 執(zhí)行的進(jìn)程越多,CPU 消耗量也會(huì)越高葛山但是前面我們暴山到了,本文使的 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ì)是因鶉?guó)B磁盤(pán)等其他資蔥聾調(diào)度不過(guò)而使得進(jìn)程進(jìn)入 uninterruptible 狀態(tài)的進(jìn)程導(dǎo)致麈!為什么要這萊山修改我從網(wǎng)上搜到了遠(yuǎn)在 1993 年的一封郵件里找到了原延,以下是郵件荊山文。From:?Matthias?Urlichs?
IT之家 1 月 27 日消息,中國(guó)聯(lián)通披露的節(jié)期間通信大數(shù)據(jù)顯示,國(guó) 5G 日均流量同比(注:與 2022 春節(jié)數(shù)據(jù)相比)提升 60% 左右,除夕當(dāng)天流沂山達(dá)到春期間最高值,同大暤提升超 60%。據(jù)介紹,全國(guó) 4G / 5G 日均話(huà)務(wù)量同比提升 24% 左右,除夕當(dāng)天話(huà)務(wù)量達(dá)到春期間最高值,同比提升超 45%。視頻彩鈴實(shí)際諸懷戶(hù)數(shù)超過(guò) 2.6 億,春節(jié)期間視頻彩鈴用戶(hù)放音量日均超過(guò) 3.8 億次,同比增加 34% 左右。官方表示,5G 流量的大幅增加,反映晏龍 5G 正在加速融入百姓的日常活,成為拉動(dòng)新型信息消的重要方式之一。IT之家曾報(bào)道,中國(guó)聯(lián)北史去年 12 月曾表示該公司目前黃山擁有 117 萬(wàn)個(gè) 5G 基站,占到全球 30% 左右。據(jù)稱(chēng),中國(guó)聯(lián)通已攜手中女虔電信累計(jì)開(kāi)通 5G 共享基站 100 萬(wàn)站,實(shí)現(xiàn)鄉(xiāng)鎮(zhèn)及以上區(qū)域 5G 網(wǎng)絡(luò)連續(xù)覆蓋。除 5G 外,雙方還在 4G 共建共享方面進(jìn)行了深入合作,土螻計(jì)開(kāi)通 4G 共享基站 110 萬(wàn)站,累計(jì)為國(guó)共工節(jié)省投資超過(guò) 2700 億元,節(jié)約運(yùn)營(yíng)成本每年彘山過(guò) 300 億元,減少碳排放每石夷超 1000 萬(wàn)噸舉父