1. 程式人生 > >linux監控平臺搭建-內存

linux監控平臺搭建-內存

per 添加swap分區 幫助 區號 over 語言 地址 工作 壓力

linux監控平臺搭建-內存

上一篇文章說的硬盤。就寫一下。更加重要的東西。在手機上面是RAM。機器是memory。內存是按照字節編址。每個地址的存儲單元可以存放8bit的數據、cpu 通過內存地址獲取一條指令和數據。內存溢出out-of-memory killer 負責終止使用內存過多的進程。詳細的細節請查看/var/log/messages文件。建立索引常會發生這種情況。管理員可以限制服務不被OOM。數據的預熱。壓力測定時。自動化測試。灰度發布。監控采集。

每一個內存都是進程產生的。到底什麽是內存。其實進程是有自己的虛擬地址空間。虛擬地址空間對應的才是內存。

技術分享圖片

虛擬地址對應的物理地址不在物理內存中。產生缺頁中斷

、真正分配物理地址,同時更新進程頁表

如果物理內存存在,但是被耗盡。則根據內存替換算法淘汰部門頁面至物理磁盤中。

進程的虛擬地址空間是有幾個概念。如下圖:

技術分享圖片

內存分配的原理:

從操作系統角度來看,進程分配內存有兩種方式,分別由兩個系統調用完成:brk和mmap(不考慮共享內存)。

1、小於128k。brk是將數據段(.data)的最高地址指針_edata往高地址推;

2、大於128K。mmap是在進程的虛擬地址空間中(堆和棧中間,稱為文件映射區域的地方)找一塊空閑的虛擬內存。

這兩種方式分配的都是虛擬內存,沒有分配物理內存。在第一次訪問已分配的虛擬地址空間的時候,發生缺頁中斷,操作系統負責分配物理內存,然後建立虛擬內存和物理內存之間的映射關系

技術分享圖片

1)查看linux虛擬地址空間和物理地址

cat /proc/cpuinfo

64位的系統。是2^48虛擬地址空間是48、40位是物理地址

2)查看進程缺頁中斷次數(虛擬地址對應的物理地址不在物理內存中。則產生缺頁中斷)

ps -o maj_flt,min_flt -p pid 查看寫數據模塊。能看到大量的缺頁中斷

發成缺頁中斷後,執行了那些操作?

當一個進程發生缺頁中斷的時候,進程會陷入內核態,執行以下操作:
1、檢查要訪問的虛擬地址是否合法
2、查找/分配一個物理頁
3、填充物理頁內容(讀取磁盤,或者直接置0,或者啥也不幹)
4、建立映射關系(虛擬地址到物理地址)

重新執行發生缺頁中斷的那條指令
如果第3步,需要讀取磁盤,那麽這次缺頁中斷就是majflt,否則就是minflt。

3 )程序退出了,內存會釋放嗎?

答:程序退出了,內存就會被系統慢慢釋放掉,系統有內存清理機制,
就算是new出來的程序中沒有釋放,程序停止後也會釋放的。但是new出來的對象沒用後,程序員都應該手動釋放掉,像C語言如果不釋放,長時間運行必然會有內存不足。Java程序雖然jvm有垃圾回收機制,但是如果超出了垃圾回收機制的範圍也會經常出現內存不足

4 )內存溢出和內存泄漏

內存溢出 out of memory,是指程序在申請內存時,沒有足夠的內存空間供其使用,出現out of memory;比如申請了一個integer,但給它存了long才能存下的數,那就是內存溢出。

內存泄露 memory leak,是指程序在申請內存後,無法釋放已申請的內存空間,一次內存泄露危害可以忽略,但內存泄露堆積後果很嚴重,無論多少內存,遲早會被占光。

memory leak會最終會導致out of memory!

