本文會收集工作中遇到的Hadoop&HBase系統優化涉及到的各個參數,並簡要介紹如此設置的意義。
1、禁用集羣所有節點的transparent huge page特性,設置方式如下:
echo "never" > /sys/kernel/mm/redhat_transparent_hugepage/enabled
echo "never" > /sys/kernel/mm/redhat_transparent_hugepage/defrag
echo "never" > /sys/kernel/mm/transparent_hugepage/defrag
echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
Linux的內存管理採取的是分段&分頁的方式,分段實現了粗粒度的管理,而分頁則實現了細粒度上虛擬內存到物理內存上的轉換。詳細地說就是linux內核會依據LRU算法將物理內存中不經常使用的內存頁交換到虛擬內存中,所有虛擬內存和物理內存件的映射關係保存在由CPU維護的映射表中。通常情況下linux的頁大小是4k,這就意味着當物理內存很大的時候,映射表中的條目將會非常多,進而影響到CPU的檢索效率。
一種很顯然的方法就是增大page的大小以減少映射表中的條目數,這就是huge page特性設計的出發點。操作系統的後臺有一個khugepaged的進程,它會一直掃描所有進程佔用的內存,並在可能的時候將4k的page交換爲Huge Page。然而,對於內存的各種分配活動不可避免的會需要各種內存鎖,直接影響到程序的內存訪問性能,造成系統的sys load過高。由於THP對應用程序透明,所以在外在表現上造成了系統的隨機性能下降。
2、設置zone_reclaim_mode爲0
在多核環境中,爲提高性能,linux將內存劃分成分配給每個CPU的空間節點(node),每個節點進一步劃分成一些區域(zone)。上述可選值爲0或者1,當某個節點可用內存(zone)不足時:
1、如果爲0的話,那麼系統會傾向於從其他節點分配內存
2、如果爲1的話,那麼系統會傾向於從本地節點回收Cache
多數時候,cache對性能很重要,所以0是一個更好的選擇。
a、echo 0 > /proc/sys/vm/zone_reclaim_mode:意味着關閉zone_reclaim模式,可以從其他zone或NUMA節點回收內存
b、echo 1 > /proc/sys/vm/zone_reclaim_mode:表示打開zone_reclaim模式,這樣內存回收只會發生在本地節點內
c、echo 2 > /proc/sys/vm/zone_reclaim_mode:在本地回收內存時,可以將cache中的髒數據寫回硬盤,以回收內存
d、echo 4 > /proc/sys/vm/zone_reclaim_mode:可以用swap方式回收內存
3、將集羣節點的min_free_kbytes設置爲1G
echo -e "vm.min_free_kbytes=1048576" >> /etc/sysctl.conf
min_free_kbytes代表系統中必須保留的可用空閒內存的最小值。這個參數會影響內存回收的三個水平標記參數watermark[min/low/high]。
當系統的空閒內存低於watermark[low]時,開始啓動內核守護線程kswapd進行內存頁面回收(每個zone中都會有一個kswapd),直到該zone的空閒內存頁數量達到watermake[high]之後才停止回收行爲。如果上層申請內存的速度太快,導致空閒內存降至watermark[min]以下,內核就會進行direct reclaim(直接回收),也就是說直接在應用程序的上下文中進行頁面回收,再用回收來的內存滿足內存申請。當有這種情況發生時會阻塞應用程序的執行,帶來一定的響應延遲,甚至會觸發OOM。因爲watermark[min]以下的內存空間是留給系統特殊使用的,所以不會給用戶態程序用。
min_free_kbyte設置的越大,watermark就會越高,上述三個水平標誌之間的內存量就會相應增加,意味着系統會預留更多的空閒內存,相應地應用程序的可用內存量便會減少。 min_free_kbyte設置的歐小,會導致系統的預留內存過小,有可能會導致頻繁的OOM發生。
4、將IO調度算法更改爲deadline
echo deadline > /sys/block/sda/queue/scheduler
deadline算法中實現了四個隊列,其中兩個用於處理正常的read和write,按扇區號排序,進行正常的io合併處理以提高吞吐量。因爲IO請求可能會集中在某些磁盤位置,這樣會導致新來的請求一直被合併,這樣其他磁盤位置的io請求有可能被餓死。因此實現了另外兩個處理超時read和write請求的隊列,按請求創建時間排序,如果有即將超時的請求出現則放進這兩個隊列,調度算法會保證超時隊列的請求在達到最終期限時間前被優先處理,防止請求被餓死。
deadline比較適合於業務比較單一且IO壓力比較重的業務,比如數據庫。
5、應用linux內核的文件預讀readahead
預讀是指文件系統爲應用程序一次取出比請求預期更多的文件內容並緩存在page cache中,這樣當下一次讀請求進來的時候可以直接從page cache中讀取。預讀可以有效減少磁盤的尋道次數和應用程序的I/O等待時間。
修改時需將配置寫入/etc/rc.local,否則會失效。
echo '/sbin/blockdev --setra 2048 /dev/sda' >> /etc/rc.local
6、關閉交換分區
運行如下命令關閉交換分區:swapoff -a
同時需要向swappiness寫入0,表示關閉交換分區:echo 0 > /proc/sys/vm/swappiness
並且將vm.swappiness = 0寫入/etc/sysctl.conf,表示開機自動將vm.swappiness置爲0
參考資料:
http://blog.chinaunix.net/uid-27177626-id-4197018.html