linux 會使用硬盤的一部分做為SWAP分區,用來進行進程調度--進程是正在運行的程序--把當前不用的進程調成‘等待(standby)‘,甚至‘睡眠(sleep)’,一旦要用,再調成‘活動(active)’,睡眠的進程就躺到SWAP分區睡大覺,把內存空出來讓給‘活動’的進程。
如果內存夠大,應當告訴 linux 不必太多的使用 SWAP 分區, 可以通過修改 swappiness 的數值。swappiness=0的時候表示最大限度使用物理內存,然后才是 swap空間,swappiness=100的時候表示積極的使用swap分區,並且把內存上的數據及時的搬運到swap空間里面。
在linux里面,默認設置swappiness這個值等於60。
現在一般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,你的設置就生效了。
一般來說,Linux的虛擬內存會根據系統負載自動調整。內存頁(page)swap到磁盤會顯著的影響Kafka的性能,並且Kafka重度使用page cache,如果VM系統swap到磁盤,那說明沒有足夠的內存來分配page cache。
避免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"
nr_dirty 3875
nr_writeback 29
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 (執行這個使其生效,不用重啟)