內存溢出就是你要求分配的內存超出了系統能給你的,系統不能滿足需求,於是產生溢出。
內存泄漏是指你向系統申請分配內存進行使用(new),可是使用完了以後卻不歸還(delete),結果你申請到的那塊內存你自己也不能再訪問(也許你把它的地址給弄丟了),而系統也不能再次將它分配給需要的程序。一個盤子用盡各種方法只能裝4個果子,你裝了5個,結果掉倒地上不能吃了。這就是溢出!比方說棧,棧滿時再做進棧必定產生空間溢出,叫上溢,棧空時再做退棧也產生空間溢出,稱為下溢。就是分配的內存不足以放下數據項序列,稱為內存溢出。

5)內存監控項

計算方法:讀取/proc/meminfo 中的內容,其中的mem.memfree是free+buffers+cached,mem.memused=mem.memtotal-mem.memfree。用戶具體可以參考free命令的輸出和幫助文檔來理解

mem.memtotal:內存總大小

mem.memused:使用了多少內存

mem.memused.percent:使用的內存占比

mem.memfree

mem.memfree.percent

mem.swaptotal:swap總大小

mem.swapused:使用了多少swap

mem.swapused.percent:使用的swap的占比

mem.swapfree

mem.swapfree.percent

6)查看當前機器內存信息:

#dmidecode | grep -A16 "Memory Device$"

查看每個內存大小

#dmidecode | grep -A16 "Memory Device$" | grep -i "Size" | grep -v "No"

top -d 1

free -m

7)性能分析的目的

1、找出系統性能瓶頸(包括硬件瓶頸和軟件瓶頸);

2、提供性能優化的方案(升級硬件?改進系統系統結構?);

3、達到合理的硬件和軟件配置;

4、使系統資源使用達到最大的平衡。(一般情況下系統良好運行的時候恰恰各項資源達到了一個平衡體,任何一項資源的過渡使用都會造成平衡體系破壞,從而造成系統負載極高或者響應遲緩。比如CPU過渡使用會造成大量進程等待CPU資源,系統響應變慢,等待會造成進程數增加,進程增加又會造成內存使用增加,內存耗盡又會造成虛擬內存使用,使用虛擬內存又會造成磁盤IO增加和CPU開銷增加)

8)影響性能的因素

1、內存(物理內存不夠時會使用交換內存,使用swap會帶來磁盤I0和cpu的開銷)

2、使用常見的性能分析工具(vmstat、top、free、iostat等)

9)vmstat詳細介紹

vmstat是一個很全面的性能分析工具,可以觀察到系統的進程狀態、內存使用、虛擬內存使用、磁盤的IO、中斷、上下文切換、CPU使用等。對於 Linux 的性能分析,100%理解 vmstat 輸出內容的含義,並能靈活應用,那對系統性能分析的能力就算是基本掌握了。

下面是vmstat命令的輸出結果: vmstat 1 5

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----

r b swpd free buff cache si so bi bo in cs us sy id wa st

1 0 0 191908 188428 1259328 0 0 10 27 61 92 0 1 98 0 0

0 0 0 191892 188428 1259360 0 0 0 0 117 226 0 0 100 0 0

對輸出解釋如下:

1、procs

a.r列表示運行和等待CPU時間片的進程數,這個值如果長期大於系統CPU個數,就說明CPU資源不足,可以考慮增加CPU;

b.b列表示在等待資源的進程數,比如正在等待I/O或者內存交換等。

2、memory

a.swpd列表示切換到內存交換區的內存數量(以KB為單位)。如果swpd的值不為0或者比較大,而且si、so的值長期為0,那麽這種情況一般不用擔心,不會影響系統性能;

b.free列表示當前空閑的物理內存數量(以KB為單位);

c.buff列表示buffers cache的內存數量,一般對塊設備的讀寫才需要緩沖;

d.cache列表示page cached的內存數量,一般作文件系統的cached,頻繁訪問的文件都會被cached。如果cached值較大,就說明cached文件數較多。如果此時IO中的bi比較小,就說明文件系統效率比較好。

