周末的時候HBase叢集一台子節點當機,檢視Ganglia及記憶體使用情況,發現節點Swap空間耗盡,但奇怪的是,系統實體記憶體卻還是非常的富足。我們都知道
Swap空間的作用:
Swap空間的作用可簡單描述為:當系統的實體記憶體不夠用的時候,就需要将實體記憶體中的一部分空間釋放出來,以供目前運作的程式使用。那些被釋放的空間可能來自一些很長時間沒有什麼操作的程式,這些被釋放的空間被臨時儲存到Swap空間中,等到那些程式要運作時,再從Swap中恢複儲存的資料到記憶體中。這樣,系統總是在實體記憶體不夠時,才進行Swap交換。
Swap配置對性能的影響:
配置設定太多的Swap空間會浪費磁盤空間,而Swap空間太少,則系統會發生錯誤。 如果系統的實體記憶體用光了,系統就會跑得很慢,但仍能運作;如果Swap空間用光了,那麼系統就會發生錯誤。例如,Web伺服器能根據不同的請求數量衍生出多個服務程序(或線程),如果Swap空間用完,則服務程序無法啟動,通常會出現“application is out of memory”的錯誤,嚴重時會造成服務程序的死鎖。是以Swap空間的配置設定是很重要的。
那麼,真的是當系統實體記憶體不夠用的時候,系統才會使用Swap空間嗎?否!他娘的。。。
其實虛拟記憶體并不是等到實體記憶體用盡了才使用的,是否盡量的使用或不使用swap在核心空間有一個參數控制。
cat /proc/sys/vm/swappiness
60
swappiness=0的時候表示最大限度使用實體記憶體,然後才是 swap空間,swappiness=100的時候表示積極的使用swap分區,并且把記憶體上的資料及時的搬運到swap空間裡面。
對于現在動辄上百G實體記憶體的伺服器來說,究竟為其Linux系統設定多大的交換分區合适呢,為此,引用紅帽官方文庫裡的一段文字進行說明。
目前Red Hat推薦交換分區的大小應當與系統實體記憶體的大小保持線性比例關系。不過在小于2GB實體記憶體的系統中,交換分區大小應該設定為記憶體大小的兩倍,如果記憶體大小多于2GB,交換分區大小應該是實體記憶體大小加上2GB。其原因在于,系統中的實體記憶體越大,對于記憶體的負荷可能也越大。
但是,如果實體記憶體大小擴充到數百GB,這樣做就沒什麼意義了。
實際上,系統中交換分區的大小并不取決于實體記憶體的量,而是取決于系統中記憶體的負荷。Red Hat Enterprise Linux 5可以在這樣的情況下工作:完全沒有交換分區,而且系統中匿名記憶體頁和共享記憶體頁小于3/4的實體記憶體量。在這種情況下,系統會将匿名記憶體頁和共享記憶體頁鎖定在實體記憶體中,而使用剩餘的實體記憶體來緩沖檔案系統資料(pagecache),當記憶體耗盡時,系統核心隻會回收利用這些pagecache記憶體。
考慮到以下情況:
1)安裝系統時難以确定記憶體的負荷,如何設定交換分區大小
2)系統中實體記憶體越大,所需交換分區就會越少
是以,在Red Hat Enterprise Linux 5中,以下是設定合适的交換分區大小的規則:
小于等于4G實體記憶體的系統,至少設定2GB的交換分區
4G~16G實體記憶體的系統,至少設定4GB的交換分區
16G~64G實體記憶體的系統,至少設定8GB的交換分區
64G~256G實體記憶體的系統,至少設定16GB的交換分區
如何修改呢?
1.修改此處vm.swappiness=10,但是你會發現重新開機後又變成60.
2.要徹底修改,還是要修改配置/etc/sysctl.conf
在這個文檔的最後加上這樣一行:
vm.swappiness=10
然後儲存,重新開機。ok,你的設定就生效了。
涉及到HBase來說,其在系統配置一節中,也有建議,可見,HBase建議設定swappiness為0,盡量使用實體記憶體:
==================================
檢視修改swap
1 檢視swap 空間大小(總計):
# free -m 預設機關為k, -m 機關為M
total used free shared buffers cached
Mem: 377 180 197 0 19 110
-/+ buffers/cache: 50 327
Swap: 572 0 572
2 檢視swap 空間(file(s)/partition(s)):
包括 檔案 和 分區的詳細資訊
# swapon -s
等價于
# cat /proc/swaps
3.在空間合适處建立swap檔案
[root@ema usr]# cd swap
[root@ema swap]# dd if=/dev/zero of=swapfile bs=402400 count=10000
10000+ records in
10000+ records out
[root@ema swap]# ls -al
total 10024
drwxr-xr-x 2 root root 4096
drwxr-xr-x 19 root root 4096
-rw-r--r-- 1 root root 4013500000
[root@emaswap]# mkswap swapfile
激活swap檔案
swapon swapfile
total used free shared buffers cached
Mem: 202619299771755
-/+ buffers/cache: 1661860