Linux 內存機制

轉載鏈接:http://blog.csdn.net/tianlesoftware/article/details/5463790


. 內存使用說明

Free 命令相對于top 提供了更簡潔的查看系統內存使用情況:

[root@rac1 ~]# free?

???????????? total?????? used?????? free???? shared??? buffers???? cached

Mem:?????? 1035108? ?1008984? ????26124????? 0???? 124212???? 413000

-/+ buffers/cache:??? ????471772??? ??563336

Swap:???? ??2096472?? 842320? ???1254152

?

這里顯示的單位是KB

?

?????? 在linux的內存分配機制中,優先使用物理內存,當物理內存還有空閑時(還夠用),不會釋放其占用內存,就算占用內存的程序已經被關閉了,該程序所占用的內存用來做緩存使用,對于開啟過的程序、或是讀取剛存取過得數據會比較快。

?

Mem:表示物理內存統計。
-/+ buffers/cached:表示物理內存的緩存統計
Swap:表示硬盤上交換分區的使用情況。只有mem被當前進程實際占用完,即沒有了buffers和cache時,才會使用到swap。

?

Mem 行(第一行)數據說明:

?????? Total:1035108KB。表示物理內存總大小。

?????? Used:1008984KB。表示總計分配給緩存(包含buffers 與cache )使用的數量,但其中可能部分緩存并未實際使用。

?????? Free:26124KB。表示未被分配的內存。

?????? Shared:0kb。共享內存,一般系統不會用到。

?????? Buffers:124212KB。系統分配但未被使用的buffers 數量。

?????? Cached:413000KB。系統分配但未被使用的cache 數量。

?

-/+ buffers/cache 行(第二行)數據說明:

?????? Used:471772kb,實際使用的buffers 與cache 總量,也是實際使用的內存總量。

?????? Free: 563336kb, 未被使用的buffers 與cache 和未被分配的內存之和,這就是系統當前實際可用內存。

?

根據以上分析,可以得出一下結論:

1.? 實際可用內存大小:

?????? Free(-/+ buffers/cache行)= Free(Mem)+buffers(Mem)+Cached(Mem);

?????? ??????????????????????????? 563336 = 26124 + 124212+ 413000

?

2.? 已經分配的內存大小:

?????? Used(Mem) = Used(-/+ buffers/cache)+ buffers(Mem) + Cached(Mem)

?????? ?????? 1008984kb = 471772 + 124212 +413000

?

3.? 物理內存總大小

?????? total(Mem) = used(-/+ buffers/cache) + free(-/+ buffers/cache)

???????????????????? 1035108 = 471772 + 563336

?

?

二. Swap配置對性能的影響

?????? 分配太多的Swap空間會浪費磁盤空間,而Swap空間太少,則系統會發生錯誤。 如果系統的物理內存用光了,系統就會跑得很慢,但仍能運行;如果Swap空間用光了,那么系統就會發生錯誤。例如,Web服務器能根據不同的請求數量衍生出多個服務進程(或線程),如果Swap空間用完,則服務進程無法啟動,通常會出現“application is out of memory”的錯誤,嚴重時會造成服務進程的死鎖。因此Swap空間的分配是很重要的。


?????? 通常情況下,Swap空間應大于或等于物理內存的大小,最小不應小于64M,通常Swap空間的大小應是物理內存的2-2.5倍。但根據不同的應用,應有不同的配置:如果是小的桌面系統,則只需要較小的Swap空間,而大的服務器系統則視情況不同需要不同大小的Swap空間。特別是數據庫服務器和Web服務器,隨著訪問量的增加,對Swap空間的要求也會增加,一般來說對于4G以下的物理內存,配置2倍的swap4G以上配置1倍。

另外,Swap分區的數量對性能也有很大的影響。因為Swap交換的操作是磁盤IO的操作,如果有多個Swap交換區,Swap空間的分配會以輪流的方式操作于所有的Swap,這樣會大大均衡IO的負載,加快Swap交換的速度。如果只有一個交換區,所有的交換操作會使交換區變得很忙,使系統大多數時間處于等待狀態,效率很低。用性能監視工具就會發現,此時的CPU并不很忙,而系統卻慢。這說明,瓶頸在IO上,依靠提高CPU的速度是解決不了問題的。

?

.? Linux 內存機制