3、swap

a.si列表示由磁盤調入內存,也就是內存進入內存交換區的數量;

b.so列表示由內存調入磁盤,也就是內存交換區進入內存的數量

c.一般情況下,si、so的值都為0,如果si、so的值長期不為0,則表示系統內存不足,需要考慮是否增加系統內存。

4、IO

a.bi列表示從塊設備讀入的數據總量(即讀磁盤,單位KB/秒)

b.bo列表示寫入到塊設備的數據總量(即寫磁盤,單位KB/秒)

這裏設置的bi+bo參考值為1000,如果超過1000,而且wa值比較大,則表示系統磁盤IO性能瓶頸。

5、system

a.in列表示在某一時間間隔中觀察到的每秒設備中斷數;

b.cs列表示每秒產生的上下文切換次數。

上面這兩個值越大,會看到內核消耗的CPU時間就越多。

6、CPU

a.us列顯示了用戶進程消耗CPU的時間百分比。us的值比較高時,說明用戶進程消耗的CPU時間多,如果長期大於50%,需要考慮優化程序啥的。

b.sy列顯示了內核進程消耗CPU的時間百分比。sy的值比較高時,就說明內核消耗的CPU時間多;如果us+sy超過80%,就說明CPU的資源存在不足。

c.id列顯示了CPU處在空閑狀態的時間百分比;

d.wa列表示IO等待所占的CPU時間百分比。wa值越高,說明IO等待越嚴重。如果wa值超過20%,說明IO等待嚴重。

e.st列一般不關註,虛擬機占用的時間百分比。 (Linux 2.6.11)

10)寫內存監控項篇就一定要寫的swap

1、先說說什麽是swap分區以及它的作用?

Swap分區,即交換區,Swap空間的作用可簡單描述為:當系統的物理內存不夠用的時候,就需要將物理內存中的一部分空間釋放出來,以供當前運行的程序 使用。

那些被釋放的空間可能來自一些很長時間沒有什麽操作的程序,這些被釋放的空間被臨時保存到Swap空間中,等到那些程序要運行時,再從Swap中恢 復保存的數據到內存中。

這樣,系統總是在物理內存不夠時,才進行Swap交換。 其實,Swap的調整對Linux服務器,特別是Web服務器的性能至關重要。通過調整Swap,有時可以越過系統性能瓶頸,節省系統升級費用。

分配太多的Swap空間會浪費磁盤空間,而Swap空間太少,則系統會發生錯誤。

如果系統的物理內存用光了,系統就會跑得很慢,但仍能運行;如果Swap空間用光了,那麽系統就會發生錯誤。

例如,Web服務器能根據不同的請求數量衍生 出多個服務進程(或線程),如果Swap空間用完,則服務進程無法啟動,通常會出現“application is out of memory”的錯誤,嚴重時會造成服務進程的死鎖。

因此Swap空間的分配是很重要的。

通常情況下,Swap空間應大於或等於物理內存的大小,最小不應小於64M,通常Swap空間的大小應是物理內存的2-2.5倍。

但根據不同的應用,應有不同的配置:如果是小的桌面系統,則只需要較小的Swap空間,而大的服務器系統則視情況不同需要不同大小的Swap空間。

特別是數據庫服務器和Web服 務器,隨著訪問量的增加,對Swap空間的要求也會增加,具體配置參見各服務器產品的說明。

另外,Swap分區的數量對性能也有很大的影響。因為Swap交換的操作是磁盤IO的操作,如果有多個Swap交換區,Swap空間的分配會以輪流的方式 操作於所有的Swap,這樣會大大均衡IO的負載,加快Swap交換的速度。

如果只有一個交換區,所有的交換操作會使交換區變得很忙,使系統大多數時間處 於等待狀態,效率很低。用性能監視工具就會發現,此時的CPU並不很忙,而系統卻慢。這說明,瓶頸在IO上,依靠提高CPU的速度是解決不了問題的

