linux 物理内存用完了_调整linux内核尽量用内存,而不用swap
線上一臺服務器kswapd0占用大量的cpu資源,導致負載過高,什么是kswapd0?
Linux uses kswapd for virtual memory management such that pages that havebeen recently accessed are kept in memory and less active pages are paged outto disk.
(what is a page?)…Linux uses manages memory in units called pages.
So,the kswapd process regularly decreases the ages of unreferencedpages…and at the end they are paged out(moved out) to disk
kswapd0進程的作用:它是虛擬內存管理中,負責換頁的,操作系統每過一定時間就會喚醒kswapd ,看看內存是否緊張,如果不緊張,則睡眠,在 kswapd 中,有2 個閥值,pages_hige 和 pages_low,當空閑內存頁的數量低于 pages_low的時候,kswapd進程就會掃描內存并且每次釋放出32 個free pages,直到 free page 的數量到達pages_high。
分析結果是:
physical mem 不足,引起 swap 頻繁讀寫。
kswapd0 是系統的虛擬內存管理程序,如果物理內存不夠用,系統就會喚醒 kswapd0 進程,由 kswapd0 分配磁盤交換空間作緩存,因而占用大量的 CPU 資源。
查看內存及swap使用率:發現還有空余的內存,但是已經開始用swap了。
內存使用到多少開始使用swap?
vm.swappiness???這個內核參數控制
/proc/sys/vm/swappiness
這個交換參數控制內核從物理內存移出進程,移到交換空間。該參數從0到100,當該參數=0,表示只要有可能就盡力避免交換進程移出物理內存;該參數=100,這告訴內核瘋狂的將數據移出物理內存移到swap緩存中。
The defaultvalue I’ve seen on both enterprise level Red Hat and SLES servers is 60.
To find out what the default value is on aparticular server, run:
sysctl vm.swappiness
The value is also located in/proc/sys/vm/swappiness.
PS:設置vm.swappiness=0?后并不代表禁用swap分區,只是告訴內核,能少用到swap分區就盡量少用到,設置vm.swappiness=100的話,則表示盡量使用swap分區,默認的值是60
調整內存參數,當內存使用率不足10%(開始是默認值60)時在使用swap,盡量避免使用swap,減少喚醒軟中斷進程,從而降低ksoftirqd進程對cpu的占用。
關于linux內存分配機制
在linux的內存分配機制中,優先使用物理內存,當物理內存還有空閑時(還夠用),不會釋放其占用內存,就算占用內存的程序已經被關閉了,該程序所占用的內存用來做緩存使用,對于開啟過的程序、或是讀取剛存取過得數據會比較快。
一.??我們先來查看一個內存使用的例子:
[oracle@db1 ~]$ free -m
total? ?? ? used? ??? free? ???shared? ? buffers????cached
Mem:? ?????72433? ???67075? ???5357? ?? ?0? ?????558? ?? ? 62221
-/+ buffers/cache:????4295? ?? ?68138
Swap:? ?????72096? ?? ?91? ?? ?72004
上述結果顯示了67075M的used,但是(-/+ buffers/cache)減去buffers和cache的結果可以看到,所以當前進程實際占用內存是4296M。
可以這么理解:在linux的內存分配機制中,優先使用物理內存,當物理內存還有空閑時(還夠用),不會釋放其占用內存,就算占用內存的程序已經被關閉了,該程序所占用的內存用來做緩存使用,對于開啟過的程序、或是讀取剛存取過得數據會比較快。
如上面的例子:使用了72433M的內存,67075M被占用,但是buuffer和cached部分作為緩存,可以使用命中率的方式提高使用效率,而且這部分緩存是根據指令隨時可以釋放的,我們可以認為這部分內存沒有實際被使用,也可以認為它是空閑的。
因此查看目前進程正在實際被使用的內存,是used-(buffers+cache),也可以認為如果swap沒有大量使用,mem還是夠用的,只有mem被當前進程實際占用完(沒有了buffers和cache),才會使用到swap的。
二.?Swap配置對性能的影響
分配太多的Swap空間會浪費磁盤空間,而Swap空間太少,則系統會發生錯誤。如果系統的物理內存用光了,系統就會跑得很慢,但仍能運行;如果Swap空間用光了,那么系統就會發生錯誤。例如,Web服務器能根據不同的請求數量衍生出多個服務進程(或線程),如果Swap空間用完,則服務進程無法啟動,通常會出現“application is out of memory”的錯誤,嚴重時會造成服務進程的死鎖。因此Swap空間的分配是很重要的。
通常情況下,Swap空間應大于或等于物理內存的大小,最小不應小于64M,通常Swap空間的大小應是物理內存的2-2.5倍。但根據不同的應用,應有不同的配置:如果是小的桌面系統,則只需要較小的Swap空間,而大的服務器系統則視情況不同需要不同大小的Swap空間。特別是數據庫服務器和Web服務器,隨著訪問量的增加,對Swap空間的要求也會增加,一般來說對于4G?以下的物理內存,配置2倍的swap,4G?以上配置1倍。
另外,Swap分區的數量對性能也有很大的影響。因為Swap交換的操作是磁盤IO的操作,如果有多個Swap交換區,Swap空間的分配會以輪流的方式操作于所有的Swap,這樣會大大均衡IO的負載,加快Swap交換的速度。如果只有一個交換區,所有的交換操作會使交換區變得很忙,使系統大多數時間處于等待狀態,效率很低。用性能監視工具就會發現,此時的CPU并不很忙,而系統卻慢。這說明,瓶頸在IO上,依靠提高CPU的速度是解決不了問題的。
三.??Linux?內存機制
Linux支持虛擬內存(VirtualMmemory),虛擬內存是指使用磁盤當作RAM的擴展,這樣可用的內存的大小就相應地增大了。內核會將暫時不用的內存塊的內容寫到硬盤上,這樣一來,這塊內存就可用于其它目的。當需要用到原始的內容時,它們被重新讀入內存。這些操作對用戶來說是完全透明的;Linux下運行的程序只是看到有大量的內存可供使用而并沒有注意到時不時它們的一部分是駐留在硬盤上的。當然,讀寫硬盤要比直接使用真實內存慢得多(要慢數千倍),所以程序就不會象一直在內存中運行的那樣快。用作虛擬內存的硬盤部分被稱為交換空間(Swap Space)。
一般,在交換空間中的頁面首先被換入內存;如果此時沒有足夠的物理內存來容納它們又將被交換出來(到其他的交換空間中)。如果沒有足夠的虛擬內存來容納所有這些頁面,Linux就會波動而不正常;但經過一段較長的時間Linux會恢復,但此時系統已不可用了。
有時,盡管有許多的空閑內存,仍然會有許多的交換空間正被使用。這種情況是有可能發生的,例如如果在某一時刻有進行交換的必要,但后來一個占用很多物理內存的大進程結束并釋放內存時。被交換出的數據并不會自動地交換進內存,除非有這個需要時。此時物理內存會在一段時間內保持空閑狀態。對此并沒有什么可擔心的,但是知道了是怎么一回事,也就無所謂了。
許多操作系統使用了虛擬內存的方法。因為它們僅在運行時才需要交換空間,以解決不會在同一時間使用交換空間,因此,除了當前正在運行的操作系統的交換空間,其它的就是一種浪費。所以讓它們共享一個交換空間將會更有效率。
注意:如果會有幾個人同時使用這個系統,他們都將消耗內存。然而,如果兩個人同時運行一個程序,內存消耗的總量并不是翻倍,因為代碼頁以及共享的庫只存在一份。
Linux系統常常動不動就使用交換空間,以保持盡可能多的空閑物理內存。即使并沒有什么事情需要內存,Linux也會交換出暫時不用的內存頁面。這可以避免等待交換所需的時間:當磁盤閑著,就可以提前做好交換??梢詫⒔粨Q空間分散在幾個硬盤之上。針對相關磁盤的速度以及對磁盤的訪問模式,這樣做可以提高性能。
與訪問物理內存相比,磁盤的讀寫是很慢的。另外,在相應較短的時間內多次讀磁盤同樣的部分也是常有的事。例如,某人也許首先閱讀了一段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內存的運行機制遠遠比這個復雜。
Other:
swap tendency = mapped ratio / 2 + distress + swappiness
The mapped ratio value is the percentage of pages in all memory zones thatbelong to User Mode address spaces (sc->nr_mapped) with respect to the totalnumber of allocatable page frames. A high value of mapped_ratio means that thedynamic memory is mostly used by User Mode processes, while a low value meansthat it is mostly used by the page cache.
The distress value is a measure of how effectively the PFRA is reclaiming pageframes in this zone; it is based on the scanning priority of the zone in theprevious run of the PFRA, which is stored in the prev_priority field of thezone descriptor. The distress value depends on the zone’s previous priority asfollows:
Zone prev. priority
12…7
6
5
4
3
2
1
0
Distress value
0
1
3
6
12
25
50
100
Finally, the swappiness value is a user-defined constant, which is usually setto 60. The system administrator may tune this value by writing in the/proc/sys/vm/swappiness file or by issuing the proper sysctl( ) system call.
Pages will be reclaimed from the address spaces of processes only if the zone’sswap tendency is greater than or equal to 100. Thus, if the systemadministrator sets swappiness to 0, then the PFRA never reclaims pages in theUser Mode address spaces unless the zone’s previous priority is zero (anunlikely event); if the administrator sets swappiness to 100, then the PFRAreclaims pages in the User Mode address spaces at every invocation.
swappiness,吃參數是得到swap tendency的一個量,而swap tendency是linux內核進行內存進行回收的一個閥值和標量。
首先是,kswapd進程來定期掃描系統資源,查看內存是否夠用,由兩個值影響pages_high和page_low,如果現在可使用的區間在page_high
補充:
在網上查詢也有可能是iptables的原因,如果在iptables上添加了單IP連接數限制,如下:
iptables -vnL
Chain FORWARD (policy ACCEPT 761G packets, 477T bytes)
pkts bytes target???? prot opt in???? out???? source?????????????? destination
50M 5790M REJECT???? tcp? —? *????? *?????? 10.x.0.0/16??????? 0.0.0.0/0?????????? #conn/32 > 500 reject-with icmp-port-unreachable
56M 4581M REJECT???? tcp? —? *????? *?????? 10.x.0.0/16??????? 0.0.0.0/0?????????? #conn/32 > 500 reject-with icmp-port-unreachable
2666K? 208M REJECT???? tcp? —? *????? *?????? 10.x.0.0/16??????? 0.0.0.0/0?????????? #conn/32 > 500 reject-with icmp-port-unreachable
18M? 976M REJECT???? tcp? —? *????? *?????? 10.x.0.0/16??????? 0.0.0.0/0?????????? #conn/32 > 500 reject-with icmp-port-unreachable
14112? 745K REJECT???? tcp? —? *????? *?????? 10.x.0.0/16??????? 0.0.0.0/0?????????? #conn/32 > 500 reject-with icmp-port-unreachable
0???? 0 REJECT???? tcp? —? *????? *?????? 10.x.0.0/16??????? 0.0.0.0/0?????????? #conn/32 > 500 reject-with icmp-port-unreachable
使用 ksoftirqd??-F FORWARD清空轉發表即可。
版權屬于:
運維之道
轉載時必須以鏈接形式注明原始出處及本聲明。
總結
以上是生活随笔為你收集整理的linux 物理内存用完了_调整linux内核尽量用内存,而不用swap的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HashMap 源码
- 下一篇: gtk linux 升级_Linux包系