linux刷臟頁命令 linux如何刷新磁盤空間

詳解Linux系統(tǒng)內(nèi)存知識及調(diào)優(yōu)方案

內(nèi)存是計算機中重要的部件之一,它是與CPU進行溝通的橋梁。計算機中所有程序的運行都是在內(nèi)存中進行的,因此內(nèi)存的性能對計算機的影響非常大。內(nèi)存作用是用于暫時存放CPU中的運算數(shù)據(jù),以及與硬盤等外部存儲器交換的數(shù)據(jù)。只要計算機在運行中,CPU就會把需要運算的數(shù)據(jù)調(diào)到內(nèi)存中進行運算,當運算完成后CPU再將結(jié)果傳送出來,內(nèi)存的運行也決定了計算機的穩(wěn)定運行。對于整個操作系統(tǒng)來說,內(nèi)存可能是最麻煩的的設(shè)備。而其性能的好壞直接影響著整個操作系統(tǒng)。

創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供臥龍網(wǎng)站建設(shè)、臥龍做網(wǎng)站、臥龍網(wǎng)站設(shè)計、臥龍網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、臥龍企業(yè)網(wǎng)站模板建站服務,十余年臥龍做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡服務。

我們知道CPU是不能與硬盤打交道的,只有數(shù)據(jù)被載入到內(nèi)存中才可以被CPU調(diào)用。cpu在訪問內(nèi)存的時候需要先像內(nèi)存監(jiān)控程序請求,由監(jiān)控程序控制和分配內(nèi)存的讀寫請求,這個監(jiān)控程序叫做MMU(內(nèi)存管理單元)。下面以32位系統(tǒng)來說明內(nèi)存的訪問過程:

32位的系統(tǒng)上每一個進程在訪問內(nèi)存的時候,每一個進程都當做自己有4個G的內(nèi)存空間可用,這叫虛擬內(nèi)存(地址),虛擬內(nèi)存轉(zhuǎn)化成物理內(nèi)存是通過MMU來完成的。為了能夠從線性地址轉(zhuǎn)換成物理地址,需要page table(頁表)的內(nèi)存空間,page table要載入到MMU上。為了完成線性地址到物理地址的映射,如果按照1個字節(jié)1個字節(jié)映射的話,需要一張非常大的表,這種轉(zhuǎn)換關(guān)系會非常的復雜。因此把內(nèi)存空間又劃分成了另外一種存儲單元格式,通常為4K。在不同的硬件平臺上,它們的大小一般是不一樣的,像x86 32位的有4k的頁;而64位的有4k頁,2M頁,4M頁,8M頁等等,默認都是4k的。每一個進程一般而言都有自己的頁路徑和頁表映射機制,不管那一個頁表都是由內(nèi)核加載的。每一個進程只能看到自己的線性地址空間,想要增加新的內(nèi)存的時候,只能在自己的線性地址空間中申請,并且申請后一定是通過操作系統(tǒng)的內(nèi)核映射到物理地址空間中去找那么一段空間,并且告訴線性地址空間準備好了,可以訪問,并且在page table中增加一條映射關(guān)系,于是就可以訪問物理內(nèi)存了,這種叫做內(nèi)存分配。但是新的申請一定是通過操作的內(nèi)核到物理內(nèi)存中去找那么一段空間,并且告訴線性地址空間好了,可以建設(shè)映射關(guān)系,最終page table建立映射關(guān)系。

這反映了上述描述過程的大體情況。可以看到每一個用戶程序都會有自己的頁表,并且映射到對應的主存儲器上去。

根據(jù)上述文字和圖表的描述可以發(fā)現(xiàn)2個問題:

1.每個進程如果需要訪問內(nèi)存的時候都需要去查找page table的話,勢必會造成服務器的性能底下

2.如果主存儲器的內(nèi)存滿了以后,應用程序還需要調(diào)用內(nèi)存的時候怎么辦

對于第一個問題,我們就需要借助TLB(Translation Lookaside Buffer)翻譯后備緩沖器。TLB是一個內(nèi)存管理單元,它可以用于改進虛擬地址到物理地址轉(zhuǎn)換速度的緩存。這樣每次在查找page table的時候就可以先去TLB中查找相應的頁表數(shù)據(jù),如果有就直接返回,沒有再去查找page table,并把查找到的結(jié)果緩存中TLB中。TLB雖然解決了緩存的功能,但是在那么page table中查找映射關(guān)系仍然很慢,所以又有了page table的分級目錄。page table可以分為1級目錄,2級目錄和偏移量

但是一個進程在運行的時候要頻繁的打開文件,關(guān)閉文件。這就意味著要頻繁的申請內(nèi)存和釋放內(nèi)存。有些能夠在內(nèi)存中緩存數(shù)據(jù)的那些進程,他們對內(nèi)存的分配和回收更多,那么每一次分配都會在頁表中建立一個對應項。所以,就算內(nèi)存的速度很快,大量頻繁的同一時間分配和釋放內(nèi)存,依然會降低服務器的整體性能。當然內(nèi)存空間不夠用的時候,我們稱為oom(out of memory,內(nèi)存耗盡)。當內(nèi)存耗盡的時候,,整個操作系統(tǒng)掛了。這種情況下我們可以考慮交換分區(qū),交換分區(qū)畢竟是由硬盤虛擬出來的內(nèi)存,所以其性能與真正的內(nèi)存相比,差了很多,所以要盡力避免使用交換分區(qū)。有物理內(nèi)存空間的時候盡量保證全部使用物理內(nèi)存。cpu無論如何是不能給交換內(nèi)存打交道的,它也只能給物理內(nèi)存打交道,能尋址的空間也只能是物理內(nèi)存。所以當真正物理內(nèi)存空間不夠用的時候,會通過LRU算法把其中最近最少使用的內(nèi)存放到交換內(nèi)存中去,這樣物理內(nèi)存中的那段空間就可以供新的程序使用了。但是這樣會引發(fā)另外的一個問題,即原來的進程通過page table尋找的時候,那一段空間的數(shù)據(jù)已經(jīng)不屬于它了。所以此刻cpu發(fā)送通知或者異常告訴這個程序,這個地址空間已不屬于它,這個時候可能會出現(xiàn)2種情況:

1.物理內(nèi)存有可用的空間可用:這個時候cpu會根據(jù)以前的轉(zhuǎn)換策略會把交換分區(qū)中的那段內(nèi)存重新送到物理內(nèi)存中去,但是轉(zhuǎn)換過來的空間地址不一定會是以前的那一段空間地址,因為以前的那一段空間地址可能已經(jīng)被別人使用了。

2.物理內(nèi)存沒有可用的空間可用:這個時候依然會使用LRU算發(fā)把當前物理地址空間上最近最少使用的空間地址轉(zhuǎn)換到交換內(nèi)存中去,并把當前進程需要的這斷在交換空間中的內(nèi)存送到物理內(nèi)存空間中去,并且重新建立映射關(guān)系。

上述通知或者異常出現(xiàn)的情況,通常叫做缺頁異常。缺頁異常也分為大異常和小異常兩種。大異常就是訪問的數(shù)據(jù)內(nèi)存中沒有,不的不去硬盤上加載,無論是從交換內(nèi)存中還是直接從磁盤的某個文件系統(tǒng)上,反正需要從硬盤上去加載,這種異常加載需要很長時間。小異常就是進程之間通過共享內(nèi)存,第二個進程訪問的時候,查看本地的內(nèi)存映射表沒有,但是其它進程已經(jīng)擁有了這個內(nèi)存頁,所以可以直接映射,這種異常加載需要的時間一般很短。

在操作系統(tǒng)開機的時候,每一個io設(shè)備都會像cpu申請一些列的隨機端口,這種端口叫做io端口。在IBM PC體系結(jié)構(gòu)中,I/O地址空間一共提供了65,536個8位的I/O端口。正是這些io端口的存在,cpu可以與io設(shè)備進行讀寫交互的過程。在執(zhí)行讀寫操作時,CPU使用地址總線選擇所請求的I/O端口,使用數(shù)據(jù)總線在CPU寄存器和端口之間傳送數(shù)據(jù)。I/O端口還可以被映射到物理地址空間:因此,處理器和I/O設(shè)備之間的通信就可以直接使用對內(nèi)存進行操作的匯編語言指令(例如,mov、and、or等等)?,F(xiàn)代的硬件設(shè)備更傾向于映射I/O,因為這樣處理的速度較快,并可以和DMA結(jié)合起來使用。這樣io在和內(nèi)存?zhèn)鲾?shù)據(jù)的時候就不需要通過cpu,cpu把總線的控制權(quán)交給DMA,每次io傳數(shù)據(jù)的時候就調(diào)用DMA一次,就把cpu給解放了出來。當數(shù)據(jù)傳輸完了以后,DMA通知給cpu中斷一次。DMA在運行的時候?qū)φ麄€總線有控制權(quán)限,當cpu發(fā)現(xiàn)有其它進程需要使用總線的時候,二者就會產(chǎn)生爭用。這個時候,在總線控制權(quán)的使用上,CPU和DMA具有相等的權(quán)限。只要CPU委托給了DMA,就不能隨意的收回這個委托,就要等待DMA的用完。

如果沒有其它進程可以運行,或者其它進程運行的時間非常短,這個時候CPU發(fā)現(xiàn)我們的IO仍然沒有完成,那就意味著,CPU只能等待IO了。CPU在時間分配里面有個iowait的值,就是CPU在等待IO花費的時間。有些是在同步調(diào)用過程中,CPU必須要等待IO的完成;否者CPU可以釋放IO的傳輸在背后自動完成,CPU自己去處理其它的事情。等硬盤數(shù)據(jù)傳輸完成以后,硬盤只需要像CPU發(fā)起一個通知即可。CPU外圍有一種設(shè)備,這個設(shè)備叫做可編程中斷控制器。每一個硬件設(shè)備為了給CPU通信,在剛開機的時候,在BIOS實現(xiàn)檢測的時候,這個設(shè)備就要到可編程中斷控制器上去注冊一個所謂的中斷號。那么這個號碼就歸這個硬件使用了。當前主機上可能有多個硬件,每一個硬件都有自己的號碼,CPU在收到中斷號以后,就能夠通過中斷相量表查找到那個硬件設(shè)備進行中斷。并且就由對應的IO端口過來處理了。

CPU正在運行其它進程,當一個中斷請求發(fā)過來的時候,CPU會立即終止當前正在處理的進程,而去處理中斷。當前CPU掛起當前正在處理的進程,轉(zhuǎn)而去執(zhí)行中斷的過程,也叫做中斷切換。只不過,這種切換在量級別上比進程切換要低一些,而且任何中斷的優(yōu)先級通常比任何進程也要高,因為我們指的是硬件中斷。中斷還分為上半部和下半部,一般而言,上半部就是CPU在處理的時候,把它接進來,放到內(nèi)存中,如果這個事情不是特別緊急(CPU或者內(nèi)核會自己判斷),因此在這種情況下,CPU回到現(xiàn)場繼續(xù)執(zhí)行剛才掛起的進程,當這個進程處理完了,再回過頭來執(zhí)行中斷的下半部分。

在32位系統(tǒng)中,我們的內(nèi)存(線性地址)地址空間中,一般而言,低地址空間有一個G是給內(nèi)核使用的,上面3個G是給進程使用的。但是應該明白,其實在內(nèi)核內(nèi)存當中,再往下,不是直接這樣劃分的。32位系統(tǒng)和64位系統(tǒng)可能不一樣(物理地址),在32位系統(tǒng)中,最低端有那么10多M的空間是給DMA使用的。DNA的總線寬度是很小的,可能只有幾位,所以尋址能力很有限,訪問的內(nèi)存空間也就很有限。如果DMA需要復制數(shù)據(jù),而且自己能夠?qū)ぶ肺锢韮?nèi)存,還可以把數(shù)據(jù)直接壯哉進內(nèi)存中去,那么就必須保證DMA能夠?qū)ぶ纺嵌蝺?nèi)存才行。尋址的前提就是把最低地址斷M,DA的尋址范圍內(nèi)的那一段給了DMA。所以站在這個角度來說,我們的內(nèi)存管理是分區(qū)域的。

