redhat 6 記憶體說明:
如下顯示free是顯示的目前記憶體的使用,-m的意思是M位元組來顯示内容.我們來一起看看.
$ free -m
total used free shared buffers cached
Mem: 1002 769 232 0 62 421
-/+ buffers/cache: 286 715
Swap: 1153 0 1153
<code></code>
第一部分Mem行:
total 記憶體總數: 1002M
used 已經使用的記憶體數: 769M
free 空閑的記憶體數: 232M
shared 目前已經廢棄不用,總是0
buffers Buffer 緩存記憶體數: 62M
cached Page 緩存記憶體數:421M
關系:total(1002M) = used(769M) + free(232M)
第二部分(-/+ buffers/cache):
(-buffers/cache) used記憶體數:286M (指的第一部分Mem行中的used – buffers – cached)
(+buffers/cache) free記憶體數: 715M (指的第一部分Mem行中的free + buffers + cached)
可見-buffers/cache反映的是被程式實實在在吃掉的記憶體,而+buffers/cache反映的是可以挪用的記憶體總數.
第三部分是指交換分區, 我想不講大家都明白.
我想大家看了上面,還是很暈.第一部分(Mem)與第二部分(-/+ buffers/cache)的結果中有關used和free為什麼這麼奇怪.
其實我們可以從二個方面來解釋.
對作業系統來講是Mem的參數.buffers/cached 都是屬于被使用,是以它認為free隻有232.
對應用程式來講是(-/+ buffers/cach).buffers/cached 是等同可用的,因為buffer/cached是為了提高程式執行的性能,當程式使用記憶體時,buffer/cached會很快地被使用.
是以,以應用來看看,以(-/+
buffers/cache)的free和used為主.是以我們看這個就好了.另外告訴大家一些常識.Linux為了提高磁盤和記憶體存取效率,
Linux做了很多精心的設計, 除了對dentry進行緩存(用于VFS,加速檔案路徑名到inode的轉換),
還采取了兩種主要Cache方式:Buffer Cache和Page
Cache.前者針對磁盤塊的讀寫,後者針對檔案inode的讀寫.這些Cache能有效縮短了
I/O系統調用(比如read,write,getdents)的時間.
記住記憶體是拿來用的,不是拿來看的.不象windows,無論你的真實實體記憶體有多少,他都要拿硬碟交換檔案來讀.這也就是windows為什麼常常提示虛拟空間不足的原因.你們想想,多無聊,在記憶體還有大部分的時候,拿出一部分硬碟空間來充當記憶體.硬碟怎麼會快過記憶體.是以我們看linux,隻要不用swap的交換空間,就不用擔心自己的記憶體太少.如果常常swap用很多,可能你就要考慮加實體記憶體了.這也是linux看記憶體是否夠用的标準哦.
redhat 7 記憶體說明:
CentOS7及以後free指令的輸出如下:
# free -m
total used free shared buff/cache available
Mem: 3440 213 2276 168 950 2778
Swap: 0 0 0
buffer和cached被合成一組,加入了一個available,關于此available,文檔上的說明如下:
MemAvailable: An estimate of how much memory is available for starting new applications, without swapping.
即系統可用記憶體,之前說過由于buffer和cache可以在需要時被釋放回收,系統可用記憶體即 free + buffer + cache,在CentOS7之後這種說法并不準确,因為并不是所有的buffer/cache空間都可以被回收。
即available = free + buffer/cache - 不可被回收記憶體(共享記憶體段、tmpfs、ramfs等)。
是以在CentOS7之後,使用者不需要去計算buffer/cache,直接看available 即可以看到還有多少記憶體可用,更加簡單直覺。
下面是詳細說明:
total:去掉為硬體和作業系統保留的記憶體後剩餘的記憶體總量。有人奇怪×××安裝了一共4G的記憶體,但是顯示總共隻有七點幾G的, 不管Linux還是Windows都會有部分記憶體是保留給硬體和作業系統的!
userd:目前已使用的記憶體總量。
free:空閑的或可以使用的記憶體總量
shared:共享記憶體大小,主要用于程序間通信
buff(buffers):主要用于塊裝置資料緩沖,例如記錄檔案系統的metadata(目錄、權限等等資訊)。
cache:主要用于檔案内容緩沖
available:可以使用的記憶體總量
關于free的實作,其實是調用linux下的 # /proc/meminfo檔案,由于系統在高速的運轉,可能存在部分資料不相同
推薦指令:
# free -mlth
Swap交換分區概念
什麼是Linux swap space呢?我們先來看看下面兩段關于Linux swap space的英文介紹資料:
Linux divides its physical RAM (random access memory) into chucks of memory called pages. Swapping is the process whereby a page of memory is copied to the preconfigured space on the hard disk, called swap space, to free up that page of memory. The combined sizes of the physical memory and the swap space is the amount of virtual memory available.
Swap space in Linux is used when the amount of physical memory (RAM) is full. If the system needs more memory resources and the RAM is full, inactive pages in memory are moved to the swap space. While swap space can help machines with a small amount of RAM, it should not be considered a replacement for more RAM. Swap space is located on hard drives, which have a slower access time than physical memory.Swap space can be a dedicated swap partition (recommended), a swap file, or a combination of swap partitions and swap files.
Linux核心為了提高讀寫效率與速度,會将檔案在記憶體中進行緩存,這部分記憶體就是Cache Memory(緩存記憶體)。即使你的程式運作結束後,Cache Memory也不會自動釋放。這就會導緻你在Linux系統中程式頻繁讀寫檔案後,你會發現可用實體記憶體變少。當系統的實體記憶體不夠用的時候,就需要将實體記憶體中的一部分空間釋放出來,以供目前運作的程式使用。那些被釋放的空間可能來自一些很長時間沒有什麼操作的程式,這些被釋放的空間被臨時儲存到Swap空間中,等到那些程式要運作時,再從Swap分區中恢複儲存的資料到記憶體中。這樣,系統總是在實體記憶體不夠時,才進行Swap交換。
關于Swap分區,其實我們有很多疑問,如果能弄清楚這些疑問,那麼你對Swap的了解掌握就差不多了。如何檢視Swap分區大小? Swap分區大小應該如何設定?系統在什麼時候會使用Swap分區? 是否可以調整? 如何調整Swap分區的大小?Swap分區有什麼優劣和要注意的地方? Swap分區是否必要?那麼我一個一個來看看這些疑問吧!
檢視Swap分區大小
檢視Swap分區的大小以及使用情況,一般使用free指令即可,如下所示,Swap大小為2015M,目前沒有使用Swap分區
另外我們還可以使用swapon指令檢視目前swap相關資訊:例如swap空間是swap partition,Swap size,使用情況等詳細資訊
Swap分區大小設定
系統的Swap分區大小設定多大才是最優呢? 關于這個問題,應該說隻能有一個統一的參考标準,具體還應該根據系統實際情況和記憶體的負荷綜合考慮,像ORACLE的官方文檔就推薦如下設定,這個是根據實體記憶體來做參考的。
RAM
Swap Space
Up to 512 MB
2 times the size of RAM
Between 1024 MB and 2048 MB
1.5 times the size of RAM
Between 2049 MB and 8192 MB
Equal to the size of RAM
More than 8192 MB
0.75 times the size of RAM
另外在其它部落格中看到下面一個推薦設定,當然我不清楚其怎麼得到這個标準的。是否合理也無從考證。可以作為一個參考。
4G以内的實體記憶體,SWAP 設定為記憶體的2倍。
4-8G的實體記憶體,SWAP 等于記憶體大小。
8-64G 的實體記憶體,SWAP 設定為8G。
64-256G實體記憶體,SWAP 設定為16G。
上下兩個标準确實也很讓人無所适從。我就有一次在一台ORACLE資料庫伺服器(64G的RAM),按照官方推薦設定了一個很大的Swap分區,但是我發現其實這個Swap幾乎很少用到,其實是浪費了磁盤空間。是以如果根據系統實際情況和記憶體的負荷綜合考慮,其實應該按照第二個參考标準設定為8G即可。當然這個隻是個人的一些認知。
釋放Swap分區空間
使用swapoff關閉交換分區
[root@testlnx ~]# swapoff /dev/mapper/VolGroup00-LogVol01
使用swapon啟用交換分區,此時檢視交換分區的使用情況,你會發現used為0了
Swap分區空間什麼時候使用
系統在什麼情況或條件下才會使用Swap分區的空間呢? 其實是Linux通過一個參數swappiness來控制的。當然還涉及到複雜的算法。
這個參數值可為 0-100,控制系統 swap 的使用程度。高數值可優先系統性能,在程序不活躍時主動将其轉換出實體記憶體。低數值可優先互動性并盡量避免将程序轉換處實體記憶體,并降低反應延遲。預設值為 60。注意:這個隻是一個權值,不是一個百分比值,涉及到系統核心複雜的算法。關于該參數請參考這篇文章[轉載]調整虛拟記憶體,在此不做過多贅述。下面是關于swappiness的相關資料
The Linux 2.6 kernel added a new kernel parameter called swappiness to let administrators tweak the way Linux swaps. It is a number from 0 to 100. In essence, higher values lead to more pages being swapped, and lower values lead to more applications being kept in memory, even if they are idle. Kernel maintainer Andrew Morton has said that he runs his desktop machines with a swappiness of 100, stating that "My point is that decreasing the tendency of the kernel to swap stuff out is wrong. You really don't want hundreds of megabytes of BloatyApp's untouched memory floating about in the machine. Get it out on the disk, use the memory for something useful."
Swappiness is a property of the Linux kernel that changes the balance between swapping out runtime memory, as opposed to dropping pages from the system page cache. Swappiness can be set to values between 0 and 100 inclusive. A low value means the kernel will try to avoid swapping as much as possible where a higher value instead will make the kernel aggressively try to use swap space. The default value is 60, and for most desktop systems, setting it to 100 may affect the overall performance, whereas setting it lower (even 0) may improve interactivity (by decreasing response latency.
有兩種臨時修改swappiness參數的方法,系統重新開機後失效
永久修改swappiness參數的方法就是在配置檔案/etc/sysctl.conf裡面修改vm.swappiness的值,然後重新開機系統
如果有人會問是否實體記憶體使用到某個百分比後才會使用Swap交換空間,可以明确的告訴你不是這樣一個算法,如下截圖所示,及時實體記憶體隻剩下8M了,但是依然沒有使用Swap交換空間,而另外一個例子,實體記憶體還剩下19G,居然用了一點點Swap交換空間。
另外調整/proc/sys/vm/swappiness這個參數,如果你沒有絕對把握,就不要随便調整這個核心參數,這個參數符合大多數情況下的一個最優值。
Swap交換分區對性能的影響
我們知道Linux可以使用檔案系統中的一個正常檔案或獨立分區作為Swap交換空間,相對而言,交換分區要快一些。但是和RAM比較而言,Swap交換分區的性能依然比不上實體記憶體,目前的伺服器上RAM基本上都相當充足,那麼是否可以考慮抛棄Swap交換分區,是否不需要保留Swap交換分區呢?這個其實是我的疑問之一。在這篇What Is a Linux SWAP Partition, And What Does It Do?部落格中,作者給出了swap交換空間的優劣
Advantages:
Provides overflow space when your memory fills up completely
Can move rarely-needed items away from your high-speed memory
Allows you to hibernate
Disadvantages:
Takes up space on your hard drive as SWAP partitions do not resize dynamically
Can increase wear and tear to your hard drive
Does not necessarily improve performance (see below)
其實保留swap分區概括起來可以從下面來看:
首先,當實體記憶體不足以支撐系統和應用程式(程序)的運作時,這個Swap交換分區可以用作臨時存放使用率不高的記憶體分頁,把騰出的記憶體交給急需的應用程式(程序)使用。有點類似機房的UPS系統,雖然正常情況下不需要使用,但是異常情況下, Swap交換分區還是會發揮其關鍵作用。
其次,即使你的伺服器擁有足夠多的實體記憶體,也有一些程式會在它們初始化時殘留的極少再用到的記憶體分頁内容轉移到 swap 空間,以此讓出實體記憶體空間。對于有發生記憶體洩漏幾率的應用程式(程序),Swap交換分區更是重要,因為誰也不想看到由于實體記憶體不足導緻系統崩潰。
最後,現在很多個人使用者在使用Linux,有些甚至是PC的虛拟機上跑Linux系統,此時可能常用到休眠(Hibernate),這種情況下也是推薦劃分Swap交換分區的。
其實少量使用Swap交換空間是不會影響性能,隻有當RAM資源出現瓶頸或者記憶體洩露,程序異常時導緻頻繁、大量使用交換分區才會導緻嚴重性能問題。另外使用Swap交換分區頻繁,還會引起kswapd0程序(虛拟記憶體管理中, 負責換頁的)耗用大量CPU資源,導緻CPU飙升。
關于Swap分區的優劣以及是否應該舍棄,我有點惡趣味的想到了這個事情:人身上的兩個器官,闌尾和扁桃體。切除闌尾或扁桃體是否也是争論不休。另外,其實不要Swap交換分區,Linux也是可以正常運作的(有人提及過這個問題)
調整Swap分區的大小
如下測試案例所示,Swap分區大小為65535M,我現在想将Swap分區調整為8G,那麼我們來看看具體操作吧
1:檢視Swap的使用情況以及相關資訊
2: 關閉Swap交換分區
3: 這裡是縮小Swap分區大小,如果是增大Swap分區大小,那麼就需要擴充正在使用的swap分區的邏輯卷,此處使用lvreduce指令收縮邏輯卷。
4:格式化swap分區
5:啟動swap分區,并增加到/etc/fstab自動挂載