調整linux內核儘量用內存,而不用swap

線上一臺服務器kswapd0佔用大量的cpu資源,導致負載過高,什麼是kswapd0?

wKiom1RcMdSzo3dAAAOi6WNuPUA882.jpg

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了。

wKioL1RcJ2yhkZ7QAACHMu7teHo211.jpg


內存使用到多少開始使用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的佔用。

wKiom1RcJ0qihaBdAAAy0LKeCzE718.jpg


關於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
上述結果顯示了67075Mused,但是(-/+ buffers/cache)減去bufferscache的結果可以看到,所以當前進程實際佔用內存是4296M
可以這麼理解:在linux的內存分配機制中,優先使用物理內存,當物理內存還有空閒時(還夠用),不會釋放其佔用內存,就算佔用內存的程序已經被關閉了,該程序所佔用的內存用來做緩存使用,對於開啓過的程序、或是讀取剛存取過得數據會比較快。
如上面的例子:使用了72433M的內存,67075M被佔用,但是buuffercached部分作爲緩存,可以使用命中率的方式提高使用效率,而且這部分緩存是根據指令隨時可以釋放的,我們可以認爲這部分內存沒有實際被使用,也可以認爲它是空閒的。
因此查看目前進程正在實際被使用的內存,是used-(buffers+cache),也可以認爲如果swap沒有大量使用,mem還是夠用的,只有mem被當前進程實際佔用完(沒有了bufferscache),纔會使用到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倍的swap4G 以上配置1倍。
另外,Swap分區的數量對性能也有很大的影響。因爲Swap交換的操作是磁盤IO的操作,如果有多個Swap交換區,Swap空間的分配會以輪流的方式操作於所有的Swap,這樣會大大均衡IO的負載,加快Swap交換的速度。如果只有一個交換區,所有的交換操作會使交換區變得很忙,使系統大多數時間處於等待狀態,效率很低。用性能監視工具就會發現,此時的CPU並不很忙,而系統卻慢。這說明,瓶頸在IO上,依靠提高CPU的速度是解決不了問題的。

.  Linux 內存機制
Linux
支持虛擬內存(VirtualMmemory),虛擬內存是指使用磁盤當作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內存的運行機制遠遠比這個複雜。

 

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 tendencylinux內核進行內存進行回收的一個閥值和標量。

 

首先是,kswapd進程來定期掃描系統資源,查看內存是否夠用,由兩個值影響pages_highpage_low,如果現在可使用的區間在page_high<x<page_low,就開始檢查從文件系統讀入的文件,有無被修改的內存頁面,如果有就寫入到磁盤,但是,如果內存頁面被修改了,有可能不是從文件系統讀入的,即找不到回寫的位置,malloc產生的anonymous內存數據就寫入swap分區,這部分當進程在次被喚醒,獲得了CPU運行時間,在從swap讀入


補充:

在網上查詢也有可能是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清空轉發表即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章