在32位系統(tǒng)上,16M的內(nèi)存空間給了ZONE_DMA(DMA使用的物理地址空間);從16M到896M給了ZONE_NORMAL(正常物理地址空間),對于Linux操作系統(tǒng)來說,是內(nèi)核可以直接訪問的地址空間;從896M到1G這斷空間叫做"Reserved"(預留的物理地址空間);從1G到4G的這段物理地址空間中,我們的內(nèi)核是不能直接訪問的,要想訪問必須把其中的一段內(nèi)容映射到Reserved來,在Reserved中保留出那一段內(nèi)存的地址編碼,我們內(nèi)核才能上去訪問,所以內(nèi)核不直接訪問大于1G的物理地址空間。所以在32位系統(tǒng)上,它訪問內(nèi)存當中的數(shù)據(jù),中間是需要一個額外步驟的。

在64位系統(tǒng)上,ZONE_DAM給了低端的1G地址空間,這個時候DMA的尋址能力被大大加強了;ZONE_DAM32可以使用4G的空間;而大于1G以上給劃分了ZONE_NORMAL,這段空間都可以被內(nèi)核直接訪問。所以在64位上,內(nèi)核訪問大于1G的內(nèi)存地址,就不需要額外的步驟了,效率和性能上也大大增加,這也就是為什么要使用64位系統(tǒng)的原因。

在現(xiàn)在的PC架構(gòu)上,AMD,INTER都支持一種機制,叫做PEA(物理地址擴展)。所謂PAE。指的是在32位系統(tǒng)的地址總線上,又擴展了4位,使得32位系統(tǒng)上的地址空間可以達到64G。當然在32為系統(tǒng)上,不管你的物理內(nèi)存有多大,單個進程所使用的空間是無法擴展的。因為在32位的系統(tǒng)上,線性地址空間只有4個G,而單個進程能夠識別的訪問也只有3個G。

linux的虛擬內(nèi)存子系統(tǒng)包含了以下幾個功能模塊:

slab allocator,zoned buddy allocator,MMU,kswapd,bdflush

slab allocator叫做slab分配器

buddy allocator又叫做buddy system,叫做伙伴系統(tǒng),也是一種內(nèi)存分配器

buddy system是工作在MMU之上的,而slab allocator又是工作在buddy system之上的。

設(shè)置為小于等于1G,在數(shù)據(jù)庫服務器應該勁量避免使用交換內(nèi)存

3.在應用服務器上,可以設(shè)置為RAM*0.5,當然這個是理論值

如果不的不使用交換內(nèi)存,應該把交換內(nèi)存放到最靠外的磁道分區(qū)上,因為最外邊的磁盤的訪問速度最快。所以如果有多塊硬盤,可以把每塊硬盤的最外層的磁道拿一小部分出來作為交換分區(qū)。交換分區(qū)可以定義優(yōu)先級,因此把這些硬盤的交換內(nèi)存的優(yōu)先級設(shè)置為一樣,可以實現(xiàn)負載均衡的效果。定義交換分區(qū)優(yōu)先級的方法為編輯/etc/fstab:

/dev/sda1 swap swap pri=5 0 0

/dev/sdb1 swap swap pri=5 0 0

/dev/sdc1 swap swap pri=5 0 0

/dev/sdd1 swap swap pri=5 0 0

四.內(nèi)存耗盡時候的相關(guān)調(diào)優(yōu)參數(shù)

當Linux內(nèi)存耗盡的時候,它會殺死那些占用內(nèi)存最多的進程,以下三種情況會殺死進程:

1.所有的進程都是活動進程,這個時候想交換出去都沒有空閑的進程

2.沒有可用的page頁在ZONE_NORMAL中

3.有其它新進程啟動,申請內(nèi)存空間的時候,要找一個空閑內(nèi)存給做映射,但是這個時候找不到了

一旦內(nèi)存耗盡的時候,操作系統(tǒng)就會啟用oom-kill機制。

在/proc/PID/目錄下有一個文件叫做oom_score,就是用來指定oom的評分的,就是壞蛋指數(shù)。

如果要手動啟用oom-kill機制的話,只需要執(zhí)行echo f/proc/sysrq-trigger即可,它會自動殺掉我們指定的壞蛋指數(shù)評分最高的那個進程

可以通過echo n /proc/PID/oom_adj來調(diào)整一個進程的壞蛋評分指數(shù)。最終的評分指數(shù)就是2的oom_adj的值的N次方。假如我們的一個進程的oom_adj的值是5,那么它的壞蛋評分指數(shù)就是2的5次方。

如果想禁止oom-kill功能的使用可以使用vm.panic_on_oom=1即可。

五.與容量有關(guān)的內(nèi)存調(diào)優(yōu)參數(shù):

overcommit_memory,可用參數(shù)有3個,規(guī)定是否能夠過量使用內(nèi)存:

0:默認設(shè)置,內(nèi)核執(zhí)行啟發(fā)式的過量使用處理

1:內(nèi)核執(zhí)行無內(nèi)存的過量使用處理。使用這個值會增大內(nèi)存超載的可能性

2:內(nèi)存的使用量等于swap的大小+RAM*overcommit_ratio的值。如果希望減小內(nèi)存的過度使用,這個值是最安全的

overcommit_ratio:將overcommit_memory指定為2時候,提供的物理RAM比例,默認為50

六.與通信相關(guān)的調(diào)優(yōu)參數(shù)

常見在同一個主機中進行進程間通信的方式:

1.通過消息message;2.通過signal信號量進行通信;3.通過共享內(nèi)存進行通信,跨主機常見的通信方式是rpc

以消息的方式實現(xiàn)進程通信的調(diào)優(yōu)方案:

msgmax:以字節(jié)為單位規(guī)定消息隊列中任意消息的最大允許大小。這個值一定不能超過該隊列的大小(msgmnb),默認值為65536

msgmnb:以字節(jié)為單位規(guī)定單一消息隊列的最大值(最大長度)。默認為65536字節(jié)

msgmni:規(guī)定消息隊列識別符的最大數(shù)量(及隊列的最大數(shù)量)。64位架構(gòu)機器的默認值為1985;32位架構(gòu)機器的默認值為1736

以共享內(nèi)存方式實現(xiàn)進程通信的調(diào)優(yōu)方案:

shmall:以字節(jié)為單位規(guī)定一次在該系統(tǒng)中可以使用的共享內(nèi)存總量(單次申請的上限)

shmmax:以字節(jié)為單位規(guī)定每一個共享內(nèi)存片段的最大大小

shmmni:規(guī)定系統(tǒng)范圍內(nèi)最大共享內(nèi)存片段。在64和32位的系統(tǒng)上默認值都是4096

七.與容量相關(guān)的文件系統(tǒng)可調(diào)優(yōu)參數(shù):

