1. 程式人生 > >調整linux核心儘量用記憶體,而不用swap

調整linux核心儘量用記憶體,而不用swap

.  Linux 記憶體機制
Linux
支援虛擬記憶體(VirtualMmemory),虛擬記憶體是指使用磁碟當作RAM的擴充套件,這樣可用的記憶體的大小就相應地增大了。核心會將暫時不用的記憶體塊的內容寫到硬碟上,這樣一來,這塊記憶體就可用於其它目的。當需要用到原始的內容時,它們被重新讀入記憶體。這些操作對使用者來說是完全透明的;Linux下執行的程式只是看到有大量的記憶體可供使用而並沒有注意到時不時它們的一部分是駐留在硬碟上的。當然,讀寫硬碟要比直接使用真實記憶體慢得多(要慢數千倍),所以程式就不會象一直在記憶體中執行的那樣快。用作虛擬記憶體的硬碟部分被稱為交換空間(Swap Space)
一般,在交換空間中的頁面首先被換入記憶體;如果此時沒有足夠的實體記憶體來容納它們又將被交換出來(到其他的交換空間中)。如果沒有足夠的虛擬記憶體來容納所有這些頁面,Linux就會波動而不正常;但經過一段較長的時間Linux會恢復,但此時系統已不可用了。有時,儘管有許多的空閒記憶體,仍然會有許多的交換空間正被使用。這種情況是有可能發生的,例如如果在某一時刻有進行交換的必要,但後來一個佔用很多實體記憶體的大程序結束並釋放記憶體時。被交換出的資料並不會自動地交換進記憶體,除非有這個需要時。此時實體記憶體會在一段時間內保持空閒狀態。對此並沒有什麼可擔心的,但是知道了是怎麼一回事,也就無所謂了。許多作業系統使用了虛擬記憶體的方法。因為它們僅在執行時才需要交換空間,以解決不會在同一時間使用交換空間,因此,除了當前正在執行的作業系統的交換空間,其它的就是一種浪費。所以讓它們共享一個交換空間將會更有效率。
注意:如果會有幾個人同時使用這個系統,他們都將消耗記憶體。然而,如果兩個人同時執行一個程式,記憶體消耗的總量並不是翻倍,因為內碼表以及共享的庫只存在一份。

Linux
系統常常動不動就使用交換空間,以保持儘可能多的空閒實體記憶體。即使並沒有什麼事情需要記憶體,Linux也會交換出暫時不用的記憶體頁面。這可以避免等待交換所需的時間:當磁碟閒著,就可以提前做好交換。可以將交換空間分散在幾個硬碟之上。針對相關磁碟的速度以及對磁碟的訪問模式,這樣做可以提高效能。與訪問實體記憶體相比,磁碟的讀寫是很慢的。另外,在相應較短的時間內多次讀磁碟同樣的部分也是常有的事。例如,某人也許首先閱讀了一段E-mail訊息,然後為了答覆又將這段訊息讀入編輯器中,然後又在將這個訊息拷貝到資料夾中時,使得郵件程式又一次讀入它。或者考慮一下在一個有著許多使用者的系統中
 ls命令會被使用多少次。通過將資訊從磁碟上僅讀入一次並將其存於記憶體中,除了第一次讀以外,可以加快所有其它讀的速度。這叫作磁碟緩衝(Disk Buffering),被用作此目的的記憶體稱為高速緩衝(Buffer Cache)。但是,由於記憶體是一種有限而又不充足的資源,高速緩衝不可能做的很大(它不可能包容要用到的所有資料)。當緩衝充滿了資料時,其中最長時間不用的資料將被捨棄以騰出記憶體空間用於新的資料。對寫磁碟操作來說磁碟緩衝技術同樣有效。一方面,被寫入磁碟的資料常常會很快地又被讀出(例如,原始碼檔案被儲存到一個檔案中,又被編譯器讀入),所以將要被寫的資料放入緩衝中是個好主意。另一方面,通過將資料放入緩衝中,而不是將其立刻寫入磁碟,程式可以加快執行的速度。以後,寫的操作可以在後臺完成,而不會拖延程式的執行。大多數作業系統都有高速緩衝(儘管可能稱呼不同),但是並不是都遵守上面的原理。有些是直接寫(Write-Through):資料將被立刻寫入磁碟(當然,資料也被放入快取中)。如果寫操作是在以後做的,那麼該快取被稱為後臺寫(Write-Back)。後臺寫比直接寫更有效,但也容易出錯:如果機器崩潰,或者突然掉電,緩衝中改變過的資料就被丟失了。如果仍未被寫入的資料含有重要的薄記資訊,這甚至可能意味著檔案系統(如果有的話)已不完整。針對以上的原因,出現了很多的日誌檔案系統,資料在緩衝區修改後,同時會被檔案系統記錄修改資訊,這樣即使此時系統掉電,系統重啟後會首先從日誌記錄中恢復資料,保證資料不丟失。當然這些問題不再本文的敘述範圍。由於上述原因,在使用適當的關閉過程之前,絕對不要關掉電源,Sync命令傾空(Flushes)緩衝,也即,強迫所有未被寫的資料寫入磁碟,可用以確定所有的寫操作都已完成。在傳統的UNIX系統中,有一個叫做update的程式運行於後臺,每隔30秒做一次sync操作,因此通常無需手工使用sync命令了。Linux另外有一個後臺程式,Bdflush,這個程式執行更頻繁的但不是全面的同步操作,以避免有時sync的大量磁碟I/O操作所帶來的磁碟的突然凍結。Linux中,Bdflush是由update啟動的。通常沒有理由來擔心此事,但如果由於某些原因bdflush程序死掉了,核心會對此作出警告,此時你就要手工地啟動它了(/sbin/update)

