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

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

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_highoracle

分析結果是:app

physical mem 不足,引發 swap 頻繁讀寫。less

kswapd0 是系統的虛擬內存管理程序,若是物理內存不夠用,系統就會喚醒 kswapd0 進程,由 kswapd0 分配磁盤交換空間做緩存,於是佔用大量的 CPU 資源。tcp



查看內存及swap使用率:發現還有空餘的內存,可是已經開始用swap了。編輯器

wKioL1RcJ2yhkZ7QAACHMu7teHo211.jpg


內存使用到多少開始使用swap?ide

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清空轉發表便可。

相關文章
相關標籤/搜索