file-max:列出內(nèi)核分配的文件句柄的最大值

dirty_ratio:規(guī)定百分比值,當臟數(shù)據(jù)達到系統(tǒng)內(nèi)存總數(shù)的這個百分比值后開始執(zhí)行pdflush,默認為20

dirty_background_ratio:規(guī)定百分比值,當某一個進程自己所占用的臟頁比例達到系統(tǒng)內(nèi)存總數(shù)的這個百分比值后開始在后臺執(zhí)行pdflush,默認為10

dirty_expire_centisecs:pdlush每隔百分之一秒的時間開啟起來刷新臟頁,默認值為3000,所以每隔30秒起來開始刷新臟頁

dirty_writeback_centisecs:每隔百分之一秒開始刷新單個臟頁。默認值為500,所以一個臟頁的存在時間達到了5秒,就開始刷新臟

八.linux內(nèi)存常用的觀察指標命令:

Memory activity

vmstat [interval] [count]

sar -r [interval] [count]

Rate of change in memory

sar -R [interval] [count]

frmpg/s:每秒釋放或者分配的內(nèi)存頁,如果為正數(shù),則為釋放的內(nèi)存頁;如果為負數(shù),則為分配的內(nèi)存頁

bufpg/s:每秒buffer中獲得或者釋放的內(nèi)存頁。如果為正數(shù)則為獲得的內(nèi)存頁,為負數(shù)。則為釋放的內(nèi)存頁

campg/s:每秒cache中獲得或者釋放的內(nèi)存頁。如果為正數(shù)則為獲得的內(nèi)存頁,為負數(shù)。則為釋放的內(nèi)存頁

Swap activity

sar -W [interval] [count]

ALL IO

sar -B [interval] [count]

pgpgin/s:每秒從磁盤寫入到內(nèi)核的塊數(shù)量

pgpgout/s:每秒從內(nèi)核寫入到磁盤的塊數(shù)量

fault/s:每秒鐘出現(xiàn)的缺頁異常的個數(shù)

majflt/s:每秒鐘出現(xiàn)的大頁異常的個數(shù)

pgfree/s:每秒回收回來的頁面?zhèn)€數(shù)

Linux buffer/cache回收

Linux2.6以后,使用pdflush kernel thread替代了bdflush,pdflush兩個主要功能:1.dirty pages寫回磁盤,2.超過30S(/proc/sys/vm/dirty_writeback_centisecs)的pages寫回磁盤,防止數(shù)據(jù)丟失

觸動機制:

1.進程或者手工調(diào)用sync().

2.grow_buffers( )分配buffer page失敗

3.free_more_memory() or try_to_free_pages() reclaim失敗

4.mempool_alloc()分配失敗

5.更多場景,當進程dirty pages達到閾值時,/proc/sys/vm/dirty_background_ratio(默認10%),調(diào)用 background_writeout()回收。

pdflush調(diào)用background_writeout(),指定刷新nr_pages。

過程中,當臟頁在/proc/sys/vm/dirty_ratio(默認30%)以下時,停止刷新,如果臟頁比例還在30%以上,往page_cache寫將block。

刷新內(nèi)存范圍包括page cache dirty pages,super block dirty pages,device dirty pages等。

Linux磁盤I/O子系統(tǒng)

上文學到 不管什么文件系統(tǒng)類型,都通過VFS(虛擬文件系統(tǒng)層)讀和寫等操作文件,寫文件的元數(shù)據(jù)和文件的實際數(shù)據(jù)到磁盤 。但數(shù)據(jù)是怎么落地磁盤中的呢?落到磁盤中的都經(jīng)過什么組件?

以一個寫數(shù)據(jù)到磁盤為例,給出Linux I/O子系統(tǒng)的體系結(jié)構(gòu)。

當磁盤執(zhí)行寫入操作時發(fā)生的 基本操作 (假設(shè)磁盤上扇區(qū)中的文件數(shù)據(jù)已經(jīng)被讀取到分頁緩存)。

1) 一個進程通過write()系統(tǒng)調(diào)用 VFS虛擬文件系統(tǒng) 請求寫一個文件。

2) 內(nèi)核更新已映射文件的分頁緩存。

3) 內(nèi)核線程 pdflush/Per-BDI flush將分頁緩存刷新到磁盤。

4) 同時 VFS虛擬文件系統(tǒng)層 在一個bio(block input output)結(jié)構(gòu)中放置每個塊緩沖,并向塊設(shè)備層提交寫請求。

5) 塊設(shè)備層 從上層得到請求,并執(zhí)行一個 I/O電梯操作,將請求放置到I/O 請求隊列。

6) 設(shè)備驅(qū)動器 (比如SCSI 或 其他設(shè)備特定的驅(qū)動器)將執(zhí)行寫操作。

7) 磁盤設(shè)備 固件執(zhí)行硬件操作,如在盤片扇區(qū)上定位磁頭,旋轉(zhuǎn),數(shù)據(jù)傳輸。

過去的20年中,處理器性能的改進要超過計算機系統(tǒng)中的其他組件,如處理器緩存、物理內(nèi)存及磁盤等等。 訪問內(nèi)存和磁盤的速度較慢會限制整個系統(tǒng)的性能 ,怎么解決這個問題呢?引入 磁盤緩存機制 ,在較快的存儲器中緩存頻繁使用的數(shù)據(jù),減少了訪問較慢的存儲器的次數(shù)。

磁盤緩存機制有以下3個地方解決:

引入存儲層次結(jié)構(gòu) ,在CPU和磁盤之間放置L1緩存、L2緩存、物理內(nèi)存和一些其他緩存減少這種不匹配,從而讓進程減少訪問較慢的內(nèi)存和磁盤的次數(shù),避免CPU花費更多的時間等待來自較慢磁盤驅(qū)動器的數(shù)據(jù)。

另外一種解決思路: 在更快的存儲器上實現(xiàn)更高的緩存命中率,就可能更快地訪問數(shù)據(jù) 。怎么提高緩存命中率呢?引入 參考局部性(locality of reference) 的技術(shù)。這項技術(shù)基于以下2個原則:

1) 大多數(shù)最近使用過的數(shù)據(jù),在不久的將來有較高的幾率被再次使用(時間局部性)。

2) 駐留在數(shù)據(jù)附近的數(shù)據(jù)有較高的幾率被再次使用(空間局部性)。

