或許你已經或多或少聽說過某種NoSQL數據庫了,如果NoSQL真的可以讓我們的Web應用程序運行的更快、更具擴展性,我想我們可以去嘗試,並盡可能發揮其威力。
我們不僅要選擇適合自己口味的NoSQL數據庫,比如基於內存的Memcache或Redis,更適合企業級架構的Cassandra或HBase,同時,針對Linux服務器的優化也必不可少。
另外,還有一個問題需要探討。我們在嘗試NoSQL數據庫的時候,不應該排斥傳統的關系型數據庫,因為NoSQL數據庫永遠不會取代傳統的關系型數據庫。
Linux性能優化是一個很大的話題,涉及應用程序棧的層次架構,並非是一門精確的科學。本文是Linux性能優化系列文章的第一篇,著眼於NoSQL內存數據庫的Linux服務器性能優化。為此,我們將重構Linux服務器的內核。
也許你曾經親自下載、編譯過Linux內核,因此,在重構Linux內核之前,請不要忘記風險。
通過優化vanilla 3.x kernel中的如下選項可以應對我們所提到的工作負載挑戰:
CONFIG_TASK_IO_ACCOUNTING:非常重要,允許您監控服務器進程的磁盤活動狀態。
CONFIG_SLUB:Chris Lameter的內核對象緩存系統。相比SLAB而言,在管理內核內存分配方面效率更高。
CONFIG_JUMP_LABEL:內核分支優化,使內核速度更快。
CONFIG_NUMA and friends:適用於多核處理器,為內核啟用NUMA功能,提升對高速緩存和內存的一致性支持。
CONFIG_SPARSEMEM_VMEMMAP:針對pfn_to_page和page_to_pfn函數的稀疏內存優化選項。
CONFIG_TRANSPARENT_HUGEPAGE, CONFIG_COMPACTION, CONFIG_MIGRATION, CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS:這些參數可用於分配大於4KB的內存頁,為內存饑餓進程加速分配內存。另外,它們還可以對內存頁進行壓縮和遷移,以對大型頁面進行安全查詢,並進一步減少內存碎片。
CONFIG_KSM:以MADV_MERGEABLE的方式取消內存頁面的標記是一個非常重要的機制,可以以終極的方式節省內存。
CONFIG_ZRAM:提供了一個基於內存的塊設備。在此塊設備中寫入的數據會被壓縮,並存儲在內存中。這對臨時存儲空間非常有用(掛載在/tmp目錄下),由於此特性用於臨時區域,請將它構建為一個模塊,並小心使用。
CONFIG_ZCACHE, CONFIG_ZSMALLOC & CONFIG_CLEANCACHE:一個內存頁面壓縮框架,可透明地壓縮清潔頁面和交換頁面,從而為基於內存的工作負荷提供顯著的性能提升。CleanCache使用ZCache框架對內存頁面進行壓縮,可以在高內存環境下有效地降低I/O請求。由於此特性用於臨時區域,請謹慎使用。
當然,我們的優化是基於x86_64架構的。此外,另一些選項也會涉及到工作負荷的性能優化:
CONFIG_PERF_EVENTS:內核性能計數器,與perf等工具共同使用。尤其適用於深度性能監控。
CONFIG_PROFILING:性能分析計數器,與OProfile等工具共同使用。與PERF_EVENTS同樣重要。
HAVE_BPF_JIT:基於時間規則的編譯器,用於基於PCAP(packet capture library)並使用伯克利包篩選器(Berkeley Packet Filter,如tcpdump)的用戶工具,可以大幅提升復雜規則的處理性能。通過/proc/sys/net/core/bpf_jit_enable啟用它。
我們可以選擇最適合自己的選項,保存、編譯並運行它,看看最後的結果是否能帶給你成就感!
也許會有其它許多技術,可以幫助我們建立高效的基礎架構,優化基於內存的工作負載(比如,RAMSter可以提供交換集群)。不論如何,我們都需對我們的內核優化結果進行測試,以構建一個穩定的生產環境。
簡單的內核優化還遠遠不夠。本文只是一個開始,以後我們將為大家介紹如何優化系統與計劃作業的調度,以幫助我們自動完成大部分配置,不論是在虛擬環境還是物理環境!(張志平/編譯)
原文鏈接:Optimizing your Linux server for memory-based NoSQL databases