相關推薦

調整linux核心儘量記憶體不用swap

三.  Linux 記憶體機制 Linux支援虛擬記憶體(VirtualMmemory),虛擬記憶體是指使用磁碟當作RAM的擴充套件,這樣可用的記憶體的大小就相應地增大了。核心會將暫時不用的記憶體塊的內容寫到硬碟上,這樣一來,這塊記憶體就可用於其它目的。當需要用到原始的內容時,它們被重新讀入記憶體。這些操作對

揭祕!為何要_beginthreadex不用CreateThread和_beginthread

       由於歷史原因,所以C/C++執行庫並不是為多執行緒應用程式而設計的,所以為了保證其中的某些變數和函式的安全,那麼必須建立一個數據結構,並使之與使用了C/C++執行庫函式的每個執行緒所關聯。當在呼叫C/C++執行庫函式時,那些函式必須讀取主調自己的執行緒的資料塊,

20121022 sysctl調整linux核心選項

需求:在我們的dlna程式執行期間,發現有丟包的現象,有的NOTIFY包丟失,有的M-SEARCH包丟失。更極端的是,有次使用電信msm7627a手機,通過抓包,在出現了3此NOTIFY之後,M-SEARCH一直都沒有出現。而通常情況下,兩個廣播包在開始是交替出現的。這樣,就導致這款只能傳送廣播不能接收廣播的

如何能低成本地快速獲取大量目標不是與競爭對手持久戰?

教育 pro 概念 top 出貨量 行為 擴展 利用 大數據 本文來自網易雲社區。如何能低成本地快速獲取大量目標用戶,而不是與競爭對手持久戰?這在如今的互聯網上並不常見。現在,大部分行業都已經是競爭多時的紅海,而藍海市場的技術、資源壁壘非常之高,一般產品望塵莫及。在競爭激烈

如何調整Linux核心啟動中的驅動初始化順序-驅動載入優先順序

轉載自:http://zhidao.baidu.com/link?url=adCsiTiI7i3QVYrTx19jkt_FvBV2VlQ4NV18pEu6Kdi4Yhv0ryauD3LHj1pxGE-YP8M_PxZnHNy-hVKBvzJOkPfqehZmR9CQm5GZ5XZDx-O Lin

Symantec NetBackup 部署需要調整Linux核心詳解

ipcs 和 ipcrm 命令 ipcs -a  是預設的輸出資訊 打印出當前系統中所有的程序間通訊方式的資訊 ipcs -m  打印出使用共享記憶體進行程序間通訊的資訊 ipcs -q   打印出使用訊息佇列進行程序間通訊的資訊 ipcs -

方差為什麼平方不是絕對值?

問題一:如果要從甲、乙兩名選手中選拔一名參加射擊比賽?你將設計什麼方案? S:總分高的。 T:若有一名選手射擊5次,總分30;而另一名選手射擊10次,總分50分,你又會選擇誰? S:看來還是算平均分合適。 問題二:你選擇誰? 甲:3、5、6、7、9 乙:4、5、6、7、8 從資

