bypass
bypass,就是可以通過特定的觸發狀態(斷電或死機)讓兩個網絡不通過網絡安全設備的系統,而直接物理上導通,所以有了Bypass后,當網絡安全設備故障以后,還可以讓連接在這台設備上的網絡相互導通,當然這個時候這台網絡設備也就不會再對網絡中的封包做處理了。
ByPass Mode(略過模式或旁路模式),泛指在一個系統的正常流程中,有一堆檢核機制,而“ByPass Mode”就是當檢核機制發生異常,無法在短期間內排除時,使系統作業能繞過這些檢核機制,使系統能夠繼續運行的作業模式。
numa
numa是一種關於多個cpu如何訪問內存的架構模型,現在的cpu基本都是numa架構,linux內核2.5開始支持numa。
numa架構簡單點兒說就是,一個物理cpu(一般包含多個邏輯cpu或者說多個核心)構成一個node,這個node不僅包括cpu,還包括一組內存插槽,也就是說一個物理cpu以及一塊內存構成了一個node。每個cpu可以訪問自己node下的內存,也可以訪問其他node的內存,但是訪問速度是不一樣的,自己node下的更快。
numactl --hardware命令可以查看node狀況。
通過numactl啟動程序,可以指定node綁定規則和內存使用規則。可以通過cpunodebind參數使進程使用固定node上的cpu,使用localalloc參數指定進程只使用cpu所在node上分配的內存。如果分配的node上的內存足夠用,這樣可以減少抖動,提供性能。如果內存緊張,則應該使用interleave參數,否則進程會因為只能使用部分內存而out of memory或者使用swap區造成性能下降。
NUMA的內存分配策略有localalloc、preferred、membind、interleave。
-
localalloc規定進程從當前node上請求分配內存;
-
preferred比較寬松地指定了一個推薦的node來獲取內存,如果被推薦的node上沒有足夠內存,進程可以嘗試別的node。
-
membind可以指定若干個node,進程只能從這些指定的node上請求分配內存。
-
interleave規定進程從指定的若干個node上以RR(Round Robin 輪詢調度)算法交織地請求分配內存。
大頁內存
我們知道,CPU是通過尋址來訪問內存的。32位CPU的尋址寬度是 0~0xFFFFFFFF ,16^8 計算后得到的大小是4G,也就是說可支持的物理內存最大是4G。
但在實踐過程中,碰到了這樣的問題,程序需要使用4G內存,而可用物理內存小於4G,導致程序不得不降低內存占用。
為了解決此類問題,現代CPU引入了 MMU(Memory Management Unit 內存管理單元)。
MMU 的核心思想是利用虛擬地址替代物理地址,即CPU尋址時使用虛址,由 MMU 負責將虛址映射為物理地址。
MMU的引入,解決了對物理內存的限制,對程序來說,就像自己在使用4G內存一樣。
進程線程mmu
https://www.zhihu.com/zvideo/1469706912229429248
內存分頁(Paging)是在使用MMU的基礎上,提出的一種內存管理機制。它將虛擬地址和物理地址按固定大小(4K)分割成頁(page)和頁幀(page frame),並保證頁與頁幀的大小相同。
這種機制,從數據結構上,保證了訪問內存的高效,並使OS能支持非連續性的內存分配。
在程序內存不夠用時,還可以將不常用的物理內存頁轉移到其他存儲設備上,比如磁盤,這就是大家耳熟能詳的虛擬內存swap。
在上文中提到,虛擬地址與物理地址需要通過映射,才能使CPU正常工作。
而映射就需要存儲映射表。在現代CPU架構中,映射關系通常被存儲在物理內存上一個被稱之為頁表(page table)的地方。
如下圖:

從這張圖中,可以清晰地看到CPU與頁表,物理內存之間的交互關系。
進一步優化,引入TLB(Translation lookaside buffer,頁表寄存器緩沖)
由上一節可知,頁表是被存儲在內存中的。我們知道CPU通過總線訪問內存,肯定慢於直接訪問寄存器的。
為了進一步優化性能,現代CPU架構引入了TLB,用來緩存一部分經常訪問的頁表內容。
如下圖:

對比前面那張圖,在中間加入了TLB。
為什么要支持大內存分頁?
TLB是有限的,這點毫無疑問。當超出TLB的存儲極限時,就會發生 TLB miss,之后,OS就會命令CPU去訪問內存上的頁表。如果頻繁的出現TLB miss,程序的性能會下降地很快。
為了讓TLB可以存儲更多的頁地址映射關系,我們的做法是調大內存分頁大小。
如果一個頁4M,對比一個頁4K,前者可以讓TLB多存儲1000個頁地址映射關系,性能的提升是比較可觀的。
調整OS內存分頁
在Linux和windows下要啟用大內存頁,有一些限制和設置步驟。
Linux:
限制:需要2.6內核以上或2.4內核已打大內存頁補丁。
確認是否支持,請在終端敲如下命令:
# cat /proc/meminfo | grep Huge
HugePages_Total: 0
HugePages_Free: 0
Hugepagesize: 2048 kB # hugepagesize設置見文檔:https://www.jianshu.com/p/b9470fc331dd
如果有HugePage字樣的輸出內容,說明你的OS是支持大內存分頁的。Hugepagesize就是默認的大內存頁size。
接下來,為了讓JVM可以調整大內存頁size,需要設置下OS 共享內存段最大值 和 大內存頁數量。
共享內存段最大值
建議這個值大於Java Heap size,這個例子里設置了4G內存。
# echo 4294967295 > /proc/sys/kernel/shmmax
大內存頁數量
# echo 154 > /proc/sys/vm/nr_hugepages
這個值一般是 Java進程占用最大內存/單個頁的大小 ,比如java設置 1.5G,單個頁 10M,那么數量為 1536/10 = 154。
注意:因為proc是內存FS,為了不讓你的設置在重啟后被沖掉,建議寫個腳本放到 init 階段(rc.local)。
Windows:
限制:僅支持 windows server 2003 以上server版本
操作步驟:
-
Control Panel -> Administrative Tools -> Local Security Policy
-
Local Policies -> User Rights Assignment
-
雙擊 “Lock pages in memory”, 添加用戶和組
-
重啟電腦
注意: 需要管理員操作。