write back中文翻譯,write back是什么意思,write back發(fā)音、用法及例句
- 內容導航:
- 1、write back
- 2、Page Cache
1、write back
write back發(fā)音
英:[?ra?t b?k] 美:[?ra?t b?k]
英: 美:
write back中文意思翻譯
常用釋義:回信:回復他人的來(lái)信、電子郵件等。
回復,回信
write back雙語(yǔ)使用場(chǎng)景
1、It always warms my heart to hear from you, sweetie. write back soon.───得到你的回信總是讓我心感到溫暖, 親愛(ài)的. 請快點(diǎn)回信.
2、I'll write back to him tomorrow.───我明天給他回信.
3、Please attach resume next page exploration discretion , ask to accept write back and let us!───下頁(yè)附個(gè)人簡(jiǎn)歷敬請勘酌, 懇請接納,回函是盼!
4、Mr Clinton did not write back.───克林頓沒(méi)有給他回信。
5、After days of reflection she decided to write back.───想了幾天之后她決定回信。
6、Please write back soon.───請寫(xiě)回來(lái).
7、When men write to me and try to help me, then yes, sometimes I write back!───人們給我寫(xiě)信試圖想幫助我, 的確是的, 有時(shí)我也回信!
8、Should I write back immediately?───我應該立即回復 嗎 ?
9、First you read a letter from someone. After that you write back to them.───首先你讀一封來(lái)自某人的信, 然后你回信給他.
10、After a few days of reflection she decided to write back.───想了幾天后她決定回信.
11、What are you doing now? I am expecting your write back!───現在你在干什么? 我正盼望你的來(lái)信.
12、Please write back as soon as you can.───請盡快給我回信啊!
13、I love you. Write back please.───我愛(ài)你,快點(diǎn)回信吧。
14、After days of reflection she decided to write back.───經(jīng)過(guò)幾天的認真思考,她決定回信。
15、Please write back as soon as possible.───請盡快回信.
16、Those that write back to the input sequence require forward iterators.───那些寫(xiě)回輸入序列的算法要求前向迭代器.
write back相似詞語(yǔ)短語(yǔ)
1、to write back───回信
2、wrote back───回復,回信
3、bit back───咬回;急忙收回要說(shuō)的話(huà);抑制
4、writes back───回復,回信
5、written back───撥回
6、writing back───回復,回信
7、strike back───回擊,反擊
8、bite back───咬回;急忙收回要說(shuō)的話(huà);抑制
9、white bacon───白臘肉
2、Page Cache
Page Cache是通過(guò)將磁盤(pán)中的數據緩存到內存中,減少磁盤(pán)I/O操作,從而提高性能。此外,還要確保Page Cache中的數據更改能夠同步到磁盤(pán)上,這稱(chēng)之為page回寫(xiě)(page writeback)。一個(gè)inode對應一個(gè)page cache對象,一個(gè)page cache對象包含多個(gè)物理page。
對磁盤(pán)的數據進(jìn)行緩存,從而提高性能主要基于兩個(gè)因素:一:磁盤(pán)訪(fǎng)問(wèn)速度比內存慢幾個(gè)數量級。第二是訪(fǎng)問(wèn)過(guò)的數據,很大概率再次訪(fǎng)問(wèn)(局部性原理)。
Page Cache是內核管理的內存,也就是說(shuō),它屬于內核,而不屬于用戶(hù)。
在Linux上,可以直接查看Page Cache的方式有很多, 包括/proc/meminfo、free 、/proc/vmstat 命令,它們的內容實(shí)際上是一致的。
以/proc/meminfo命令來(lái)說(shuō):
其中: Buffers + Cached + SwapCached = Active(file) + Inactive(file) + Shmem + SwapCached
等式兩邊的內容就是平時(shí)說(shuō)的Page Cache ,兩邊都有SwapCached,只是為了說(shuō)明它也是Page Cache的一部分。
在Page Cache中,Active(file) + Inactive(file) 是File-backed page(與文件對應的內存頁(yè)),是最需要關(guān)注的部分,因為平時(shí)用的mmap()內存映射方式和buffered I/O來(lái)消耗的內存就是這部分。
SwapCached是打開(kāi)了Swap分區后,把Inactive(anno) + Active(anno)兩項匿名頁(yè)交換到磁盤(pán)(swap out)之后,然后在讀入到內存(swap in)之后分配的內存。 由于讀入到內存后,原來(lái)的Swap File還存在,所以SwapCached也可以認為是File-backed page,屬于Page Cache。 注意:SwapCached只有在Swap分區打開(kāi)的請求下才會(huì )有,但是Swap過(guò)程產(chǎn)生的I/O很容易引起性能抖動(dòng),因此,線(xiàn)上環(huán)境Swap分區一般是關(guān)閉的。
Shmen是指匿名共享映射這種方式分配的內存(free 命令中的shared一項)。
當內核發(fā)起一個(gè)讀請求時(shí),會(huì )先檢查請求的數據是否緩存到了page cache中,如果有則直接從內存中讀取,不需要訪(fǎng)問(wèn)磁盤(pán)。如果cache沒(méi)有請求的數據,就必須從磁盤(pán)中讀取數據,然后內核將數據緩存到cache中。這樣后續讀請求就可以命中cache了。page可以只緩存一個(gè)文件部分的內容,不需要把整個(gè)文件都緩存進(jìn)來(lái)。
當內核發(fā)起一個(gè)寫(xiě)請求時(shí),同樣直接寫(xiě)入到cache中。內核會(huì )將被寫(xiě)入的page標記為dirty,并將其加入到dirty list中。內核會(huì )周期性的將dirty list中的page回寫(xiě)到磁盤(pán)上。從而使磁盤(pán)上的數據和內存中緩存的數據一致。
Page Cache的產(chǎn)生有兩種不同的方式:
兩種方式產(chǎn)生如下圖:
對于標準I/O的寫(xiě),是寫(xiě)用戶(hù)緩沖區,然后再講用戶(hù)緩沖區的數據拷貝到內核緩沖區。如果是讀的話(huà),則先從內核緩沖區拷貝到用戶(hù)緩沖區,再從用戶(hù)緩沖區中讀數據。
對于存儲映射I/O,是直接將Pagecache 的Page 給映射到用戶(hù)地址空間,用戶(hù)直接讀寫(xiě)Pagecache Page中的內容。
以標準I/O為例,解釋一下,Page Cache如何產(chǎn)生。具體如下圖:
1)往用戶(hù)緩沖區buffer寫(xiě)入數據。然后buffer中的數據拷貝到內核緩沖區(Pagecache page)。
2)如果內核緩沖區中沒(méi)有這個(gè)Page,就會(huì )發(fā)生Page Fault,會(huì )去分配一個(gè)Page。
3)拷貝數據,該Pagecache Page就是一個(gè)Dirty Page(臟頁(yè))。
4)然后Dirty Page的內容會(huì )同步到磁盤(pán),同步到磁盤(pán)后,該Pagecache Page就會(huì )變成Clean Page并且繼續存在系統中。
如果是讀文件產(chǎn)生的PageCache ,它的內容和磁盤(pán)內容一樣,所以它一開(kāi)始就是Clean Page,除非改寫(xiě)了里面的內容才會(huì )變成Dirty Page。
cat /proc/vmstat | egrep "dirty|writeback“
nr_dirty 表示當前系統中積壓了多少臟頁(yè),nr_writeback 則表示有多少臟頁(yè)正在回寫(xiě)到磁盤(pán)中,他們兩個(gè)的單位都是 Page(4KB)。
先看寫(xiě)內存分配的圖:
可以得出,應用在申請內存的時(shí)候,即使沒(méi)有free內存了,只要還有足夠的可回收逇Page Cache,也可以通過(guò)回收Page Cache的方式來(lái)申請到內存,所以,回收的方式主要有兩種: 直接回收和后臺回收。
也就是對應的兩種頁(yè)面回收機制:
1)周期性的檢查:后臺運行的守護進(jìn)程kswapd完成。該進(jìn)程定期檢查當前系統的內存使用情況,發(fā)現系統內空閑的物理內存數目少于特定的閾值(參數是什么?),該進(jìn)程就會(huì )發(fā)起頁(yè)面回收的操作。
2)“內存嚴重不足”事件觸發(fā):如果需要很大內存,而當時(shí)系統的內存沒(méi)有辦法提供足夠多的物理內存以滿(mǎn)足內存請求。這時(shí),操作系統就必須盡快進(jìn)行頁(yè)面回收,以便釋放一些內存空間從而滿(mǎn)足內存請求。
可以通過(guò)命令sar來(lái)觀(guān)察內存回收行為,也可以通過(guò)查看/proc/vmstat里面的指標進(jìn)行查看。
Linux中的頁(yè)面回收是基于LRU(Lease recently used ,最近最少使用)算法。Linux操作系統對LRU的實(shí)現是基于一對雙向鏈表,active鏈表和inactive鏈表。經(jīng)常被訪(fǎng)問(wèn)的處于活躍狀態(tài)的頁(yè)面會(huì )被放到activre鏈表上,并不經(jīng)常使用的頁(yè)面則會(huì )放到inactive聊表上。頁(yè)面會(huì )在兩個(gè)雙向鏈表中移動(dòng)。頁(yè)面可能從active鏈表移動(dòng)到inactive鏈表,反之也有可能。但是移動(dòng)并不是每次頁(yè)面訪(fǎng)問(wèn)都會(huì )發(fā)生(要通過(guò)自旋鎖來(lái)保證對鏈表并發(fā)訪(fǎng)問(wèn)操作不會(huì )出錯,為了降低鎖競爭,LInux提供了一種特殊的緩存,LRU緩存,用于批量的向LRU鏈表中快速的添加頁(yè)面。有了 LRU 緩存之后,新頁(yè)不會(huì )被馬上添加到相應的鏈表上去,而是先被放到一個(gè)緩沖區中去,當該緩沖區緩存了足夠多的頁(yè)面之后,緩沖區中的頁(yè)面才會(huì )被一次性地全部添加到相應的 LRU 鏈表中去),頁(yè)面的移動(dòng)發(fā)生的間隔有可能比較長(cháng)。對于最近最少使用的頁(yè)面會(huì )被逐個(gè)放到inactive鏈表的尾部。進(jìn)行頁(yè)面回收時(shí),Linux操作系統會(huì )從inactive鏈表的尾部開(kāi)始回收。
而第一次讀取文件后,文件內容都是Inactive的,只有再次讀取這些內容后,才會(huì )把它放到active鏈表上。處于Inactive鏈表上的pagecache在內存緊張的時(shí)候,是會(huì )首先被回收掉。有很多情況下,文件內容往往只被讀取一次,它們占用的pagecache需要首先被回收掉;對于業(yè)務(wù)數據,往往都會(huì )讀取幾次,那么他們就會(huì )被放到active鏈表上,以此來(lái)達到保護的目的。
在內存緊張的情況下,會(huì )進(jìn)行內存回收,回收會(huì )把Inactive list的部分page給回收掉。為了維護inactive和active的平衡,就需要把active list的部分page給demote到inactive list,demote的原則也是LRU。
疑問(wèn):active list和inactive list的比例是多少?,線(xiàn)上環(huán)境看,這里兩個(gè)的比例還是比較大,超過(guò)1:2
不是file-backed pages,即為匿名頁(yè)(anonymous page),如堆、棧和數據段等,不是以文件形式存在,因此無(wú)法和磁盤(pán)文件交換,但可以通過(guò)磁盤(pán)上劃分額外的swap分區或使用swap文件進(jìn)行交換。
1)水位(watermark)控制
min:如果剩余內存減少到觸及這個(gè)水位,可認為內存嚴重不足,當前進(jìn)程就會(huì )被阻塞,kernel會(huì )直接在這個(gè)進(jìn)程的進(jìn)程上下文做內存回收(direct reclaim)。
low:當剩余內存慢慢減少,觸及到這個(gè)水位,就會(huì )觸發(fā)kswapd線(xiàn)程進(jìn)行內存回收。(后臺回收)
high:進(jìn)行內存回收時(shí),內存慢慢增加,觸及到這個(gè)水位時(shí),就停止回收。
由于每個(gè)ZONE是分別管理各自的內存的,因此每個(gè)ZONE都有這個(gè)三個(gè)水位。
水位計算:/proc/sys/vm/min_free_kbytes 是一個(gè)用戶(hù)可配置的值,默認值是min_free_kbytes = 4 * sqrt(lowmem_kbytes)。然后根據min算出來(lái)low和high水位的值:low=5/4min,high=6/4min。(計算不是這里的重點(diǎn),如果有需要見(jiàn)參考資料7)
1)swapness
回收的時(shí)候,會(huì )回收f(shuō)ile-backed page和 anonymous page ,但是誰(shuí)回收的多一些,可以通過(guò)/proc/sys/vm/swapness來(lái)控制誰(shuí)回收多一些。swapness的值越大,越傾向于回收匿名頁(yè)。值越小,越傾向于稅后file-backed的頁(yè)面?;厥辗椒ǘ际荓RU算法。
Page cache畢竟是為了提高性能占用的物理內存,隨著(zhù)越來(lái)越多的磁盤(pán)數據被緩存到內存中,Page Cache也變得越來(lái)越大,如果一些重要的任務(wù)需要被Page cache占用的內存,內核將回收page cache以此來(lái)支持。
1)空間層面
當系統的“dirty”的內存大于某個(gè)閾值,該閾值是在總共的“可用內存”(包括free pages 和reclaimable pages)中的占比。
參數“dirty_background_ratio”(默認值10%),或者是絕對字節數“dirty_background_bytes”(默認值為0,表示生效)。兩個(gè)參數只要誰(shuí)先達到即可執行,此時(shí)就會(huì )交給專(zhuān)門(mén)負責writeback的background線(xiàn)程去處理。
參數“dirty_ratio”(默認值30%)和“dirty_bates”(默認值為0,表示生效),當“dirty”的內存達到這個(gè)比例或數量,進(jìn)程則會(huì )停下write操作(被阻塞),先把“dirty”進(jìn)行writeback。
2)時(shí)間層面
周期性的掃描,掃描間隔用參數:dirty_writeback_interval表示,以毫秒為單位。發(fā)現存在最近一次更新時(shí)間超過(guò)某個(gè)閾值(參數:dirty_expire_interval,單位毫秒)的pages。如果每個(gè)page都維護最近更新時(shí)間,開(kāi)銷(xiāo)會(huì )很大且掃描會(huì )很耗時(shí),因此具體實(shí)現不會(huì )以page為粒度,而是按inode中記錄的dirtying-time來(lái)計算。
3)用戶(hù)主動(dòng)發(fā)起。
調用sync()/msync()/fsync()。
參數設置可以在:/proc/sys/vm下。
其中dirty_writeback_interval實(shí)際的參數為:dirty_writeback_centisecs(默認值為500,單位為1/100秒,也就是5秒)
dirty_expire_interval實(shí)際的參數為:dirty_expire_centisecs(默認值為3000,單位為1/100秒,也就是30秒)
2.4內核,用一個(gè)叫bdflush的線(xiàn)程專(zhuān)門(mén)負責writeback操作。因為磁盤(pán)I/O操作很慢,而線(xiàn)程操作系統有多個(gè)塊設備,如果bdflush在其中一個(gè)塊設備上等待I/O操作的完成,可能會(huì )需要很長(cháng)的時(shí)間,此時(shí)單線(xiàn)程模式的bdfoush就會(huì )成為影響性能的瓶頸。而且bdflush沒(méi)有周期掃描功能。
在2.6內核中,bdflush和kupdated一起被pdflush(page dirty flush)取代了。pdflush是一組線(xiàn)程,根據塊設備的I/O負載情況,數量從最少2個(gè)到最多8個(gè)不等。如果1秒內沒(méi)有空閑的pdflush線(xiàn)程,則會(huì )創(chuàng )建一個(gè);如果pdflush線(xiàn)程的空閑時(shí)間超過(guò)1秒,則會(huì )被銷(xiāo)毀。一個(gè)塊設備可能有多個(gè)可以傳輸數據的隊列,為了避免在隊列上的擁塞(congestion),pdflush線(xiàn)程會(huì )動(dòng)態(tài)的選擇系統中相對空閑的隊列。
在2.6.32版本上,直接一個(gè)塊設備對應一個(gè)thread(算法效果不明顯),這種內核線(xiàn)程被稱(chēng)為flusher threads。
無(wú)論是內核周期性的掃描,還是用戶(hù)手動(dòng)觸發(fā),flusher threads的write back都是間隔一段時(shí)間才進(jìn)行的。如果這段時(shí)間內系統掉電了,那么還沒(méi)有來(lái)得及write back的數據修改就面臨丟失的風(fēng)險,算是page cache機制存在的一個(gè)缺點(diǎn)。
free命令中,存在buff/cache的內容,如下。但是不太好區分。
通過(guò)man free查看指標含義,可以看到buffer和cache的區別。
通過(guò)man proc,可以得到proc文件系統的詳細文檔,其中就包括了/proc/meminfo的信息
通過(guò)這個(gè)文檔,可以得到:
實(shí)際上,寫(xiě)文件時(shí)會(huì )用到Cache緩存數據(雖然文檔上,Cache值提到是文件的讀緩存),寫(xiě)磁盤(pán)則會(huì )用到Bufffer來(lái)緩存數據。
讀文件時(shí),數據會(huì )緩存到Cache中。而讀磁盤(pán)時(shí)數據會(huì )緩存到Buffer中。
綜上:
0)Linux中的內存回收[一] https://zhuanlan.zhihu.com/p/70964195
1) Linux中的Page Cache [二] https://zhuanlan.zhihu.com/p/71217136
2)Linux內核中的頁(yè)面回收算法 http://liujunming.top/2017/09/28/Linux%E5%86%85%E6%A0%B8%E4%B8%AD%E7%9A%84%E9%A1%B5%E9%9D%A2%E5%9B%9E%E6%94%B6%E7%AE%97%E6%B3%95/
3)Linux內存回收機制 http://baijiahao.baidu.com/s?id=1632115061958384848
4)Linux 內核源碼分析-Page Cache 刷臟源碼分析 https://leviathan.vip/2019/06/01/Linux%E5%86%85%E6%A0%B8%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90-Page-Cache%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90/
5)Page Cache與Page回寫(xiě) https://www.cnblogs.com/linhaostudy/p/10196915.html#_label2
6)極客時(shí)間 《LInux內核技術(shù)實(shí)戰課》
7)內存管理參數min_free_kbytes 分析 http://linux.laoqinren.net/kernel/vm-sysctl-min_free_kbytes/
版權聲明: 本站僅提供信息存儲空間服務(wù),旨在傳遞更多信息,不擁有所有權,不承擔相關(guān)法律責任,不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責。如因作品內容、版權和其它問(wèn)題需要同本網(wǎng)聯(lián)系的,請發(fā)送郵件至 舉報,一經(jīng)查實(shí),本站將立刻刪除。