Linux在許多組件中使用這些原則,比如分頁緩存、文件對象緩存(索引節(jié)點緩存、目錄條目緩存等等)、預讀緩沖等。

以進程從磁盤讀取數(shù)據(jù)并將數(shù)據(jù)復制到內(nèi)存的過程為例。進程可以從緩存在內(nèi)存中的數(shù)據(jù)副本中檢索相同的數(shù)據(jù),用于讀和寫。

1) 進程寫入新數(shù)據(jù)

當一個進程試圖改變數(shù)據(jù)時,進程首先在內(nèi)存中改變數(shù)據(jù)。此時磁盤上的數(shù)據(jù)和內(nèi)存中的數(shù)據(jù)是不相同的,并且內(nèi)存中的數(shù)據(jù)被稱為 臟頁(dirty page) 。臟頁中的數(shù)據(jù)應該盡快被同步到磁盤上,因為如果系統(tǒng)突然發(fā)生崩潰(電源故障)則內(nèi)存中的數(shù)據(jù)會丟失。

2) 將內(nèi)存中的數(shù)據(jù)刷新到磁盤

同步臟數(shù)據(jù)緩沖的過程被稱為 刷新 。在Linux 2.6.32內(nèi)核之前(Red Hat Enterprise? Linux 5),通過內(nèi)核線程pdflush將臟頁數(shù)據(jù)刷新到磁盤。在Linux 2.6.32內(nèi)核中(Red Hat Enterprise Linux 6.x)pdflush被Per-BDI flush線程(BDI=Backing Device Interface)取代,Per-BDI flush線程以flush-MAJOR:MINOR的形式出現(xiàn)在進程列表中。當內(nèi)存中臟頁比例超過閥值時,就會發(fā)生刷新(flush)。

塊層處理所有與塊設(shè)備操作相關(guān)的活動。塊層中的關(guān)鍵數(shù)據(jù)結(jié)構(gòu)是bio(block input output)結(jié)構(gòu),bio結(jié)構(gòu)是在虛擬文件系統(tǒng)層和塊層之間的一個接口。

當執(zhí)行寫的時候,虛擬文件系統(tǒng)層試圖寫入由塊緩沖區(qū)構(gòu)成的頁緩存,將連續(xù)的塊放置在一起構(gòu)成bio結(jié)構(gòu),然后將其發(fā)送到塊層。

塊層處理bio請求,并鏈接這些請求進入一個被稱為I/O請求的隊列。這個鏈接的操作被稱為 I/O電梯調(diào)度(I/O elevator)。問個問題:為啥叫電梯調(diào)度呢?

Linux 2.4內(nèi)核使用的是一種單一的通用I/O電梯調(diào)度方法,2.6內(nèi)核提供4種電梯調(diào)度算法供用戶自己選擇。因為Linux操作系統(tǒng)適用的場合很廣泛,所以I/O設(shè)備和工作負載特性都會有明顯的變化。

1)CFQ(Complete Fair Queuing,完全公平隊列)

CFQ電梯調(diào)度為每個進程維護一個I/O隊列,從而 對進程實現(xiàn)一個QoS(服務質(zhì)量)策略 。CFQ電梯調(diào)度能夠很好地適應存在很多競爭進程的大型多用戶系統(tǒng)。它積極地避免進程餓死并具有低延遲特征。從2.6.18內(nèi)核發(fā)行版開始,CFQ電梯調(diào)度成為默認I/O調(diào)度器。

CFQ為每個進程/線程單獨創(chuàng)建一個隊列來管理產(chǎn)生的請求,各隊列之間用時間片來調(diào)度,以保證每個進程都能分配到合適的I/O帶寬。I/O調(diào)度器每次執(zhí)行一個進程的4個請求。

2)Deadline

Deadline是一種循環(huán)的電梯調(diào)度(round? robin)方法,Deadline 算法實現(xiàn)了一個近似于實時的I/O子系統(tǒng)。在保持良好的磁盤吞吐量的同時,Deadline電梯調(diào)度既提供了出色的塊設(shè)備扇區(qū)的順序訪問,又確保一個進程不會在隊列中等待太久導致餓死。

Deadline調(diào)度器為了兼顧這兩個方面,引入了4個隊列,這4個隊列可分為兩類,每一類都由讀和寫兩種隊列組成。一類隊列用來對 請求 按 起始扇區(qū)序號 進行排序(通過紅黑樹來組織),稱為sort_list;另一類對 請求 按 生成時間進行排序 (由鏈表來組織),稱為fifo_list。每當確定了一個傳輸方向(讀或?qū)懀?,系統(tǒng)都將會從相應的sort_list中將一批連續(xù)請求調(diào)度到請求隊列里,具體的數(shù)目由fifo_batch來確定。 只有遇到三種情況才會導致一次批量傳輸?shù)慕Y(jié)束 :1.對應的sort_list中已經(jīng)沒有請求了;2.下一個請求的扇區(qū)不滿足遞增的要求;3.上一個請求已經(jīng)是批量傳輸?shù)淖詈笠粋€請求了。

所有的請求在生成時都會被賦上一個期限值,并且按期限值將它們排序在fifo_list中, 讀請求的期限時長默認為500ms,寫請求的期限時長默認為5s。 在Deadline調(diào)度器定義了一個writes_starved默認值為2,寫請求的饑餓線。 內(nèi)核總是優(yōu)先處理讀請求,當餓死進程的次數(shù)超過了writes_starved后,才會去考慮寫請求 。 為什么內(nèi)核會偏袒讀請求呢? 這是從整體性能上進行考慮的。讀請求和應用程序的關(guān)系是同步的,因為應用程序要等待讀取完畢,方能進行下一步工作所以讀請求會阻塞進程,而寫請求則不一樣。應用程序發(fā)出寫請求后,內(nèi)存的內(nèi)容何時被寫入塊設(shè)備對程序的影響并不大,所以調(diào)度器會優(yōu)先處理讀請求。

3) NOOP

一個簡單的FIFO 隊列,不執(zhí)行任何數(shù)據(jù)排序。NOOP 算法簡單地合并相鄰的數(shù)據(jù)請求,所以增加了少量的到磁盤I/O的處理器開銷。NOOP電梯調(diào)度假設(shè)一個塊設(shè)備擁有它自己的電梯算法。當后臺存儲設(shè)備能重新排序和合并請求,并能更好地了解真實的磁盤布局時,通常選擇NOOP調(diào)度,