Linux支持虛擬內存(Virtual Mmemory),虛擬內存是指使用磁盤當作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)。

緩存(Cache)實際并不是緩沖文件的,而是緩沖塊的,塊是磁盤I/O操作的最小單元(在Linux中,它們通常是1KB)。這樣,目錄、超級塊、其它文件系統的薄記數據以及非文件系統的磁盤數據都可以被緩沖了。緩沖的效力主要是由它的大小決定的。緩沖太小的話等于沒用。它只能容納一點數據,因此在被重用時,所有緩沖的數據都將被傾空。實際的大小依賴于數據讀寫的頻次、相同數據被訪問的頻率。只有用實驗的方法才能知道。
?????? 如果緩存有固定的大小,那么緩存太大了也不好,因為這會使得空閑的內存太小而導致進行交換操作(這同樣是慢的)。為了最有效地使用實際內存,Linux自動地使用所有空閑的內存作為高速緩沖,當程序需要更多的內存時,它也會自動地減小緩沖的大小。


?????? 這就是一般情況下Linux內存的一般機制,真正的Linux內存的運行機制遠遠比這個復雜。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/news/276507.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276507.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276507.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

network中的請求信息,headers中的每一項分別是什么意義?

這里是修真院前端小課堂,每篇分享文從 【背景介紹】【知識剖析】【常見問題】【解決方案】【編碼實戰】【擴展思考】【更多討論】【參考文獻】 八個方面深度解析前端知識/技能,本篇分享的是: 【network中的請求信息,headers中的每…

學習 sentry 源碼整體架構,打造屬于自己的前端異常監控SDK

前言這是學習源碼整體架構第四篇。整體架構這詞語好像有點大,姑且就算是源碼整體結構吧,主要就是學習是代碼整體結構,不深究其他不是主線的具體函數的實現。文章學習的是打包整合后的代碼,不是實際倉庫中的拆分的代碼。其余三篇分…

巴西龜吃什么

1、活蝦,哈哈,巴西龜最喜歡的食物,超市很多雞尾蝦買的,就那種,要活的,鍛煉它們的天性,一次一只可以吃一、兩天; 2、蚶子,貝殼類,活的,整個扔進去&…

綁定dictionary 給定關鍵字不再字典中_VBA代碼集錦-利用字典做兩列數據的對比并對齊...

