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