4)Anticipatory

Anticipatory本質(zhì)上與Deadline一樣,但Anticipatory電梯調(diào)度在處理最后一個請求之后會等待一段很短的時間,約6ms(可調(diào)整antic_expire改變該值),如果在此期間產(chǎn)生了新的I/O請求,它會在每個6ms中插入新的I/O操作,這樣可以將一些小的I/O請求合并成一個大的I/O請求,從而用I/O延時換取最大的I/O吞吐量。

Linux內(nèi)核使用設(shè)備驅(qū)動程序得到設(shè)備的控制權(quán)。 設(shè)備驅(qū)動程序 通常是一個獨立的內(nèi)核模塊,通常針對每個設(shè)備(或是設(shè)備組)而提供,以便這些設(shè)備在Linux操作系統(tǒng)上可用。一旦加載了設(shè)備驅(qū)動程序,將被當作Linux內(nèi)核的一部分運行,并能控制設(shè)備的運行。

SCSI (Small Computer System Interface,小型計算機系統(tǒng)接口)是最常使用的I/O設(shè)備技術(shù),尤其在企業(yè)級服務器環(huán)境中。SCSI在 Linux 內(nèi)核中實現(xiàn),可通過設(shè)備驅(qū)動模塊來控制SCSI設(shè)備。 SCSI包括以下模塊類型 :

1) Upper IeveI drivers(上層驅(qū)動程序)。 sd_mod、sr_mod(SCSI-CDROM)、st(SCSI Tape)和sq(SCSI通用設(shè)備)等。

2) MiddIe IeveI driver(中層驅(qū)動程序) 。如scsi_mod實現(xiàn)了 SCSI 協(xié)議和通用SCSI功能。

3) Low IeveI drivers(底層驅(qū)動程序) 。提供對每個設(shè)備的較低級別訪問。底層驅(qū)動程序基本上是特定于某一個硬件設(shè)備的,可提供給某個設(shè)備。

4) Pseudo drive(偽驅(qū)動程序) 。如ide-scsi,用于 IDE-SCSI仿真。

通常一個較大的性能影響是文件系統(tǒng)元數(shù)據(jù)怎樣在磁盤上存放 。引入 磁盤條帶陣列 (RAID 0、RAID 5和RAID 6)解決這個問題。在一個條帶陣列上,磁頭在移動到陣列中下一個磁盤之前,單個磁盤上寫入的數(shù)據(jù)稱為 CHUNKSIZE ,所有磁盤使用一次它后返回到第一個磁盤。 如果文件系統(tǒng)的布局沒有匹配RAID的設(shè)計,則有可能會發(fā)生一個文件系統(tǒng)元數(shù)據(jù)塊被分散到2個磁盤上,導致對2個磁盤發(fā)起請求 ?;蛘?將所有的元數(shù)據(jù)在一個單獨的磁盤上存儲,如果該磁盤發(fā)生故障則可能導致該磁盤變成熱點 。

設(shè)計RAID陣列需要考慮以下內(nèi)容:

1) 文件系統(tǒng)使用的塊大小。

2) RAID 陣列使用的CHUNK大小。

3) RAID 陣列中同等磁盤的數(shù)量。

塊大小 指可以讀取/寫入到驅(qū)動器的最小數(shù)據(jù)量,對服務器的性能有直接的影響。塊的大小由文件系統(tǒng)決定,在聯(lián)機狀態(tài)下不能更改,只有重新格式化才能修改??梢允褂玫膲K大小有1024B、2048B、4096B,默認為 4096 B。

stride條帶 是在一個chunk中文件系統(tǒng)塊的數(shù)量。如果文件系統(tǒng)塊大小為4KB,則chunk大小為64KB,那么stride是64KB/4KB=16塊。

stripe-width 是RAID陣列上一個條帶中文件系統(tǒng)塊的數(shù)量。比如 一個3塊磁盤的RAID5陣列 。按照定義,在RAID5陣列每個條帶中有1個磁盤包含奇偶校驗內(nèi)容。想要得到stripe-width,首先需要知道每個條帶中有多少磁盤實際攜帶了數(shù)據(jù)塊,即3磁盤-1校驗磁盤=2數(shù)據(jù)磁盤。2個磁盤中的stride是chunk中文件系統(tǒng)塊的數(shù)量。因此能計算 2(磁盤)*16(stride)=32(stripe)。

創(chuàng)建文件系統(tǒng)時可以使用mkfs給定數(shù)量:mk2fs -t ext4 -b 4096 -E stripe=16,stripe_width=64 /dev/vda

Page Cache

Page Cache是通過將磁盤中的數(shù)據(jù)緩存到內(nèi)存中,減少磁盤I/O操作,從而提高性能。此外,還要確保Page Cache中的數(shù)據(jù)更改能夠同步到磁盤上,這稱之為page回寫(page writeback)。一個inode對應一個page cache對象,一個page cache對象包含多個物理page。

對磁盤的數(shù)據(jù)進行緩存,從而提高性能主要基于兩個因素:一:磁盤訪問速度比內(nèi)存慢幾個數(shù)量級。第二是訪問過的數(shù)據(jù),很大概率再次訪問(局部性原理)。

Page Cache是內(nèi)核管理的內(nèi)存,也就是說,它屬于內(nèi)核,而不屬于用戶。

在Linux上,可以直接查看Page Cache的方式有很多, 包括/proc/meminfo、free 、/proc/vmstat 命令,它們的內(nèi)容實際上是一致的。

以/proc/meminfo命令來說:

其中: Buffers + Cached + SwapCached = Active(file) + Inactive(file) + Shmem + SwapCached

等式兩邊的內(nèi)容就是平時說的Page Cache ,兩邊都有SwapCached,只是為了說明它也是Page Cache的一部分。

在Page Cache中,Active(file) + Inactive(file) 是File-backed page(與文件對應的內(nèi)存頁),是最需要關(guān)注的部分,因為平時用的mmap()內(nèi)存映射方式和buffered I/O來消耗的內(nèi)存就是這部分。