看了這麽多,再想想有時在論壇中的有的人說的他們的內存很大而沒必要使用swap分區,別人10臺機器能解決的問題,我們若合理使用swap分區,使用8臺機器能解決的問題,何樂而不為呢 ?

下面說說swap分區的優化:

1.首先,做到盡量使用分區而非文件,記住除非萬不得已

2.當然也可能是空間太小,那麽就自己添加swap分區

3.特別註意的的是使用分區號較小的分區

4.分布到不同設備上可以實現輪循

5.若真的有多個swap分區,也可以指定優先級,意思也就是優先使用性能較好的分區

註意在配置文件/etc/fstab中的書寫:(數字越大,優先級越高,也可以使用swapon -p 來指定)

/dev/hda1 swap swap defaults,pri=10 0 0

/dev/hda5 swap swap defaults,pri=5 0 0

6.一個重要的參數:

sysctl -a | grep vm.swa

linux內核調優過程有幾個特殊的值,包括這個,不是具體的百分比,而是一個期望值,在這裏越接近0盡量使用cache,越接近100盡量使用swap,只是個趨向值。現在默認是60,DBA通常是90以上

7.兩個一般不調節的值:

vm.swap_token_timeout = 300 時間間隔

vm.page-cluster = 3 一次性寫入swap的頁面數2^3*4K = 32K

下面說說內存的優化:

linux下內存分配的管理主要通過內核參數來控制:

1.與容量相關的內存可調參數

以下參數位於 proc 文件系統的 /proc/sys/vm/ 目錄中。

overcommit_memory :規定決定是否接受超大內存請求的條件。這個參數有三個可能的值:

* 0 默認設置。內核執行啟發式內存過量使用處理,方法是估算可用內存量,並拒絕明顯無效的請求。遺憾的是因為內存是使用啟發式而非準確算法計算進行部署,這個設置有時可能會造成系統中的可用內存超載。不讓過度使用,直接報錯

* 1 內核執行無內存過量使用處理。使用這個設置會增大內存超載的可能性,但也可以增強大量使用內存任務的性能。應用程序在需要時分配,允許過度使用

* 2 內存拒絕等於或者大於總可用 swap 大小以及 overcommit_ratio 指定的物理 RAM 比例的內存請求。如果您希望減小內存過度使用的風險,這個設置就是最好的。 將swap直接使用,使用的內存 = swap + ram * 50%

註意:只為 swap 區域大於其物理內存的系統推薦這個設置overcommit_ratio,將 overcommit_memory 設定為 2 時,指定所考慮的物理 RAM 比例。默認為 50。

2.Out-of-Memory Kill 可調參數

內存不足(OOM)指的是所有可用內存,包括 swap 空間都已被分配的計算狀態。默認情況下,這個狀態可造成系統 panic,並停止如預期般工作。但將 /proc/sys/vm/panic_on_oom 參數設定為 0 會讓內核在出現 OOM 時調用 oom_killer 功能。通常 oom_killer 可殺死偷盜進程,並讓系統正常工作。

可在每個進程中設定以下參數,提高您對被 oom_killer 功能殺死的進程的控制。它位於 proc 文件系統中 /proc/pid/ 目錄下,其中 pid 是進程 ID。oom_adj定義 -16 到 15 之間的一個數值以便幫助決定某個進程的 oom_score。oom_score 值越高,被 oom_killer 殺死的進程數就越多。將 oom_adj 值設定為 -17 則為該進程禁用 oom_killer。

註意:由任意調整的進程衍生的任意進程將繼承該進程的 oom_score。例如:如果 sshd 進程不受 oom_killer 功能影響,所有由 SSH 會話產生的進程都將不受其影響。這可在出現 OOM 時影響 oom_killer 功能救援系統的能力。

參考:

http://blog.51cto.com/asinego/1905622

linux監控平臺搭建-內存