回復 崔正奎 : 送走了虎年看膩了直播兔年轉變口看看兔子吃。Miso 與 Sesame 品鑒爽脆食物 | 圖源:網(wǎng)絡短五分鐘的播中,兔兔了葉甜菜、蘿卜、薄荷草莓。兔年來,已經(jīng)貓雙全的考慮下貓狗兔三?圖源:搗熊養(yǎng)兔第一:弄清兔兔什么人教版學語文一年下冊第七單第 26 課的課文《小兔和小灰兔告訴我們兔吃白菜(初了收收心,白兔勉勵我新的一年也要過度擺爛勞動最光榮。最早接觸“官方”兔食譜(新年間兔兔也穿了紅色戰(zhàn)袍動畫《兔八》中的 Bugs Bunny 和《愛寵大機密》的小白則是胡蘿卜同框兔八哥《愛大機密》中小白 | 圖源:pixabay當然,我們需秉持學態(tài)度。單兔子具有偶性,如人群的你我他,自己的口味好。這種偏可能是由基引起的生理厭惡,也可是從小沒吃胡蘿卜不習或是不知道以吃(看著繃繃沒有香誰知道它其鮮甜多汁呢。實際上大數(shù)兔子都喜吃胡蘿卜,甜而多汁的蘿卜之于兔就像甜品之小朋友,多無益,盡量吃。不僅容蛀牙,而且于蔬菜含水太大,對于子的腸胃并合適,容易起腹瀉。對所有生長階的兔兔,食搭配上都應牧草 > 兔糧 > 蔬菜。各生長階具體食譜 | 圖源:草莓熊糖稀,參資料 [1]蔬菜是引起瀉的元兇?是源于兔兔殊的消化系:后腸發(fā)酵。其消化道雜且較長,積也大,大腸極為發(fā)達總長度為體的 10 倍左右,體重 3 千克左右的兔子腸道有 5~6 米,盲腸約 0.5 米,因而能吃進量的青草,約相當于體的 10%~30%。盲腸和結腸發(fā)達其中有大量微生物繁殖是消化粗纖的基礎,兔對粗纖維的化率為 60%~80%,僅次于牛羊高于馬和豬兔子粗纖維乏時易引起化紊亂、采量下降、腹等。以下是兔兔知多少環(huán)節(jié),來看你真的了解們嗎?Q1:兔兔腹瀉是為喝多了水A:兔子喝水和腹瀉是相獨立事件,須供應充足飲水,這與量食入蔬菜致腹瀉和便是不同的(要多喝熱水兔兔也是)需要注意的,需用滾珠壺替代水槽水,這是由子的口腔結決定的。Q2:圖省事只兔兔喂兔糧以嗎?A:吃草可補充兔體內(nèi)所需的種營養(yǎng),且于兔兔有食習性,吃草助其調(diào)理腸,完全排毛不能只喂兔的原因是兔腸道內(nèi)非常的益生菌群微生物會導兔糧在腸道發(fā)酵、制氣引起嚴重的化不良,進腹瀉。Q3:可以給兔兔肉嗎?A:兔兔的腸胃不應高脂肪、水分食物,括很多含油的食品均是能食用的,如巧克力、便面、面包等,以及蛋食品,含葷的食品等,兔吃了肉類品及含油量的食品,會成嚴重的腸疾病。Q4:為什么晚上兔兔準備的物更多?夜成了正餐?A:日夜食物應量比例懸則源于兔兔夜行性動物不包括人,so 早睡早起哈,新一年 flag 之一)。對熬夜的小伙,在兔年也以改稱“夜子”為“夜兔’子”了奇葩“食譜之一:吃娃以為這就結了嗎?看著畜無害的兔其實還吃胎甚至是自己娃!圖源:pixabay俗語說“虎不食子”,母兔卻經(jīng)常部或部分吃、咬死自己生不久的娃主要有以下個原因:飼不足和營養(yǎng)質(zhì)供應不平:每天的飼量不足或日中某些蛋白和維生素的乏、鈣磷不、鈉鹽不足母性不強:些初產(chǎn)母兔前產(chǎn)后都不泄兔毛,表其母性不強外界影響:母兔產(chǎn)仔過中,忽然受驚嚇、產(chǎn)仔出現(xiàn)異味等產(chǎn)前準備工差:母兔在仔后,非常渴, 如不能及時喝到清的飲水,將致母兔吃掉產(chǎn)的仔兔;整仔兔技術過關:由于兔在產(chǎn)后死或母兔產(chǎn)仔多,需人為行調(diào)整 (即寄養(yǎng)),兔嗅覺特別靈敏給寄養(yǎng)工作來了一定的難,如果母嗅到異味, 會把所寄養(yǎng)仔兔或親生仔兔吃掉 [2]知道上述原因,對癥藥,就能盡避免親子相(殺掉自己生幼崽并吃)的“慘劇了。奇葩食之二:吃屎外,溫文爾的兔兔居然吃自己的便!不同于避食子,吃便是不應該禁的。兔子的便分為硬便軟便。軟便稱葡萄便(腸便),顧思義像一串萄,軟濕的個小顆粒黏一起,比較且臭。兔兔軟便中包含多未消化的養(yǎng)物質(zhì),兔吃便便的行不算異食癖可以理解為行“二次消”。此外,便中含有兔需要但欠缺淀粉酶,如狠心禁止其們吃便便,們最終會營不良 [3]。結語如表示,對于兔愛吃的東西加以節(jié)制,頓供應,否不知飽的兔容易積食,八分飽最好正如古代營學專著《飲正要》所述故善養(yǎng)性者飲而食,食令飽。先渴欽,飲勿令。食欲數(shù)而,不欲頓而,蓋飽中饑 ,饑中飽,則傷肺,饑傷氣,若食,不得便臥即生百病”與君共勉。吃什么不等正確飲食,我們?yōu)榱私?也得謹遵平膳食寶塔不(新一年的一 flag)。春節(jié)假接近尾聲,使忙碌,也好好吃飯!考文獻[1] 兔(兔科兔屬動物)_百科[2] 王霞,梁靖.母兔吃仔的原及預防措施 [J].中國養(yǎng)兔,2013 (02):30.[3] 胡宗杰.兔吃自己軟有原因 [J].華北民兵,2008 (02):64.本文來自微信公眾號中科院物理 (ID:cas-iop),作者:莓熊糖?
回復
程中岳 : 本文來自微公眾號:開內(nèi)功修煉 (ID:kfngxl),作者:張彥飛 allen大家好,我是哥!負載是看 Linux 服務器運行狀態(tài)時很用的一個性指標。在觀線上服務器行狀況的時,我們也是常把負載找來看一看。線上請求壓過大的時候經(jīng)常是也伴著負載的飆。但是負載原理你真的解了嗎?我列舉幾個問,看看你對載的理解是足夠的深刻負載是如何算出來的?負載高低和 CPU 消耗正相關嗎?內(nèi)是如何暴露載數(shù)據(jù)給應層的?如果對以上問題理解還拿捏是很準,那飛哥今天就你來深入地解一下 Linux 中的負載!一、解負載查看程我們經(jīng)常 top 命令查看 Linux 系統(tǒng)的負載情況一個典型的 top 命令輸出的負載下所示。#?topLoad?Avg:?1.25,?1.30,?1.95??...........輸出中的 Load Avg 就是我們常說的負載也叫系統(tǒng)平負載。因為純某一個瞬的負載值并有太大意義所以 Linux 是計算了過去一段間內(nèi)的平均,這三個數(shù)別代表的是去 1 分鐘、過去 5 分鐘和過去 15 分鐘的平均負載值那么 top 命令展示的數(shù)據(jù)數(shù)是如來的呢?事上,top 命令里的負值是從 /proc/ loadavg 這個偽文件里來的。通 strace 命令跟蹤 top 命令的系統(tǒng)調(diào)可以看的到個過程。#?strace?topopenat(AT_FDCWD,?"/proc/loadavg",?O_RDONLY)?=?7內(nèi)核中定義了 loadavg 這個偽文件 open 函數(shù)。當用態(tài)訪問 /proc/ loadavg 會觸發(fā)內(nèi)核定義的函數(shù)在這里會讀內(nèi)核中的平負載變量,單計算后便展示出來。體流程如下所示。我們據(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 中包含了打開該件時對應的作方法。//file:?fs/proc/loadavg.cstatic?const?struct?file_operations?loadavg_proc_fops?=?{?.open??=?loadavg_proc_open,?};當在用戶態(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];?//獲取平均負值?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 讀取當前負載值將平負載值按照定的格式打輸出在上面源碼中,大看到了 FIXED_1/200、LOAD_INT、LOAD_FRAC 等奇奇怪怪的義,代碼寫這么猥瑣是為內(nèi)核中并有 float、double 等浮點數(shù)類型,而用整數(shù)來模的。這些代都是為了在數(shù)和小數(shù)之轉化使的。道這個背景行了,不用度展開剖析這樣用戶通訪問 /proc/ loadavg 文件就可以取到內(nèi)核計的負載數(shù)據(jù)。其中獲取 get_avenrun 只是在訪問 avenrun 這個全局數(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)在可以總結下我們開篇的一個問題:?內(nèi)核是如暴露負載數(shù)給應用層的內(nèi)核定義了個偽文件 /proc/ loadavg,每當用戶打開這個文的時候,內(nèi)中的 loadavg_proc_show 函數(shù)就會被調(diào)用到接著訪問 avenrun 全局數(shù)組變量 并將平均負載從整數(shù)化為小數(shù),打印出來。了,另外一新問題又來,avenrun 全局數(shù)組變量中存的數(shù)據(jù)是何,又是被如計算出來的?二、內(nèi)核負載的計算程接上小節(jié)我們繼續(xù)查 avenrun 全局數(shù)組變量的數(shù)來源。這個組的計算過分為如下兩:1.PerCPU 定期匯總瞬時負:定時刷新個 CPU 當前任務數(shù) calc_load_tasks,將每個 CPU 的負載數(shù)據(jù)匯總起來,到系統(tǒng)當前瞬時負載。2.定時計算系統(tǒng)平均負載定時器根據(jù)前系統(tǒng)整體時負載,使指數(shù)加權移平均法(一高效計算平數(shù)的算法)算過去 1 分鐘、過去 5 分鐘、過去 15 分鐘的平均負。接下來我分成兩個小來分別介紹2.1 PerCPU 定期匯總負載 Linux 內(nèi)核中,有一個子系統(tǒng)做時間子系。在時間子統(tǒng)里,初始了一個叫高辨率的定時。在該定時中會定時將個 CPU 上的負載數(shù)(running 進程數(shù) + uninterruptible 進程數(shù))匯總到系統(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);?//將定時器的到函數(shù)設置?tick_sched_timer?ts-sched_timer.function?=?tick_sched_timer;?}在高分辨率初始化的候,將到期數(shù)設置成了 tick_sched_timer。通過這個函數(shù)每個 CPU 都會周期性地執(zhí)行一些務。其中刷當前系統(tǒng)負就是在這個機進行的。里有一點要意一個前提每個 CPU 都有自己獨立的運行隊,。我們根 tick_sched_timer 的源碼進行蹤,它依次過調(diào)用 tick_sched_handle => update_process_times => scheduler_tick。最終在 scheduler_tick 中會刷新當前 CPU 上的負載值到 calc_load_tasks 上。因為每個 CPU 都在定時刷,所以 calc_load_tasks 上記錄的就是整個統(tǒng)的瞬時負值。我們來下負責刷新 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ù)中,獲取前 cpu 以及其對應運行隊列 rq(run queue),調(diào)用 update_cpu_load_active 刷新當前 CPU 的負載數(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){?//獲取當前運隊列的負載對值?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)當前時下的整體瞬負載總數(shù)了我們再展開看是如何根運行隊列計負載值的://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ù)量。應于用戶空中的 R 和 D 兩種狀態(tài)的 task 數(shù)(進程 OR 線程)。由于 calc_load_tasks 是一個長期存在的據(jù)。所以在新 rq 里的進程數(shù)到上的時候,需要刷變化量就行,不全部重算。此上述函數(shù)回的是一個 delta。2.2 定時計算系統(tǒng)平負載上一小中我們找到系統(tǒng)當前瞬負載 calc_load_tasks 變量的更新過程?,F(xiàn)在們還缺一個算過去 1 分鐘、過去 5 分鐘、過去 15 分鐘平均負載機制。傳統(tǒng)義上,我們計算平均數(shù)時候采取的法都是把過一段時間的字都加起來后平均一下把過去 N 個時間點的有瞬時負載加起來取一平均數(shù)不完了。這其實我們傳統(tǒng)意上理解的平數(shù),假如有 n 個數(shù)字,分別是 x1, x2, ..., xn。那么這個數(shù)據(jù)集合的均數(shù)就是 (x1 + x2 + ... + xn) / N。但是如果用種簡單的算來計算平均載的話,存以下幾個問:1.需要存儲過去每一采樣周期的據(jù)假設我們 10 毫秒都采集一次那么就需要用一個比較的數(shù)組將每次采樣的數(shù)全部都存起,那么統(tǒng)計去 15 分鐘的平均數(shù)得存 1500 個數(shù)據(jù) (15 分鐘 * 每分鐘 100 次) 。而且每出現(xiàn)一個新觀察值,就從移動平均減去一個最的觀察值,加上一個最的觀察值,存數(shù)組會頻地修改和更。2.計算過程較為復雜算的時候再整個數(shù)組全起來,再除樣本總數(shù)。然加法很簡,但是成百千個數(shù)字的加仍然很是瑣。3.不能準確表示當變化趨勢傳的平均數(shù)計過程中,所數(shù)字的權重一樣的。但于平均負載種實時應用說,其實越近當前時刻數(shù)值權重應越要大一些好。因為這能更好反應期變化的趨。所以,在 Linux 里使用的并是我們所以的傳統(tǒng)的平數(shù)的計算方,而是采用一種指數(shù)加移動平均(Exponential Weighted Moving Average,EMWA)的平均數(shù)計算法這種指數(shù)加移動平均數(shù)算法在深度習中有很廣的應用。另股票市場里 EMA 均線也是使用是類似的方求均值的方。該算法的學表達式是a1 = a0 * factor + a * (1 - factor)。這個算法想解起來有點復雜,感興的同學可以 Google 自行搜索。我們只需要道這種方法實際計算的候只需要上個時間的平數(shù)即可,不要保存所有時負載值。外就是越靠現(xiàn)在的時間權重越高,夠很好地表近期變化趨。這其實也在時間子系中定時完成,通過一種做指數(shù)加權動平均計算方法,計算三個平均數(shù)我們來詳細下上圖中的行過程。時子系統(tǒng)將在鐘中斷中會冊時鐘中斷處理函數(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"};當每次時鐘節(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 是平均負載計算的核心它會獲取系當前瞬時負值 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);?}獲取瞬時負載比較簡單就是讀取一內(nèi)存變量而。在 calc_load 中就是采用了我們前面的指數(shù)加權動平均法來算過去 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;}雖然這個算法理起來挺復雜但是代碼看來確實要簡不少,計算看起來很少而且看不懂沒有關系,需要知道內(nèi)并不是采用原始的平均計算方法,是采用了一計算快,且更好表達變趨勢的算法行。至此,們開篇提到“負載是如計算出來的?”這個問題有結論了。Linux 定時將每個 CPU 上的運行隊列中 running 和 uninterruptible 的狀態(tài)的進程數(shù)量匯總一個全局系瞬時負載值,然后再定使用指數(shù)加移動平均法統(tǒng)計過去 1 分鐘、過去 5 分鐘、過去 15 分鐘的平均載。三、平負載和 CPU 消耗的關系現(xiàn)在很多學都將平均載和 CPU 給聯(lián)系到了一起。認為載高、CPU 消耗就會高,負載低,CPU 消耗就會低。在很的 Linux 的版本里,統(tǒng)計負載時候確實是計算了 runnable 的任務數(shù)量,這些進程對 CPU 有需求。在個年代里,載和 CPU 消耗量確實是正相關的負載越高就示正在 CPU 上運行,或等待 CPU 執(zhí)行的進程越多,CPU 消耗量也會越高。但前面我們看了,本文使的 3.10 版本的 Linux 負載平均數(shù)不跟蹤 runnable 的任務,而還跟蹤處于 uninterruptible sleep 狀態(tài)的任務。而 uninterruptible 狀態(tài)的進程其實不占 CPU 的。所以說,負載高并一定是 CPU 處理不過來,也有可會是因為磁等其他資源度不過來而得進程進入 uninterruptible 狀態(tài)的進程導致!為什么要么修改。我網(wǎng)上搜到了在 1993 年的一封郵件里找到了因,以下是件原文。From:?Matthias?Urlichs?
回復 李正表 : IT之家 1 月 28 日消息,恒科技發(fā)布公稱,經(jīng)財務門初步測算預計 2022 年度實現(xiàn)歸屬于母公所有者的凈潤為 1.22 億元左右,與上年同(法定披露據(jù))相比,減少 2.86 億元左右,同比減少 70.20% 左右。報告期內(nèi),公司續(xù)投入研發(fā)研發(fā)人數(shù)增較多,研發(fā)員薪酬及研工程費均快增長,使得發(fā)費用同比年增幅 50% 以上。IT之家從恒玄科技 2022 年半年報中發(fā)現(xiàn),該司已經(jīng)為三、華為、OPPO、小米、vivo、榮耀等品牌供,同時也進包括哈曼、克創(chuàng)新、漫者、萬魔等業(yè)音頻廠商供應鏈,并谷歌、阿里百度等互聯(lián)公司的智能頻產(chǎn)品中得應用?