SwapCached是打開了Swap分區(qū)后,把Inactive(anno) + Active(anno)兩項匿名頁交換到磁盤(swap out)之后,然后在讀入到內(nèi)存(swap in)之后分配的內(nèi)存。 由于讀入到內(nèi)存后,原來的Swap File還存在,所以SwapCached也可以認為是File-backed page,屬于Page Cache。 注意:SwapCached只有在Swap分區(qū)打開的請求下才會有,但是Swap過程產(chǎn)生的I/O很容易引起性能抖動,因此,線上環(huán)境Swap分區(qū)一般是關(guān)閉的。

Shmen是指匿名共享映射這種方式分配的內(nèi)存(free 命令中的shared一項)。

當內(nèi)核發(fā)起一個讀請求時,會先檢查請求的數(shù)據(jù)是否緩存到了page cache中,如果有則直接從內(nèi)存中讀取,不需要訪問磁盤。如果cache沒有請求的數(shù)據(jù),就必須從磁盤中讀取數(shù)據(jù),然后內(nèi)核將數(shù)據(jù)緩存到cache中。這樣后續(xù)讀請求就可以命中cache了。page可以只緩存一個文件部分的內(nèi)容,不需要把整個文件都緩存進來。

當內(nèi)核發(fā)起一個寫請求時,同樣直接寫入到cache中。內(nèi)核會將被寫入的page標記為dirty,并將其加入到dirty list中。內(nèi)核會周期性的將dirty list中的page回寫到磁盤上。從而使磁盤上的數(shù)據(jù)和內(nèi)存中緩存的數(shù)據(jù)一致。

Page Cache的產(chǎn)生有兩種不同的方式:

兩種方式產(chǎn)生如下圖:

對于標準I/O的寫,是寫用戶緩沖區(qū),然后再講用戶緩沖區(qū)的數(shù)據(jù)拷貝到內(nèi)核緩沖區(qū)。如果是讀的話,則先從內(nèi)核緩沖區(qū)拷貝到用戶緩沖區(qū),再從用戶緩沖區(qū)中讀數(shù)據(jù)。

對于存儲映射I/O,是直接將Pagecache 的Page 給映射到用戶地址空間,用戶直接讀寫Pagecache Page中的內(nèi)容。

以標準I/O為例,解釋一下,Page Cache如何產(chǎn)生。具體如下圖:

1)往用戶緩沖區(qū)buffer寫入數(shù)據(jù)。然后buffer中的數(shù)據(jù)拷貝到內(nèi)核緩沖區(qū)(Pagecache page)。

2)如果內(nèi)核緩沖區(qū)中沒有這個Page,就會發(fā)生Page Fault,會去分配一個Page。

3)拷貝數(shù)據(jù),該Pagecache Page就是一個Dirty Page(臟頁)。

4)然后Dirty Page的內(nèi)容會同步到磁盤,同步到磁盤后,該Pagecache Page就會變成Clean Page并且繼續(xù)存在系統(tǒng)中。

如果是讀文件產(chǎn)生的PageCache ,它的內(nèi)容和磁盤內(nèi)容一樣,所以它一開始就是Clean Page,除非改寫了里面的內(nèi)容才會變成Dirty Page。

cat /proc/vmstat | egrep "dirty|writeback“

nr_dirty 表示當前系統(tǒng)中積壓了多少臟頁,nr_writeback 則表示有多少臟頁正在回寫到磁盤中,他們兩個的單位都是 Page(4KB)。

先看寫內(nèi)存分配的圖:

可以得出,應用在申請內(nèi)存的時候,即使沒有free內(nèi)存了,只要還有足夠的可回收逇Page Cache,也可以通過回收Page Cache的方式來申請到內(nèi)存,所以,回收的方式主要有兩種: 直接回收和后臺回收。

也就是對應的兩種頁面回收機制:

1)周期性的檢查:后臺運行的守護進程kswapd完成。該進程定期檢查當前系統(tǒng)的內(nèi)存使用情況,發(fā)現(xiàn)系統(tǒng)內(nèi)空閑的物理內(nèi)存數(shù)目少于特定的閾值(參數(shù)是什么?),該進程就會發(fā)起頁面回收的操作。

2)“內(nèi)存嚴重不足”事件觸發(fā):如果需要很大內(nèi)存,而當時系統(tǒng)的內(nèi)存沒有辦法提供足夠多的物理內(nèi)存以滿足內(nèi)存請求。這時,操作系統(tǒng)就必須盡快進行頁面回收,以便釋放一些內(nèi)存空間從而滿足內(nèi)存請求。

可以通過命令sar來觀察內(nèi)存回收行為,也可以通過查看/proc/vmstat里面的指標進行查看。

Linux中的頁面回收是基于LRU(Lease recently used ,最近最少使用)算法。Linux操作系統(tǒng)對LRU的實現(xiàn)是基于一對雙向鏈表,active鏈表和inactive鏈表。經(jīng)常被訪問的處于活躍狀態(tài)的頁面會被放到activre鏈表上,并不經(jīng)常使用的頁面則會放到inactive聊表上。頁面會在兩個雙向鏈表中移動。頁面可能從active鏈表移動到inactive鏈表,反之也有可能。但是移動并不是每次頁面訪問都會發(fā)生(要通過自旋鎖來保證對鏈表并發(fā)訪問操作不會出錯,為了降低鎖競爭,LInux提供了一種特殊的緩存,LRU緩存,用于批量的向LRU鏈表中快速的添加頁面。有了 LRU 緩存之后,新頁不會被馬上添加到相應的鏈表上去,而是先被放到一個緩沖區(qū)中去,當該緩沖區(qū)緩存了足夠多的頁面之后,緩沖區(qū)中的頁面才會被一次性地全部添加到相應的 LRU 鏈表中去),頁面的移動發(fā)生的間隔有可能比較長。對于最近最少使用的頁面會被逐個放到inactive鏈表的尾部。進行頁面回收時,Linux操作系統(tǒng)會從inactive鏈表的尾部開始回收。

而第一次讀取文件后,文件內(nèi)容都是Inactive的,只有再次讀取這些內(nèi)容后,才會把它放到active鏈表上。處于Inactive鏈表上的pagecache在內(nèi)存緊張的時候,是會首先被回收掉。有很多情況下,文件內(nèi)容往往只被讀取一次,它們占用的pagecache需要首先被回收掉;對于業(yè)務數(shù)據(jù),往往都會讀取幾次,那么他們就會被放到active鏈表上,以此來達到保護的目的。

