linux swap空間使用率過大處理

linux swap空間的swappiness=0

 

linux 會使用硬盤的一部分作爲SWAP分區,用來進行進程調度--進程是正在運行的程序--把當前不用的進程調成‘等待(standby)‘,甚至‘睡眠(sleep)’,一旦要用,再調成‘活動(active)’,睡眠的進程就躺到SWAP分區睡大覺,把內存空出來讓給‘活動’的進程。
  若是內存夠大,應當告訴 linux 沒必要太多的使用 SWAP 分區, 能夠經過修改 swappiness 的數值。swappiness=0的時候表示最大限度使用物理內存,而後纔是 swap空間,swappiness=100的時候表示積極的使用swap分區,而且把內存上的數據及時的搬運到swap空間裏面。
  在linux裏面,默認設置swappiness這個值等於60。html

  
  如今通常1個G的內存可修改成10, 2個G的可改成5, 甚至是0。具體這樣作:
  1.查看你的系統裏面的swappiness
  $ cat /proc/sys/vm/swappiness
  不出意外的話,你應該看到是 60
  2.修改swappiness值爲10
  $ sudo sysctl vm.swappiness=10
  可是這只是臨時性的修改,在你重啓系統後會恢復默認的60,爲長治久安,還要更進一步:
  $ sudo gedit /etc/sysctl.conf
  在這個文檔的最後加上這樣一行:
  vm.swappiness=10
  而後保存,重啓。ok,你的設置就生效了。 

node

通常來講,Linux的虛擬內存會根據系統負載自動調整。內存頁(page)swap到磁盤會顯著的影響Kafka的性能,而且Kafka重度使用page cache,若是VM系統swap到磁盤,那說明沒有足夠的內存來分配page cache。linux

 

避免swap的一種方式是設置swap空間爲0。可是,swap會在系統崩潰時提供安全機制,或者會在out of memory的狀況下阻止操做系統 kill 掉進程。因爲這個緣由,推薦 vm.swappiness參數設置爲一個很是低的值:1 。這個參數表示 VM系統中的多少百分比用來做爲swap空間。緩存

 

另一種方式是經過內核調節「髒頁」(注:「髒頁」會被刷到磁盤上)。Kafka依賴磁盤I/O性能來提升producer的響應時間。這也是爲何一般優先把log segment功能放在能夠快速響應的磁盤中(好比SSD)。這樣使得flush進程把「髒數據」寫入磁盤前,「髒頁」數目就減小了,能夠設置vm.dirty_background_ratio(表示佔用系統內存的百分比)參數的值爲10 如下。大部分應用場景下,vm.dirty_background_ratio設置爲 5 就夠用了,要注意了:這個參數值不能設置爲 0 ,由於設置爲 0 後會引發內核持續刷「髒頁」,使得內核的buffer write功能無法施展。安全

 

「髒頁」的總量能夠經過vm.dirty_ratio 來改變,默認值是 20 (此處也是百分比),這個值的設置範圍較大,通常建議設置 60 到 80 爲合理的值。可是vm.dirty_ratio 參數也引來了不小的風險,會形成大量unflush的數據在硬刷到磁盤時產生較長的I/O停頓。若是vm.dirty_ratio 值設置的較大時,強烈建議Kafka開啓備份功能,以備系統崩潰。服務器

 

在設置了這些參數後,須要監控Kafka集羣運行時「髒頁」的數量,當前「髒頁」數量可由以下方式查看(/proc/vmstat文件):數據結構

 

#cat /proc/vmstat | egrep "dirty|writeback"oracle

nr_dirty 3875app

nr_writeback 29post

nr_writeback_temp 0

臨時生效:sysctl -w vm.swappiness=0

 

永久生效:

echo "vm.swappiness = 0">> /etc/sysctl.conf (儘可能不使用交換分區,注意不是禁用)

 

刷新SWAP

能夠執行命令刷新一次SWAP(將SWAP裏的數據轉儲回內存,並清空SWAP裏的數據)

swapoff -a && swapon -a

 

sysctl -p (執行這個使其生效,不用重啓)

 

清理緩存命令

以前應該先

sync下

由於系統在操做的過程中,會把你的操做到的文件資料先保存到buffer中去,由於怕你在操做的過程當中由於斷電等緣由遺失數據,因此在你操做過程當中會把文件資料先緩存。

因此咱們在清理緩存先要先把buffe中的數據先寫入到硬盤中,sync命令

上面的echo 3 是清理全部緩存

echo 0 是不釋放緩存

echo 1 是釋放頁緩存

ehco 2 是釋放dentries和inodes緩存

echo 3 是釋放 1 和 2 中說道的的全部緩存

 

說明:
1>. /proc是一個虛擬文件系統,咱們能夠經過對它的讀寫操做做爲與kernel實體間進行通訊的一種手段。也就是說能夠經過修改/proc中的文件,來對當前kernel的行爲作出調整。也就是說咱們能夠經過調整/proc/sys/vm/drop_caches來釋放內存。
0 – 不釋放
1 – 釋放頁緩存
2 – 釋放dentries和inodes
3 – 釋放全部緩存
數字1是用來清空最近放問過的文件頁面緩存
數字2是用來清空文件節點緩存和目錄項緩存
數字3是用來清空1和2全部內容的緩存。
2>. 關於drop_caches的官方說明以下:
Writing to this file causes the kernel to drop clean caches,dentries and inodes from memory, causing that memory to becomefree.
To free pagecache, use echo 1 > /proc/sys/vm/drop_caches;
to free  dentries and  inodes, use echo 2 > /proc/sys/vm/drop_caches;
to free pagecache, dentries and inodes, use echo 3 >/proc/sys/vm/drop_caches.
Because this is a non-destructive operation and dirty objects are not freeable, the user should run sync first.
 
3>.  Linux內核會將它最近訪問過的文件頁面緩存在內存中一段時間,這個文件緩存被稱爲pagecache。
Inode是linux/unix操做系統中的一種數據結構,包含了各文件相關的一些重要信息。在建立文件系統時,就會同時建立大量的inode。通常inode表會佔用文件系統磁盤空間的1%。

 

目錄項緩存(dcache)dentries

 

各參數含義:
total:總物理內存
used:已使用內存
free:徹底未被使用的內存
shared:應用程序共享內存
buffers:緩存,主要用於目錄方面,inode值等
cached:緩存,用於已打開的文件
-buffers/cache:應用程序使用的內存大小,used減去緩存值
+buffers/cache:全部可供應用程序使用的內存大小,free加上緩存值
 
其中:
total = used + free
-buffers/cache=used-buffers-cached,這個是應用程序真實使用的內存大小
+buffers/cache=free+buffers+cached,這個是 服務器 真實還可利用的內存大小

[oracle@cddserver1 ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:         32096      10379      21717          0         38       7942
-/+ buffers/cache:       2398      29698Swap:        34287          0      34287 這裏面的第二行纔是真正服務器的空閒內存
相關文章
相關標籤/搜索