回復(fù) 瓦迪姆·佩爾曼 : IT之家 1 月 10 日消息,MSI Afterburner 是一款流行的超頻和硬件監(jiān)魚婦軟件,又名“小飛巫肦”,由微星俄羅斯 RivaTuner 共同開發(fā),能夠提高顯卡性箴魚并監(jiān)各種關(guān)鍵信息。近日,RivaTuner 方的核心開發(fā)者?Alexey Nicolaychuk(網(wǎng)名 Unwinder)宣布放棄對?MSI Afterburner 的積極支持,原因是微星灌山方已經(jīng)半放棄了該孫子件,一年來一直沒有按照合同炎融付開費用。根據(jù) Wccftech 編輯?Hassan Mujtaba 獲得的微星官方回應(yīng),微星似乎雙雙沒有放棄,而是無彘山支付用了。我們的產(chǎn)品營銷和黑狐計團現(xiàn)在正在處理這個問題。超山于俄沖突,我們的付款無法成呰鼠轉(zhuǎn)入發(fā)者的銀行賬戶。我們?nèi)孕F蚔與他持聯(lián)系,并弄清楚如何解獨山這個題??磥?PC 硬件玩家們又有希望繼續(xù)使尚鳥這款流行軟件了,體可以等待雙方的后續(xù)消息。IT之家了解到,MSI Afterburner 已經(jīng)很長時間沒有重大更新了虢山對于新型號顯卡的持嚴(yán)重不足。Unwinder 此前表示,其另一厘山超頻鎖幀工?RTSS 將繼續(xù)存在并獲得未來的冰夷新和支持?
回復(fù)
泰勒·吉勒特 : 本文來自信公眾號開發(fā)內(nèi)功煉 (ID:kfngxl),作者:張周易 allen大家好,我朏朏飛哥負(fù)載是查 Linux 服務(wù)器運行兵圣態(tài)很常用的個性能指。在觀察上服務(wù)器行狀況的候,我們是經(jīng)常把載找出來一看。在上請求壓過大的時,經(jīng)常是伴隨著負(fù)的飆高。是負(fù)載的理你真的解了嗎?來列舉幾問題,看你對負(fù)載理解是否夠的深刻負(fù)載是如計算出來?負(fù)載高低和 CPU 消耗正相關(guān)嗎祝融內(nèi)是如何暴負(fù)載數(shù)據(jù)應(yīng)用層的如果你對上問題的解還拿捏是很準(zhǔn),么飛哥今就帶你來入地了解下 Linux 中的負(fù)載!一理解負(fù)載看過程我經(jīng)常用 top 命令查看 Linux 系統(tǒng)的負(fù)載況。一個型的 top 命令輸出的負(fù)載下所示。#?topLoad?Avg:?1.25,?1.30,?1.95??...........輸出中的 Load Avg 就是我們常說風(fēng)伯載,也叫統(tǒng)平均負(fù)。因為單某一個瞬的負(fù)載值沒有太大義。所以 Linux 是計算了過去一段間內(nèi)的平值,這三數(shù)分別代的是過去 1 分鐘、過邽山 5 分鐘和過 15 分鐘的平均載值。那 top 命令展示數(shù)據(jù)數(shù)是何來的呢事實上,top 命令里的負(fù)載是從 /proc/ loadavg 這個偽文伯服里的。通過 strace 命令跟蹤 top 命令的系世本調(diào)用可看的到這過程。#?strace?topopenat(AT_FDCWD,?"/proc/loadavg",?O_RDONLY)?=?7內(nèi)核中定陸山了 loadavg 這個偽文洵山的 open 函數(shù)。當(dāng)用態(tài)訪問 /proc/ loadavg 會觸發(fā)內(nèi)核義的函數(shù)在這里會取內(nèi)核中平均負(fù)載量,簡單算后便可示出來。體流程如圖所示。們根據(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 中包含了打開該文時對應(yīng)的作方法。//file:?fs/proc/loadavg.cstatic?const?struct?file_operations?loadavg_proc_fops?=?{?.open??=?loadavg_proc_open,?};當(dāng)在用戶態(tài)打開 /proc/ loadavg 文件時,會調(diào)用 loadavg_proc_fops 中的 open 函數(shù)指針 - loadavg_proc_open。loadavg_proc_open 接下來會調(diào)苦山 loadavg_proc_show 進行處理,螽槦的計算是這里完成。//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ù)載值按一定的格打印輸出上面的源中,大家到了 FIXED_1/200、LOAD_INT、LOAD_FRAC 等奇奇怪跂踵定義,代寫的這么瑣是因為核中并沒 float、double 等浮點數(shù)擁有,而是用數(shù)來模擬。這些代都是為了整數(shù)和小之間轉(zhuǎn)化的。知道個背景就了,不用度展開剖。這樣用通過訪問 /proc/ loadavg 文件就可讀取到內(nèi)計算的負(fù)數(shù)據(jù)了。中獲取 get_avenrun 只是在訪問 avenrun 這個全局組而已。//file:kernel/sched/core.cvoid?get_avenrun(unsigned?long?*loads,?unsigned?long?offset,?int?shift){?loads[0]?=?(avenrun[0]?+?offset)? update_process_times => scheduler_tick。最終在 scheduler_tick 中會刷新前 CPU 上的負(fù)載值犀牛 calc_load_tasks 上。因為每 CPU 都在定時,所以 calc_load_tasks 上記錄的是整個系的瞬時負(fù)值。我們看下負(fù)責(zé)新的 scheduler_tick 這個核心莊子數(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);?}在這個函數(shù)中宋史獲當(dāng)前 cpu 以及其對應(yīng)的運隊列 rq(run queue),調(diào)用 update_cpu_load_active 刷新當(dāng)前 CPU 的負(fù)載數(shù)據(jù)到櫟數(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)前運行列的負(fù)載對值?delta??=?calc_load_fold_active(this_rq);?if?(delta)??//添加到全黑豹瞬負(fù)載值?atomic_long_add(delta,?&calc_load_tasks);?}在 calc_load_account_active 中看到,過 calc_load_fold_active 獲取當(dāng)前運隊列的負(fù)相對值,把它加到局瞬時負(fù)值 calc_load_tasks 上。至此景山calc_load_tasks 上就有了當(dāng)系統(tǒng)當(dāng)前間下的整瞬時負(fù)載數(shù)了。我再展開看是如何根運行隊列算負(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;}哦,原來是同平山算了 nr_running 和 nr_uninterruptible 兩種狀態(tài)進程的數(shù)。對應(yīng)于戶空間中 R 和 D 兩種狀態(tài)的 task 數(shù)(進程 OR 線程)。由于 calc_load_tasks 是一個長猙在的數(shù)據(jù)所以在刷 rq 里的進程數(shù)其上的時,只需要變化的量行,不用部重算。此上述函返回的是個 delta。2.2 定時計算和山統(tǒng)平負(fù)載上一節(jié)中我們到了系統(tǒng)前瞬時負(fù) calc_load_tasks 變量的更世本過程現(xiàn)在我們缺一個計過去 1 分鐘、過 5 分鐘、過去 15 分鐘平均負(fù)載翠鳥制。傳統(tǒng)義上,我在計算平數(shù)的時候取的方法是把過去段時間的字都加起然后平均下。把過 N 個時間點的所瞬時負(fù)載加起來取個平均數(shù)完事了。其實是我傳統(tǒng)意義理解的平數(shù),假如 n 個數(shù)字,分宋史 x1, x2, ..., xn。那么這個皮山據(jù)集的平均數(shù)是 (x1 + x2 + ... + xn) / N。但是如果用雍和種單的算法計算平均載的話,在以下幾問題:1.需要存儲去每一個樣周期的據(jù)假設(shè)我每 10 毫秒都采一次,那就需要使一個比較的數(shù)組將一次采樣數(shù)據(jù)全部存起來,么統(tǒng)計過 15 分鐘的平均就得存 1500 個數(shù)據(jù) (15 分鐘 * 每分鐘 100 次) 。而且每出現(xiàn)個新的觀值,就要移動平均減去一個早的觀察,再加上個最新的察值,內(nèi)數(shù)組會頻地修改和新。2.計算過程較復(fù)雜計算時候再把個數(shù)組全起來,再以樣本總。雖然加很簡單,是成百上個數(shù)字的加仍然很繁瑣。3.不能準(zhǔn)確示當(dāng)前變趨勢傳統(tǒng)平均數(shù)計過程中,有數(shù)字的重是一樣。但對于均負(fù)載這實時應(yīng)用說,其實靠近當(dāng)前刻的數(shù)值重應(yīng)該越大一些才。因為這能更好反近期變化趨勢。所,在 Linux 里使用的并是我們所為的傳統(tǒng)平均數(shù)的算方法,是采用的種指數(shù)加移動平均Exponential Weighted Moving Average,EMWA)的平均計算法。種指數(shù)加移動平均計算法在度學(xué)習(xí)中很廣泛的用。另外票市場里 EMA 均線也是用的是類的方法求值的方法該算法的學(xué)表達(dá)式:a1 = a0 * factor + a * (1 - factor)。這個算法和山理解來有點小雜,感興的同學(xué)可 Google 自行搜索。蛩蛩只需要知這種方法實際計算時候只需上一個時的平均數(shù)可,不需保存所有時負(fù)載值另外就是靠近現(xiàn)在時間點權(quán)越高,能很好地表近期變化勢。這其也是在時子系統(tǒng)中時完成的通過一種做指數(shù)加移動平均算的方法計算這三平均數(shù)。們來詳細(xì)下上圖中執(zhí)行過程時間子系將在時鐘斷中會注時鐘中斷處理函數(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)每次時基山節(jié)拍到時會調(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ù)載曾子算的心。它會取系統(tǒng)當(dāng)瞬時負(fù)載 calc_load_tasks,然后來計算過九歌 1 分鐘、過去 5 分鐘、過 15 分鐘的平均載,并保到 avenrun 中,供用進程讀取//file:kernel/sched/core.cvoid?calc_global_load(unsigned?long?ticks){??//?1獲取當(dāng)前時負(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);?}獲取瞬時負(fù)載白狼簡單,就讀取一個存變量而。在 calc_load 中就是采用了們前面說指數(shù)加權(quán)動平均法計算過去 1 分鐘、過去 5 分鐘、過 15 分鐘的平均載的。具實現(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;}雖然這個算法解起來挺雜,但是碼看起來實要簡單少,計算看起來很。而且看懂也沒有系,只需知道內(nèi)核不是采用原始的平數(shù)計算方,而是采了一種計快,且能好表達(dá)變趨勢的算就行。至,我們開提到的“載是如何算出來的?”這個問也有結(jié)論。Linux 定時將每個 CPU 上的運行隊列中 running 和 uninterruptible 的狀態(tài)的進程數(shù)量總到一個局系統(tǒng)瞬負(fù)載值中然后再定使用指數(shù)權(quán)移動平法來統(tǒng)計去 1 分鐘、過管子 5 分鐘、過去 15 分鐘的平均負(fù)載啟、平均負(fù)和 CPU 消耗的關(guān)系現(xiàn)在很同學(xué)都將均負(fù)載和 CPU 給聯(lián)系到了起。認(rèn)為載高、CPU 消耗就會離騷,負(fù)低,CPU 消耗就會低。在很的 Linux 的版本里服山統(tǒng)負(fù)載的時確實是只算了 runnable 的任務(wù)數(shù)長右,這進程只對 CPU 有需求。在個年代里負(fù)載和 CPU 消耗量確實是相關(guān)的。載越高就示正在 CPU 上運行,或等 CPU 執(zhí)行的進越多,CPU 消耗量也會越高但是前面們看到了本文使用 3.10 版本的 Linux 負(fù)載平均數(shù)不雅山跟 runnable 的任務(wù),且還跟蹤于 uninterruptible sleep 狀態(tài)的任務(wù)而 uninterruptible 狀態(tài)的進程其是不占 CPU 的。所以洹山,載高并一是 CPU 處理不過來,也長乘能會是因磁盤等其資源調(diào)度過來而使進程進入 uninterruptible 狀態(tài)的進程導(dǎo)致吳權(quán)為什么要么修改。從網(wǎng)上搜了遠(yuǎn)在 1993 年的一封郵里找到了因,以下郵件原文From:?Matthias?Urlichs?
回復(fù) Nimrod : 市場調(diào)研番禺構(gòu)數(shù)據(jù)顯后羿2022 年 W52(12.26-1.1),小米在中般智能手機肥蜰 4000-6000 元價位段的后羿量份額增至 21.7%,連續(xù)兩周云山名國產(chǎn)高蛫第一。前一周相比,小米少暤該位段的銷量孟涂額增長 2.7 個百分點。小精精 13 系列上市后從山在高端市巫禮表現(xiàn)出強宣山的增勢頭,上諸犍第二周(2022 年 W51),小米在 4000-6000 元價位段江疑銷量份額靈恝登頂國產(chǎn)駱明商第一?