linux有足夠內存還使用swap

一臺主機內存swap報警上去以查看確實swap快耗盡;


$free -m

  total        used        free      shared      buff/cache   available

Mem: 32012        8293         243         594       23475       22638

Swap:          7999        7315         684


Linux starts swapping before the RAM is filled up. This is done to improve performance and responsiveness:

  • Performance is increased because sometimes RAM is better used for disk cache than to store program memory. So it's better to swap out a program that's been inactive for a while, and instead keep often-used files in cache.

  • Responsiveness is improved by swapping pages out when the system is idle, rather than when the memory is full and some program is running and requesting more RAM to complete a task.

Swapping does slow the system down, of course — but the alternative to swapping isn't not swapping, it's having more RAM or using less RAM.

翻譯:Linux在物理內存用完之前使用swap,這樣有助於提高系統性能和響應能力

1 性能可以提升的原因是:一些內存放磁盤緩存比方內存更合適。所以,最好交換出暫時不使用的內存,而把經常使用的文件放內存裏面

2 提升響應能力通過,當系統空閒的時候swap page out,而不是當內存忙的時候,正在執行程序的時候執行swap

swaping確實會是系統性能下降,當然,通過swap可以有更多的可用內存

如何在有內存可用的時候,不使用swap呢?

This behaviour can be configured by setting the value of /proc/sys/vm/swappiness. The default value is 60, setting it to 0 means “never use swap when there is still RAM left“ and 100 is swapping out memory as soon as possible.

To change the value temporarily (lost on reboot):

sudo sysctl vm.swappiness=10

To change the value permanently: Edit the file /etc/sysctl.conf as root (e.g. sudo nano /etc/sysctl.conf) and change the line vm.swapiness=... to the desired value.

There has been some debate on whether swapping out with free memory available is good or bad, but the Ubuntu help does indeed recommend a value of 10 for Desktop systems:https://help.ubuntu.com/community/SwapFaq

centos swappiness配置的路徑  /proc/sys/vm/swappiness

爲什麼不建議關閉swap

It is NOT recommended to turn off swap even if you have enough memory. If your server needs more memory and it did not get it, it will crash. However, this can be prevented (to some extent) when you have a swap area.

Yes, your server performance will degrade when using swap, but at least it will be operational and accessible. Then, you can plan for adding more memory when needed if your server starts using swap.

I found this page talking about swap. Have a look at 3rd section.

Instead of turning off swap, you can control the swapiness.

參考

http://unix.stackexchange.com/questions/2658/why-use-swap-when-there-is-more-than-enough-ram

swap知識  https://help.ubuntu.com/community/SwapFaq

http://linux.cloudibee.com/2007/11/linux-performance-tuning-vm-swappiness/

轉載自: https://blog.csdn.net/wjciayf/article/details/79913381

關於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也會交換出暫時不用的內存頁面。這可以避免等待交換所需的時間:當磁盤閒着,就可以提前做好交換。可以將交換空間分散在幾個硬盤之上。針對相關磁盤的速度以及對磁盤的訪問模式,這樣做可以提高性能。

與訪問物理內存相比,磁盤的讀寫是很慢的。另外,在相應較短的時間內多次讀磁盤同樣的部分也是常有的事。例如,某人也許首先閱讀了一段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 percenta
ge 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內核進行內存進行回收的一個閥值和標量。

https://blog.csdn.net/ly890700/article/details/73695750

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




swappiness的值的大小對如何使用swap分區是有着很大的聯繫的。swappiness=0的時候表示最大限度使用物理內存,然後纔是swap空間,swappiness100的時候表示積極的使用swap分區,並且把內存上的數據及時的搬運到swap空間裏面。linux的基本默認設置爲60,具體如下:

cat /proc/sys/vm/swappiness
#60

也就是說,你的內存在使用到100-60=40%的時候,就開始出現有交換分區的使用。大家知道,內存的速度會比磁盤快很多,這樣子會加大系統IO,同時造的成大量頁的換進換出,嚴重影響系統的性能,所以我們在操作系統層面,要儘可能使用內存,對該參數進行調整。

臨時調整的方法如下,我們調成10

sysctl vm.swappiness=10
#vm.swappiness=10

cat /proc/sys/vm/swappiness

#10

這只是臨時調整的方法,重啓後會回到默認設置的.

要想永久調整的話,需要在/etc/sysctl.conf修改,加上:

sudo vim /etc/sysctl.conf

加上

# Controls the maximum number of shared memory segments, in pages

kernel.shmall = 4294967296 #這一個可以不用設置

vm.swappiness = 10

 生效

sudo sysctl -p

這樣便完成修改設置!

 

Ps在服務器內存充裕的情況下儘量用內存,swap緩存設置低一些,使用swap是必要的;

另外:swap可以擴充的,但是會不會影響線上業務,或者使用sysctl vm.swappiness=10命令時候會不會影響線上業務,一直糾結中。

 

轉自:https://www.cnblogs.com/EasonJim/p/7777904.html

 

  用文件增加swap:

dd if=/dev/zero of=/tmp/swapadd bs=1024 count=2048000    ###添加一塊2G的swap文件


mkswap /tmp/swapadd  ####格式化文件


swapon /tmp/swapadd ###增加swap


free -m


echo "/tmp/swapadd swap swap defaults 0 0" >> /etc/fstab    ###開機自動掛載swap分區

swapoff swapadd  ### 使用Swapoff命令收回Swap空間

rm swapadd    ###從文件系統中回收此文件



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