linux 物理内存用完了_调整linux内核尽量用内存,而不用swap
線上一臺服務(wù)器kswapd0占用大量的cpu資源,導(dǎo)致負載過高,什么是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進程的作用:它是虛擬內(nèi)存管理中,負責換頁的,操作系統(tǒng)每過一定時間就會喚醒kswapd ,看看內(nèi)存是否緊張,如果不緊張,則睡眠,在 kswapd 中,有2 個閥值,pages_hige 和 pages_low,當空閑內(nèi)存頁的數(shù)量低于 pages_low的時候,kswapd進程就會掃描內(nèi)存并且每次釋放出32 個free pages,直到 free page 的數(shù)量到達pages_high。
分析結(jié)果是:
physical mem 不足,引起 swap 頻繁讀寫。
kswapd0 是系統(tǒng)的虛擬內(nèi)存管理程序,如果物理內(nèi)存不夠用,系統(tǒng)就會喚醒 kswapd0 進程,由 kswapd0 分配磁盤交換空間作緩存,因而占用大量的 CPU 資源。
查看內(nèi)存及swap使用率:發(fā)現(xiàn)還有空余的內(nèi)存,但是已經(jīng)開始用swap了。
內(nèi)存使用到多少開始使用swap?
vm.swappiness???這個內(nèi)核參數(shù)控制
/proc/sys/vm/swappiness
這個交換參數(shù)控制內(nèi)核從物理內(nèi)存移出進程,移到交換空間。該參數(shù)從0到100,當該參數(shù)=0,表示只要有可能就盡力避免交換進程移出物理內(nèi)存;該參數(shù)=100,這告訴內(nèi)核瘋狂的將數(shù)據(jù)移出物理內(nèi)存移到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:設(shè)置vm.swappiness=0?后并不代表禁用swap分區(qū),只是告訴內(nèi)核,能少用到swap分區(qū)就盡量少用到,設(shè)置vm.swappiness=100的話,則表示盡量使用swap分區(qū),默認的值是60
調(diào)整內(nèi)存參數(shù),當內(nèi)存使用率不足10%(開始是默認值60)時在使用swap,盡量避免使用swap,減少喚醒軟中斷進程,從而降低ksoftirqd進程對cpu的占用。
關(guān)于linux內(nèi)存分配機制
在linux的內(nèi)存分配機制中,優(yōu)先使用物理內(nèi)存,當物理內(nèi)存還有空閑時(還夠用),不會釋放其占用內(nèi)存,就算占用內(nèi)存的程序已經(jīng)被關(guān)閉了,該程序所占用的內(nèi)存用來做緩存使用,對于開啟過的程序、或是讀取剛存取過得數(shù)據(jù)會比較快。
一.??我們先來查看一個內(nèi)存使用的例子:
[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
上述結(jié)果顯示了67075M的used,但是(-/+ buffers/cache)減去buffers和cache的結(jié)果可以看到,所以當前進程實際占用內(nèi)存是4296M。
可以這么理解:在linux的內(nèi)存分配機制中,優(yōu)先使用物理內(nèi)存,當物理內(nèi)存還有空閑時(還夠用),不會釋放其占用內(nèi)存,就算占用內(nèi)存的程序已經(jīng)被關(guān)閉了,該程序所占用的內(nèi)存用來做緩存使用,對于開啟過的程序、或是讀取剛存取過得數(shù)據(jù)會比較快。
如上面的例子:使用了72433M的內(nèi)存,67075M被占用,但是buuffer和cached部分作為緩存,可以使用命中率的方式提高使用效率,而且這部分緩存是根據(jù)指令隨時可以釋放的,我們可以認為這部分內(nèi)存沒有實際被使用,也可以認為它是空閑的。
因此查看目前進程正在實際被使用的內(nèi)存,是used-(buffers+cache),也可以認為如果swap沒有大量使用,mem還是夠用的,只有mem被當前進程實際占用完(沒有了buffers和cache),才會使用到swap的。
二.?Swap配置對性能的影響
分配太多的Swap空間會浪費磁盤空間,而Swap空間太少,則系統(tǒng)會發(fā)生錯誤。如果系統(tǒng)的物理內(nèi)存用光了,系統(tǒng)就會跑得很慢,但仍能運行;如果Swap空間用光了,那么系統(tǒng)就會發(fā)生錯誤。例如,Web服務(wù)器能根據(jù)不同的請求數(shù)量衍生出多個服務(wù)進程(或線程),如果Swap空間用完,則服務(wù)進程無法啟動,通常會出現(xiàn)“application is out of memory”的錯誤,嚴重時會造成服務(wù)進程的死鎖。因此Swap空間的分配是很重要的。
通常情況下,Swap空間應(yīng)大于或等于物理內(nèi)存的大小,最小不應(yīng)小于64M,通常Swap空間的大小應(yīng)是物理內(nèi)存的2-2.5倍。但根據(jù)不同的應(yīng)用,應(yīng)有不同的配置:如果是小的桌面系統(tǒng),則只需要較小的Swap空間,而大的服務(wù)器系統(tǒng)則視情況不同需要不同大小的Swap空間。特別是數(shù)據(jù)庫服務(wù)器和Web服務(wù)器,隨著訪問量的增加,對Swap空間的要求也會增加,一般來說對于4G?以下的物理內(nèi)存,配置2倍的swap,4G?以上配置1倍。
另外,Swap分區(qū)的數(shù)量對性能也有很大的影響。因為Swap交換的操作是磁盤IO的操作,如果有多個Swap交換區(qū),Swap空間的分配會以輪流的方式操作于所有的Swap,這樣會大大均衡IO的負載,加快Swap交換的速度。如果只有一個交換區(qū),所有的交換操作會使交換區(qū)變得很忙,使系統(tǒng)大多數(shù)時間處于等待狀態(tài),效率很低。用性能監(jiān)視工具就會發(fā)現(xiàn),此時的CPU并不很忙,而系統(tǒng)卻慢。這說明,瓶頸在IO上,依靠提高CPU的速度是解決不了問題的。
三.??Linux?內(nèi)存機制
Linux支持虛擬內(nèi)存(VirtualMmemory),虛擬內(nèi)存是指使用磁盤當作RAM的擴展,這樣可用的內(nèi)存的大小就相應(yīng)地增大了。內(nèi)核會將暫時不用的內(nèi)存塊的內(nèi)容寫到硬盤上,這樣一來,這塊內(nèi)存就可用于其它目的。當需要用到原始的內(nèi)容時,它們被重新讀入內(nèi)存。這些操作對用戶來說是完全透明的;Linux下運行的程序只是看到有大量的內(nèi)存可供使用而并沒有注意到時不時它們的一部分是駐留在硬盤上的。當然,讀寫硬盤要比直接使用真實內(nèi)存慢得多(要慢數(shù)千倍),所以程序就不會象一直在內(nèi)存中運行的那樣快。用作虛擬內(nèi)存的硬盤部分被稱為交換空間(Swap Space)。
一般,在交換空間中的頁面首先被換入內(nèi)存;如果此時沒有足夠的物理內(nèi)存來容納它們又將被交換出來(到其他的交換空間中)。如果沒有足夠的虛擬內(nèi)存來容納所有這些頁面,Linux就會波動而不正常;但經(jīng)過一段較長的時間Linux會恢復(fù),但此時系統(tǒng)已不可用了。
有時,盡管有許多的空閑內(nèi)存,仍然會有許多的交換空間正被使用。這種情況是有可能發(fā)生的,例如如果在某一時刻有進行交換的必要,但后來一個占用很多物理內(nèi)存的大進程結(jié)束并釋放內(nèi)存時。被交換出的數(shù)據(jù)并不會自動地交換進內(nèi)存,除非有這個需要時。此時物理內(nèi)存會在一段時間內(nèi)保持空閑狀態(tài)。對此并沒有什么可擔心的,但是知道了是怎么一回事,也就無所謂了。
許多操作系統(tǒng)使用了虛擬內(nèi)存的方法。因為它們僅在運行時才需要交換空間,以解決不會在同一時間使用交換空間,因此,除了當前正在運行的操作系統(tǒng)的交換空間,其它的就是一種浪費。所以讓它們共享一個交換空間將會更有效率。
注意:如果會有幾個人同時使用這個系統(tǒng),他們都將消耗內(nèi)存。然而,如果兩個人同時運行一個程序,內(nèi)存消耗的總量并不是翻倍,因為代碼頁以及共享的庫只存在一份。
Linux系統(tǒng)常常動不動就使用交換空間,以保持盡可能多的空閑物理內(nèi)存。即使并沒有什么事情需要內(nèi)存,Linux也會交換出暫時不用的內(nèi)存頁面。這可以避免等待交換所需的時間:當磁盤閑著,就可以提前做好交換。可以將交換空間分散在幾個硬盤之上。針對相關(guān)磁盤的速度以及對磁盤的訪問模式,這樣做可以提高性能。
與訪問物理內(nèi)存相比,磁盤的讀寫是很慢的。另外,在相應(yīng)較短的時間內(nèi)多次讀磁盤同樣的部分也是常有的事。例如,某人也許首先閱讀了一段E-mail消息,然后為了答復(fù)又將這段消息讀入編輯器中,然后又在將這個消息拷貝到文件夾中時,使得郵件程序又一次讀入它。或者考慮一下在一個有著許多用戶的系統(tǒng)中?ls命令會被使用多少次。通過將信息從磁盤上僅讀入一次并將其存于內(nèi)存中,除了第一次讀以外,可以加快所有其它讀的速度。這叫作磁盤緩沖(Disk Buffering),被用作此目的的內(nèi)存稱為高速緩沖(Buffer Cache)。但是,由于內(nèi)存是一種有限而又不充足的資源,高速緩沖不可能做的很大(它不可能包容要用到的所有數(shù)據(jù))。當緩沖充滿了數(shù)據(jù)時,其中最長時間不用的數(shù)據(jù)將被舍棄以騰出內(nèi)存空間用于新的數(shù)據(jù)。
對寫磁盤操作來說磁盤緩沖技術(shù)同樣有效。一方面,被寫入磁盤的數(shù)據(jù)常常會很快地又被讀出(例如,原代碼文件被保存到一個文件中,又被編譯器讀入),所以將要被寫的數(shù)據(jù)放入緩沖中是個好主意。另一方面,通過將數(shù)據(jù)放入緩沖中,而不是將其立刻寫入磁盤,程序可以加快運行的速度。以后,寫的操作可以在后臺完成,而不會拖延程序的執(zhí)行。
大多數(shù)操作系統(tǒng)都有高速緩沖(盡管可能稱呼不同),但是并不是都遵守上面的原理。有些是直接寫(Write-Through):數(shù)據(jù)將被立刻寫入磁盤(當然,數(shù)據(jù)也被放入緩存中)。如果寫操作是在以后做的,那么該緩存被稱為后臺寫(Write-Back)。后臺寫比直接寫更有效,但也容易出錯:如果機器崩潰,或者突然掉電,緩沖中改變過的數(shù)據(jù)就被丟失了。如果仍未被寫入的數(shù)據(jù)含有重要的薄記信息,這甚至可能意味著文件系統(tǒng)(如果有的話)已不完整。
針對以上的原因,出現(xiàn)了很多的日志文件系統(tǒng),數(shù)據(jù)在緩沖區(qū)修改后,同時會被文件系統(tǒng)記錄修改信息,這樣即使此時系統(tǒng)掉電,系統(tǒng)重啟后會首先從日志記錄中恢復(fù)數(shù)據(jù),保證數(shù)據(jù)不丟失。當然這些問題不再本文的敘述范圍。
由于上述原因,在使用適當?shù)年P(guān)閉過程之前,絕對不要關(guān)掉電源,Sync命令傾空(Flushes)緩沖,也即,強迫所有未被寫的數(shù)據(jù)寫入磁盤,可用以確定所有的寫操作都已完成。在傳統(tǒng)的UNIX系統(tǒng)中,有一個叫做update的程序運行于后臺,每隔30秒做一次sync操作,因此通常無需手工使用sync命令了。Linux另外有一個后臺程序,Bdflush,這個程序執(zhí)行更頻繁的但不是全面的同步操作,以避免有時sync的大量磁盤I/O操作所帶來的磁盤的突然凍結(jié)。
在Linux中,Bdflush是由update啟動的。通常沒有理由來擔心此事,但如果由于某些原因bdflush進程死掉了,內(nèi)核會對此作出警告,此時你就要手工地啟動它了(/sbin/update)。
緩存(Cache)實際并不是緩沖文件的,而是緩沖塊的,塊是磁盤I/O操作的最小單元(在Linux中,它們通常是1KB)。這樣,目錄、超級塊、其它文件系統(tǒng)的薄記數(shù)據(jù)以及非文件系統(tǒng)的磁盤數(shù)據(jù)都可以被緩沖了。緩沖的效力主要是由它的大小決定的。緩沖太小的話等于沒用。它只能容納一點數(shù)據(jù),因此在被重用時,所有緩沖的數(shù)據(jù)都將被傾空。實際的大小依賴于數(shù)據(jù)讀寫的頻次、相同數(shù)據(jù)被訪問的頻率。只有用實驗的方法才能知道。
如果緩存有固定的大小,那么緩存太大了也不好,因為這會使得空閑的內(nèi)存太小而導(dǎo)致進行交換操作(這同樣是慢的)。為了最有效地使用實際內(nèi)存,Linux自動地使用所有空閑的內(nèi)存作為高速緩沖,當程序需要更多的內(nèi)存時,它也會自動地減小緩沖的大小。
這就是一般情況下Linux內(nèi)存的一般機制,真正的Linux內(nèi)存的運行機制遠遠比這個復(fù)雜。
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,吃參數(shù)是得到swap tendency的一個量,而swap tendency是linux內(nèi)核進行內(nèi)存進行回收的一個閥值和標量。
首先是,kswapd進程來定期掃描系統(tǒng)資源,查看內(nèi)存是否夠用,由兩個值影響pages_high和page_low,如果現(xiàn)在可使用的區(qū)間在page_high
補充:
在網(wǎng)上查詢也有可能是iptables的原因,如果在iptables上添加了單IP連接數(shù)限制,如下:
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清空轉(zhuǎn)發(fā)表即可。
版權(quán)屬于:
運維之道
轉(zhuǎn)載時必須以鏈接形式注明原始出處及本聲明。
總結(jié)
以上是生活随笔為你收集整理的linux 物理内存用完了_调整linux内核尽量用内存,而不用swap的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HashMap 源码
- 下一篇: Javascript 调用XML制作连动