源數據:代碼:Sub 對比()Dim arr, brr, crrDim i, j, n, lastrowA, lastrowB As Integer建立字典對象Set d CreateObject("scripting.dictionary")獲取數據區域最后一行的行數lastrowA Sheets("對比對齊兩列數據").Cells(Rows.Coun…

linux啟動時掛載rootfs的幾種方式 .

轉載鏈接:http://blog.csdn.net/zuokong/article/details/9022707 根文件系統(在樣例錯誤消息中名為 rootfs)是 Linux 的最基本的組件。根文件系統包含支持完整的 Linux 系統所需的所有內容。它包含所有應用程序、配置、設備、數據等 Linux 中…

PHP 手冊

by:Mehdi AchourFriedhelm BetzAntony DovgalNuno LopesHannes MagnussonGeorg RichterDamien SeguyJakub Vrana其他貢獻者2018-06-19Edited By: Peter Cowburn中文翻譯人員:肖盛文洪建家穆少磊宋琪黃嘯宇王遠之肖理達喬楚戴劼褚兆瑋周夢康袁玉強段小強© 1997-…

前端使用puppeteer 爬蟲生成《React.js 小書》PDF并合并

前端也可以爬蟲,寫于2018年08月29日,現在發布到微信公眾號申明原創。掘金若川 本文章鏈接:https://juejin.im/post/5b86732451882542af1c80821、 puppeteer 是什么?puppeteer: Google 官方出品的 headless Chrome node 庫puppetee…

蜘蛛與佛的故事

最近閉關,空面四壁,窗外層巒疊嶂,窗臺上只有一盆花每日陪著我,朋友們都說我要成佛了,想想也是! 于是在閉關即將結束的時候找了一篇佛的故事送給自己,希望自己能夠頓悟一些"禪"機。 從前,有一座圓音寺,每天都…

信息安全管理與評估_計算機工程學院教師參加“信息安全管理與評估賽項”說明會...

看了就要關注我,喵嗚~2019年3月15日下午,2019年陜西省高等職業院校技能大賽“信息安全管理與評估賽項說明會”在咸陽職業技術學院舉行。出席本次會儀的有咸陽職業技術學院教務處長楊新宇、神州數碼范永強經理、神州數碼信息安全工程師高峰和各院校指導教…

haproxy概念和負載均衡

https://pan.baidu.com/s/1Sq2aJ35zrW2Xn7Th9j7oOA //軟件百度網盤連接 在80.100虛擬機上 systemctl stop firewalld //關閉防火墻 setenforce 0 //關閉監控 yum install lrz* -y //安裝上傳軟件 tar xf haproxy-1.5.15.tar.gz -C /opt/ //解壓壓縮包到/opt/ cd /op…

PHP用戶注冊郵箱驗證激活帳號

轉載鏈接:http://www.helloweba.com/view-blog-228.html 本文將結合實例,講解如何使用PHPMysql完成注冊帳號、發送激活郵件、驗證激活帳號、處理URL鏈接過期的功能。 業務流程 1、用戶提交注冊信息。 2、寫入數據庫,此時帳號狀態未激活。 …

知乎問答:一年內的前端看不懂前端框架源碼怎么辦?

知乎問答:一年內的前端看不懂前端框架源碼怎么辦?以下是我的回答,閱讀量 1000。現在轉載到微信公眾號中。鏈接:https://www.zhihu.com/question/350289336/answer/910970733其他回答的已經很好了。剛好最近在寫學習源碼整體架構系…

幫自己發個求職簡歷

幫自己發個求職簡歷 發個求職信息。本人擅長Web開發,尤其擅長Flex,愿從事Web開發,最好是Web前端開發,下面是我的詳細個人簡歷: 個人信息: 姓名:伍國耀 年齡:23 性別:男 專…

python函數 global_**Python的函數參數傳遞 和 global

函數的參數到底是傳遞的一份復制的值,還是對內存的引用?我們看下面一段代碼:a []def fun(x):x.append(1)fun(a)print(a)想想一下:如果傳遞的是一份復制的值,那么列表a應該是不會變化的,還是空列表&#xf…

冷啟動問題:如何構建你的機器學習組合?

作為即將告別大學的機器學習畢業狗的你,會不會有種迷茫的感覺?你知道 HR 最看重的是什么嗎?在求職季到來之前,畢業狗要怎么做,才能受到 HR 的青睞、拿到心儀的 Offer 呢?負責幫助應屆生找到機器學習工作的 …

JavaScript 對象所有API解析【2020版】

寫于 2017年08月20日,雖然是2017年寫的文章,但現在即將2020年依舊不過時,現在補充了2019年新增的ES10 Object.fromEntries()。發到公眾號申明原創。若川順便在此提前祝大家:2020年更上一層樓。近日發現有挺多人對對象基礎API不熟悉…

javascript操作符之new 也瘋狂 (2)

JavaScript本是一種基于原形的(prototypal)語言,但它的“new”操作符看起來有點像經典語言。這迷惑了廣大程序員們,并導致了很多使用上的問題。 在JavaScript中,不要用到new Object()這種操作,該用{ }來代替…

python中if語句缺省else_9_【Python學習分享文章】_if(條件語句)

【Python學習分享文章】_if(條件語句)_logicalJudgement介紹及基本操作綜述計算機的“條件語句”和生活中的“條件成立”是不一樣的。一個生活中的例子如果被計算機執行則是如下段子:老婆讓程序員老公去買蘋果,說:“去水果店買5個蘋果&#x…

PHP生成各種驗證碼和Ajax驗證

轉載鏈接:http://www.helloweba.com/view-blog-191.html 驗證碼在WEB應用中非常重要,通常用來防止用戶惡意提交表單,如惡意注冊和登錄、論壇惡意灌水等。本文將通過實例講解使用PHP生成各種常見的驗證碼包括數字驗證碼、數字字母驗證碼、中文…

若川的2019年度總結,波瀾不驚

從2014年開始寫年度總結至今已經六個年頭了。正如孔子所說:逝者如斯夫,不舍晝夜。2019年的年度總結寫得比較晚,都快農歷新年了,此刻在家里繼續寫完這篇文章。往年基本是元旦之后幾天就寫完了。我的年度總結盡量寫得非技術人員也能…