c++程式設計習慣一(儘量constenum,inline替換巨集)

在c語言中,我們經常用到巨集定義,但是我們使用時並沒有考慮太多的因素。 其實巨集定義有時候不能被視為程式的一部分,當在使用 #define PI 3.14 時,其實編譯器是看不到的,巨集定義只會被前處理器看到, 什麼意思呢,在編譯器開始處理原始碼之前,巨集可能就已經被前處

C++ win32和linux獲取系統剩餘記憶體

1使用的是qt ,可以更加自己需要的修改 linux 端使用 cat /proc/meminfo 可以看到 linux通過fget和sscanf讀取一行,獲得我們想要的MemAvaiable 2win32使用MEMORYSTATUSEX和GloablMemoryStatusEx讀取,需要標

快排和歸併排序的複雜度相同為什麼都快排不用歸排?

快排和歸排的複雜度都是O(n*log n),為什麼都用快排而不用歸排? 看了《演算法圖解》之後,大致理解了是什麼原因,真正的原因是:不可描述的常量導致使用快排而不是歸排。 好了,真正的解釋是這樣的: 演算法的每一步實際上都需要一個固定時間量,被稱為常量。我們平時考慮時間複雜度的時候並

編輯linux核心與bosybox 時make menuconfig 出現錯誤

  *** Unable to find the ncurses libraries or the *** required header files. *** 'make menuconfig' requires the ncurses li

Linux 核心 Nftables 替代 iptables

新的防火牆子系統/包過濾引擎 Nftables 將在 Linux 3.13 中替代有十多年曆史的iptables。iptables/netfilter在2001年加入到2.4核心中。誕生於2008年的 NFTables

Linux核心開發之記憶體與I/O訪問(三)

staticint xxx_mmp(struct file *filp, struct vm_area_struct *vma) { if(remap_pfn_range(vma, vma->vm_start, vm->vm_pgoff, vma->vm_end - vma->

如何確定Linux核心原始碼目錄即$KBUILD的路徑

方法一:確定核心原始碼目錄通常==檔案系統中核心驅動模組的build路徑即/lib/modules/2.6.25-14.fc9.i686/build,這個build通常為連結檔案,連線到/usr/src/kernels/2.6.25-14.fc9.i686此方法較準確,通常

Linux核心模組程式設計——helloworld

檔案hello.c(放在目錄/root/lnq/modules/hello下): #include<linux/kernel.h> #include<linux/module.h

如何使32位Win7支援超過4GB的記憶體不裝64位

如何使32位Win7支援超過4GB的記憶體 讓32位系統支援更大的記憶體超過4G 【情況引數:】 PC: 聯想商用桌上型電腦,M4350RAM: 1600, DDR3 , 2GBOS: Win7 專業版 32位 【情況描述:】 買了一根8GB金士頓記憶體條,裝上發現原來3

Linux 核心解讀之記憶體管理----memory.c

轉載請註明原文出處http://blog.csdn.net/lizhiliang06/article/details/8655115 80x86體系結構中,Linux核心的記憶體管理程式使用分頁管理方式。利用頁目錄和頁表結構處理核心中其他部分程式碼對記憶體申請和釋放操作。M

Linux核心原始碼分析--記憶體管理(一、分頁機制)

        Linux系統中分為幾大模組:程序排程、記憶體管理、程序通訊、檔案系統、網路模組;各個模組之間都有一定的聯絡,就像蜘蛛網一樣,所以這也是為什麼Linux核心那麼難理解,因為不知道從哪裡開始著手去學習。很多人會跟著系統上電啟動 BIOS-->bootse

關於面向物件程式設計中很多人get()和set()方法不用public的一點總結

在很多程式中,都喜歡定義一個privata變數,然後為這個私有變數加上get(),set()方法。那為什麼不直接定義一個public變數呢?這樣做到底有什麼好處和意義呢?難道真的僅僅只是為了程式碼規範?別逗了,不管你信不信,反正我是不信!帶著這個問題我在網上尋找答案,真是眾

Linux核心開發之記憶體與I/O訪問(四)

// 核心模組載入函式int __init kmalloc_map_init(void) { ../申請裝置號,新增cedv結構體 buffer = kmalloc(BUF_SIZE, GFP_KERNEL); //申請bufferfor(page = virt_to_page(buffer);