在內(nèi)存緊張的情況下,會進行內(nèi)存回收,回收會把Inactive list的部分page給回收掉。為了維護inactive和active的平衡,就需要把active list的部分page給demote到inactive list,demote的原則也是LRU。

疑問:active list和inactive list的比例是多少?,線上環(huán)境看,這里兩個的比例還是比較大,超過1:2

不是file-backed pages,即為匿名頁(anonymous page),如堆、棧和數(shù)據(jù)段等,不是以文件形式存在,因此無法和磁盤文件交換,但可以通過磁盤上劃分額外的swap分區(qū)或使用swap文件進行交換。

1)水位(watermark)控制

min:如果剩余內(nèi)存減少到觸及這個水位,可認為內(nèi)存嚴重不足,當前進程就會被阻塞,kernel會直接在這個進程的進程上下文做內(nèi)存回收(direct reclaim)。

low:當剩余內(nèi)存慢慢減少,觸及到這個水位,就會觸發(fā)kswapd線程進行內(nèi)存回收。(后臺回收)

high:進行內(nèi)存回收時,內(nèi)存慢慢增加,觸及到這個水位時,就停止回收。

由于每個ZONE是分別管理各自的內(nèi)存的,因此每個ZONE都有這個三個水位。

水位計算:/proc/sys/vm/min_free_kbytes 是一個用戶可配置的值,默認值是min_free_kbytes = 4 * sqrt(lowmem_kbytes)。然后根據(jù)min算出來low和high水位的值:low=5/4min,high=6/4min。(計算不是這里的重點,如果有需要見參考資料7)

1)swapness

回收的時候,會回收file-backed page和 anonymous page ,但是誰回收的多一些,可以通過/proc/sys/vm/swapness來控制誰回收多一些。swapness的值越大,越傾向于回收匿名頁。值越小,越傾向于稅后file-backed的頁面?;厥辗椒ǘ际荓RU算法。

Page cache畢竟是為了提高性能占用的物理內(nèi)存,隨著越來越多的磁盤數(shù)據(jù)被緩存到內(nèi)存中,Page Cache也變得越來越大,如果一些重要的任務需要被Page cache占用的內(nèi)存,內(nèi)核將回收page cache以此來支持。

1)空間層面

當系統(tǒng)的“dirty”的內(nèi)存大于某個閾值,該閾值是在總共的“可用內(nèi)存”(包括free pages 和reclaimable pages)中的占比。

參數(shù)“dirty_background_ratio”(默認值10%),或者是絕對字節(jié)數(shù)“dirty_background_bytes”(默認值為0,表示生效)。兩個參數(shù)只要誰先達到即可執(zhí)行,此時就會交給專門負責writeback的background線程去處理。

參數(shù)“dirty_ratio”(默認值30%)和“dirty_bates”(默認值為0,表示生效),當“dirty”的內(nèi)存達到這個比例或數(shù)量,進程則會停下write操作(被阻塞),先把“dirty”進行writeback。

2)時間層面

周期性的掃描,掃描間隔用參數(shù):dirty_writeback_interval表示,以毫秒為單位。發(fā)現(xiàn)存在最近一次更新時間超過某個閾值(參數(shù):dirty_expire_interval,單位毫秒)的pages。如果每個page都維護最近更新時間,開銷會很大且掃描會很耗時,因此具體實現(xiàn)不會以page為粒度,而是按inode中記錄的dirtying-time來計算。

3)用戶主動發(fā)起。

調(diào)用sync()/msync()/fsync()。

參數(shù)設(shè)置可以在:/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內(nèi)核,用一個叫bdflush的線程專門負責writeback操作。因為磁盤I/O操作很慢,而線程操作系統(tǒng)有多個塊設(shè)備,如果bdflush在其中一個塊設(shè)備上等待I/O操作的完成,可能會需要很長的時間,此時單線程模式的bdfoush就會成為影響性能的瓶頸。而且bdflush沒有周期掃描功能。

在2.6內(nèi)核中,bdflush和kupdated一起被pdflush(page dirty flush)取代了。pdflush是一組線程,根據(jù)塊設(shè)備的I/O負載情況,數(shù)量從最少2個到最多8個不等。如果1秒內(nèi)沒有空閑的pdflush線程,則會創(chuàng)建一個;如果pdflush線程的空閑時間超過1秒,則會被銷毀。一個塊設(shè)備可能有多個可以傳輸數(shù)據(jù)的隊列,為了避免在隊列上的擁塞(congestion),pdflush線程會動態(tài)的選擇系統(tǒng)中相對空閑的隊列。

在2.6.32版本上,直接一個塊設(shè)備對應一個thread(算法效果不明顯),這種內(nèi)核線程被稱為flusher threads。

無論是內(nèi)核周期性的掃描,還是用戶手動觸發(fā),flusher threads的write back都是間隔一段時間才進行的。如果這段時間內(nèi)系統(tǒng)掉電了,那么還沒有來得及write back的數(shù)據(jù)修改就面臨丟失的風險,算是page cache機制存在的一個缺點。

free命令中,存在buff/cache的內(nèi)容,如下。但是不太好區(qū)分。

通過man free查看指標含義,可以看到buffer和cache的區(qū)別。

通過man proc,可以得到proc文件系統(tǒng)的詳細文檔,其中就包括了/proc/meminfo的信息

通過這個文檔,可以得到:

實際上,寫文件時會用到Cache緩存數(shù)據(jù)(雖然文檔上,Cache值提到是文件的讀緩存),寫磁盤則會用到Bufffer來緩存數(shù)據(jù)。

讀文件時,數(shù)據(jù)會緩存到Cache中。而讀磁盤時數(shù)據(jù)會緩存到Buffer中。

綜上:

0)Linux中的內(nèi)存回收[一]

1) Linux中的Page Cache [二]

2)Linux內(nèi)核中的頁面回收算法

3)Linux內(nèi)存回收機制

4)Linux 內(nèi)核源碼分析-Page Cache 刷臟源碼分析

5)Page Cache與Page回寫

6)極客時間 《LInux內(nèi)核技術(shù)實戰(zhàn)課》

7)內(nèi)存管理參數(shù)min_free_kbytes 分析

文章名稱:linux刷臟頁命令 linux如何刷新磁盤空間
文章轉(zhuǎn)載:http://muchs.cn/article24/dophjce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計企業(yè)網(wǎng)站制作、面包屑導航、小程序開發(fā)、App開發(fā)、搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護公司