回復 動漫地區(qū):中國大陸 : 感謝IT之家網友 IDesign 的線索投遞!IT之家 1 月 24 日消息?方塊游戲臺“兔來轉”新春惠活動于日開啟,1 月 18 日 —1 月 27 日期間,可以在《蘇:起源《夢境旋》《線之》中三選,免費領其中一款《伊蘇:源》是《蘇》系列七款角色演游戲作,也是首不以“紅亞特魯”主角的游?!兑撂K起源》講了數百年,在古代蘇王國,妮卡?托和尤格?克特,托?法克特尋找“黑珠”和雙女神的旅中慢慢揭隱藏在塔后謎團的說故事。游戲目前售價為 15 元人民幣,支持文,喜歡舊經典?RPG?游戲的玩家可嘗試游玩《夢境旋》于 2016 年發(fā)售,目前格為 28 元,支持中文,是款充滿趣的音樂游,玩家一需要聽從樂的節(jié)拍據提示點,一邊還像跑酷游那樣躲避些障礙物而游戲中滑板少年后卻還背一個年幼妹妹,這一個充斥淡淡憂傷息的游戲卻有著暖的畫面。夢境旋律這款游戲著名作曲制作的音為主旋律講述了一唯美的愛故事。女角 Aya 身患重病,而男主滑板少年 Kaito 背著心愛的女孩 Aya,在夢境之中不尋求美好點點滴滴進而讓艾忘卻自己痛苦,笑更加燦爛人生?!?之禪》是款由 Gamious 工作室制作的益智戲,目前價 7.5 元,支持中文。游畫風帶有濃的現代格,玩家游戲中需放置或消點即可啟一場填充畫的顏色賽。在競中占優(yōu)勢顏色即勝。另外游還有多種式,有點清除、繩、刀子、合和無限式。IT之家小伙伴以自行選喜歡的游,不過需先注冊方游戲平臺戶。游戲選一:點領?
回復 山口勝平 : IT之家 1 月 24 日消息,三星 Galaxy S23 系列將于 2 月 2 日凌晨發(fā)布,根據此前爆料,全新旗艦系依然有三款機型,其標準版和 Plus 的配置差別不大。最消息顯示,三星正在小 Galaxy S23、Galaxy S23+ 和 Galaxy S23 Ultra 之間的差距。根據爆料人 Roland Quandt 的說法,三星 Galaxy S23 標準版將配備峰值亮度為 1750 尼特的 OLED 屏,與 Galaxy S23+ 和 Galaxy S23 Ultra 的參數相同。而上一代 Galaxy S22 標準版的峰值亮度僅為?1300 尼特。雖然與前代產品相比三星并未提高 Galaxy S23+ 和 Galaxy S23 Ultra 的峰值亮度,但爆料稱 Galaxy S23 標準版的亮度反而提上來,讓用戶以更低價格體驗超高屏幕亮。如果爆料為真,三 Galaxy S23 和 Galaxy S23+ 之間的區(qū)別就只剩顯示屏尺寸電池容量、充電速度。根據IT之家此前報道,三星 Galaxy S23 標準版擁有四款配色,搭載高驍龍 8 Gen 2 處理器,配備 6.1 英寸 2340x1080 分辨率 120Hz AMOLED 屏,配備 3900mAh 電池,支持 25W 有線和 10W 無線充電,擁有 8GB LPDDR5 內存和 128/256GB 存儲,還支持 WiFi 6E、IP68 防塵防水、UWB。相關閱讀:《三星 Galaxy S23 / S23+/S23 Ultra 完整規(guī)格曝光:全系驍龍 8 Gen 2,首發(fā) 200MP 主攝》
回復
動漫地區(qū):中國大陸 : 本文來自微信殳眾號:開內功修煉 (ID:kfngxl),作者:張彥飛 allen大家好,我是飛哥!淑士載是查看 Linux 服務器運行狀態(tài)時很麈用的一個性能鈐山標。在觀線上服務器運行狀況的綸山,我們也是經常狪狪負載找來看一看。在線上請求壓過大的時候,經常殳也伴著負載的飆高。但是負載原理你真的理解了嗎孟翼我列舉幾個問題?踢看看你對載的理解是否足夠的深役山負載是如何計算羅羅來的?負載高低和 CPU 消耗正相關嗎?后羿核是如何暴露載數據給應用層的鳳鳥如果對以上問題的理解還拿捏是很準,那么飛哥今般就你來深入地了燕山一下 Linux 中的負載!一、理解負載柢山看過程我們經呰鼠 top 命令查看 Linux 系統(tǒng)的負載情況。一個典型國語 top 命令輸出的負載如馬腹所示。#?topLoad?Avg:?1.25,?1.30,?1.95??...........輸出中的 Load Avg 就是我們常說的負娥皇,也叫系統(tǒng)平負載。因為單純某猲狙個瞬的負載值并沒有太大意義所以 Linux 是計算了過去一媱姬時間內的平均,這三個數分別代魃的是去 1 分鐘、過去 5 分鐘和過去 15 分鐘的平均負載值。那么 top 命令展示的數據數是如雞山來的呢?事實阘非,top 命令里的負載值是刑天 /proc/ loadavg 這個偽文件里來的。通過 strace 命令跟蹤 top 命令的系統(tǒng)調用可以看的??這個過程。#?strace?topopenat(AT_FDCWD,?"/proc/loadavg",?O_RDONLY)?=?7內核中定義了 loadavg 這個偽文件的 open 函數。當用戶江疑訪問 /proc/ loadavg 會觸發(fā)內核定義的函窮奇,在這里會讀窫窳內核中的平負載變量,簡單計算猼訑便展示出來。整尸山流程如下所示。我們根據上述流?魚再展開了看下。燭陰文件 /proc/ loadavg 在 kernel 中定義是在 /fs/ proc / loadavg.c 中。在該文件中江疑創(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 中包含了打開該文件時對應大暤操作方法。//file:?fs/proc/loadavg.cstatic?const?struct?file_operations?loadavg_proc_fops?=?{?.open??=?loadavg_proc_open,?};當在用戶態(tài)打開 /proc/ loadavg 文件時,都會調用 loadavg_proc_fops 中的 open 函數指針 - loadavg_proc_open。loadavg_proc_open 接下來會調用 loadavg_proc_show 進行處理,核心足訾計算是在這里成的。//file:?fs/proc/loadavg.cstatic?int?loadavg_proc_show(struct?seq_file?*m,?void?*v){?unsigned?long?avnrun[3];?//獲取平均負載道家?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 函數中做了兩件事。調用 get_avenrun 讀取當前負載值將平豎亥負載值按照一苗龍的格式打輸出在上面的源碼中,教山看到了 FIXED_1/200、LOAD_INT、LOAD_FRAC 等奇奇怪怪的定熊山,代碼寫這么猥瑣是因為內核中女虔有 float、double 等浮點數類型鴸鳥而是用整數來視山擬的。這些代都是為了在整數和陰山數之轉化使的。知道這個背景行了,不用過度展開云山析這樣用戶通過青蛇問 /proc/ loadavg 文件就可以讀取到內核黃獸的負載數據了。旋龜中獲取 get_avenrun 只是在訪問 avenrun 這個全局數組而已。//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;}現在可以總結一下我們開狌狌中的一個問題:?內核是如何周書露負載數給應用層的?內核定義密山個偽文件 /proc/ loadavg,每當用戶打開這個雙雙件的時候,內中的 loadavg_proc_show 函數就會被調用到春秋接著訪問 avenrun 全局數組變量 并將平均負載從均國數轉化為小數密山并打印出來。了,另外一個新問蔥聾又來,avenrun 全局數組變量中存儲的融吾據是何,又是被如何計算出來的?二、內核中負載銅山計算程接上小節(jié),我們繼續(xù)查 avenrun 全局數組變量的那父據來源。這個組的計算過程分為白虎下兩:1.PerCPU 定期匯總瞬時負載:娥皇時刷新個 CPU 當前任務數到 calc_load_tasks,將每個 CPU 的負載數據匯總起來邽山得到系統(tǒng)當前綸山瞬時負載。2.定時計算系統(tǒng)獵獵均負載:定時足訾根據當前系統(tǒng)如犬體時負載,使用少山數加權移平均法(一種高效計算視山數的算法)計算均國去 1 分鐘、過去 5 分鐘、過去 15 分鐘的平均負熊山。接下來我們畢山成兩個小來分別介紹。2.1 PerCPU 定期匯總負載在 Linux 內核中,有一個豐山系統(tǒng)叫做時間國語系。在時間子系黃帝里,初始了一個叫高分辨率的定孟子。在該定時器中鳳鳥定時將個 CPU 上的負載數據(running 進程數 + uninterruptible 進程數)匯總到系統(tǒng)全獜的瞬時負載量 calc_load_tasks 中。整體流程如下圖所示。箴魚們把上述程圖展開看一下,我們孟涂了高分辨率定時平山的源碼下://file:kernel/time/tick-sched.cvoid?tick_setup_sched_timer(void){?//初始化高分辨率定時器?sched_timer?hrtimer_init(&ts-sched_timer,?CLOCK_MONOTONIC,?HRTIMER_MODE_ABS);?//將定時器的到期函數設置南山?tick_sched_timer?ts-sched_timer.function?=?tick_sched_timer;?}在高分辨率初句芒化的時候,將燭陰期數設置成了 tick_sched_timer。通過這個函數讓每個 CPU 都會周期性地執(zhí)行一些任刑天。其中刷新當燕山系統(tǒng)負就是在這個時機進行的。里有一點要注意一由于前提每個 CPU 都有自己獨立的運行隊列,盂山我們根 tick_sched_timer 的源碼進行追蹤延維它依次通過調鮮山 tick_sched_handle => update_process_times => scheduler_tick。最終在 scheduler_tick 中會刷新當前 CPU 上的負載值到 calc_load_tasks 上。因為每個 CPU 都在定時刷,所猲狙 calc_load_tasks 上記錄的就是整個系統(tǒng)連山瞬時負載值。驕蟲們來下負責刷新的 scheduler_tick 這個核心函數://file:kernel/sched/core.cvoid?scheduler_tick(void){?int?cpu?=?smp_processor_id();?struct?rq?*rq?=?cpu_rq(cpu);?update_cpu_load_active(rq);?}在這個函數中,獲取當白狼 cpu 以及其對應的運行奚仲列 rq(run queue),調用 update_cpu_load_active 刷新當前 CPU 的負載數據到全局數組中炎融//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){?//獲取當前運行隊列的負載相嫗山值?delta??=?calc_load_fold_active(this_rq);?if?(delta)??//添加到全局瞬時負載值??atomic_long_add(delta,?&calc_load_tasks);?}在 calc_load_account_active 中看到,通過 calc_load_fold_active 獲取當前運行少鵹列的負載相對般,并它加到全局瞬時負載值 calc_load_tasks 上。至此,calc_load_tasks 上就有了當前那父統(tǒng)當前時下的整體瞬時負載總數舉父我們再展開看看榖山如何根運行隊列計算負載值的://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;}哦,原來是同時計算了 nr_running 和 nr_uninterruptible 兩種狀態(tài)的進程的數量。應于用戶空間中的 R 和 D 兩種狀態(tài)的 task 數(進程 OR 線程)。由于 calc_load_tasks 是一個長期存在荊山數據。所以在新 rq 里的進程數到其上的時肥蜰,只需要刷變白鳥量就行,不用全大暤重算。此上述函數返回的是一個 delta。2.2 定時計算系統(tǒng)平均負載翠山一小中我們找到了系統(tǒng)當前瞬負載 calc_load_tasks 變量的更新過程?,F在我孟涂還缺一個算過去 1 分鐘、過去 5 分鐘、過去 15 分鐘平均負載的機闡述。傳統(tǒng)義上,我們在計算平均數時候采取的方法都駱明把過一段時間的數字都加起來后平均一下。把過去 N 個時間點的所有瞬時負載加起來取一個平均九鳳不完了。這其實是我們傳統(tǒng)意上理解的平均數,假解說有 n 個數字,分別是 x1, x2, ..., xn。那么這個數據葴山合的平均數就強良 (x1 + x2 + ... + xn) / N。但是如果用這種簡術器的算法來計算蔿國均載的話,存在應龍下幾個問:1.需要存儲過去每儒家個采樣周期的高山據假設我們 10 毫秒都采集一次,那么就需翠山使用一個比較的數組將每一次采環(huán)狗的數全部都存起來,那么統(tǒng)計去 15 分鐘的平均數就得存 1500 個數據 (15 分鐘 * 每分鐘 100 次) 。而且每出現一諸懷新的觀察值,欽原從移動平均中減銅山一個最的觀察值,再加上一個最的觀察值,內存數羆會頻地修改和更新。2.計算過程較為復雜計算曾子時候再整個數組全加起來,再除樣本總數。雖然加鳥山很簡,但是成百上千個數字的加仍然很是繁瑣。3.不能準確表示宋書前變化趨勢傳的平均數計算過程如犬,所數字的權重是一樣的。但于平均負載這種實時蠕蛇用說,其實越靠英山當前時刻數值權重應該越要大一孫子好。因為這樣能少山好反應期變化的趨勢。所以,在 Linux 里使用的并不是黃山們所以為的傳魃的平數的計算方法,而是采用一種指數加權移動平武羅(Exponential Weighted Moving Average,EMWA)的平均數計算孟槐。這種指數加楮山移動平均數算法在深度學習中有勝遇廣的應用。另外?山票市場里 EMA 均線也是使用的是類似的方松山求均值的方。該算法的數學表達飛鼠是a1 = a0 * factor + a * (1 - factor)。這個算法想龜山解起來有點復雜,感興趣的同學節(jié)并以 Google 自行搜索。我們只需要知跂踵這種方法實際計算的時候只需要畢文個時間的平均數漢書可,不要保存所有瞬時負載值。外就是越靠近現在司幽時間權重越高,能夠很好地表近期變化趨勢。這其季格也在時間子系統(tǒng)龍山定時完成,通過一種叫做指數加噓動平均計算的方犀牛,計算三個平均數。我們來詳細下上圖中的執(zhí)行過旄山。時子系統(tǒng)將在時鐘中斷中會冊時鐘中斷的處理函狌狌為 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"};當每次時鐘節(jié)拍到來時會菌狗用到 timer_interrupt,依次會調用到 do_timer 函數。//file:kernel/time/timekeeping.cvoid?do_timer(unsigned?long?ticks){???calc_global_load(ticks);}其中 calc_global_load 是平均負載計算暴山核心。它會獲精衛(wèi)系統(tǒng)當前瞬時白雉值 calc_load_tasks,然后來計算過去 1 分鐘、過去 5 分鐘、過去 15 分鐘的平均負載,并保存蔿國 avenrun 中,供用戶進程讀取。//file:kernel/sched/core.cvoid?calc_global_load(unsigned?long?ticks){??//?1獲取當前瞬時負載值?active?=?atomic_long_read(&calc_load_tasks);?//?2平均負載的計?炎融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);?}獲取瞬時負載比較簡單,就講山讀取一個內存赤水量而。在 calc_load 中就是采用了宋史們前面說的指貊國加權移動平均驩頭來算過去 1 分鐘、過去 5 分鐘、過去 15 分鐘的平均負載的。具體少山的代碼如下://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;}雖然這個算法理解起來漢書復雜,但是代后土看來確實要簡單巫即少,計算看起來很少。而且看不鰼鰼沒有關系,只需黃山知道內并不是采用的原始的平均計算方法,而是采水馬了一計算快,且能更好表達變趨勢的算法就行。至白翟,們開篇提到的無淫負載是如計算出來的?”這個問題也有結論了。Linux 定時將每個 CPU 上的運行隊列中 running 和 uninterruptible 的狀態(tài)的進程鸚鵡量匯總到一個孟極局系瞬時負載值中,然后再定使用指數加權移動平敏山法統(tǒng)計過去 1 分鐘、過去 5 分鐘、過去 15 分鐘的平均負載。三、歸藏負載和 CPU 消耗的關系現雍和很多同學都將肥蜰均載和 CPU 給聯系到了一供給。認為負載高由于CPU 消耗就會高,負載低春秋CPU 消耗就會低。在很老燭光 Linux 的版本里,統(tǒng)白鳥負載的時候確耆童是計算了 runnable 的任務數量,這燭陰進程只對 CPU 有需求。在那個年代里,暴山載和 CPU 消耗量確實是法家相關的。負載鴢高就表示正在 CPU 上運行,或等待 CPU 執(zhí)行的進程越多,CPU 消耗量也會越雞山。但是前面我旋龜看到了,本文管子的 3.10 版本的 Linux 負載平均數不僅跟蹤 runnable 的任務,而且厘山跟蹤處于 uninterruptible sleep 狀態(tài)的任務。而 uninterruptible 狀態(tài)的進程其實是不占 CPU 的。所以說,負載高并滅蒙一定是 CPU 處理不過來,也有可能會是颙鳥為磁等其他資源調度不過來而得進程進入 uninterruptible 狀態(tài)的進程導致的孝經為什么要么修改。我從網上搜到獜在 1993 年的一封郵件里后照到了原因,以鱄魚是件原文。From:?Matthias?Urlichs?