close

http://openvz.org/UBC_secondary_parameters

有關UBC的次要參數說明,

在此將它中文白化一下,僅供各位參考用,同時也給自己做個記錄

因為牽扯太多作業系統的觀念了,如果有誤,也請各位包函~

UBC secondary parameters有七個,分別為 kmemsizetcpsndbuftcprcvbufothersockbufdgramrcvbufoomguarpagesprivvmpages

次要UBC參數是直接連接到主要參數的,同時也不可以隨意設定。


 @kmemsize

作業系統核心配置的不可交換記憶體區(unswappable memory),以 Bytes 計算。

核心內部資料結構(kernel internal data)用來處理容器程序,此不包含網路暫存空間,這些資料結構存放於電腦的第一個 GB 的記憶體當中,稱為「low memory」區域。

x86 的 low_memory 區域通常位於 832MB 之前,可被核心直接存取,x64 無 low_memory 區,因為 x64 的核心可以存取任的記憶體區域。

然後這個參數與另一個參數 numproc 相關聯,每個程序消耗了一定量的核心記憶體,

通常為 24KB~60KB 不等,甚至更大的程序則需要更多的核心記憶體。

有一個安全的間隔值(10%)在 kmemsize 的 barrier 與 limit 間是重要的。

kmemsize 的 barrier 與 limit 設定值相同的話,可能會引發作業系核心刪除容器的程序以確保用量在 limit 規範之下。

kmemsize 值無法設定太高,因為包含全部 containers 的 kmemsize、再加上 socket 的暫存空間,都必需受限在作業系統硬體可以取用的資源。


 @tcpsndbuf

用來傳送 TCP 連線資料所使用的緩衝區大小,這緩衝區也位於 low memory 區域。

該參數與另一個參數 numtcpsock 有相依性,得替每一個 socket 配置最小量的緩衝空間。

openvz-2013-08-07-10-20-21.png  

如果無法滿足以上限制,某些網路連線可能會停滯,而無法傳送資料。

設定過高的 tcpsndbuf 非必要,不一定會增加網路通訊(network communications)的效能。

tcpsndbuf 到達 limits 時,不會對應用程式造成過大的負面影響,只會降低網路通訊的效能。

tcpsndbuf 值無法設定太高,因為包含全部 containers 的 tcpsndbuffkmemsize、其它 socket 的暫存空間,都必需受限在作業系統硬體可以取用的資源。


 @tcprcvbuf

用來暫存接收所有來自 TCP 網路連線所需要的總緩衝空間,這緩衝區也位於 low memory 區域。

該參數與另一個參數 numtcpsock 有相依性,得替每一個 socket 配置最小量的緩衝空間。

openvz-2013-08-07-11-10-21.png  

如果無法滿足以上限制,某些網路連線可能會停滯,而無法接受資料,數分鐘後連線就會中斷。

tcpsndbuf 相同,tcprcvbuf 設定過高非必要,不一定會增加網路通訊)的效能,tcprcvbuf 到達 limits 時,不會對應用程式造成過大的負面影響,只會降低網路通訊的效能。

如果 tcprcvbuf 到達 barrier 值的時間太長所受到的傷害會比 tcpsndbuf 少,長時間超過 barrier 可能會造成某些連線終止。

tcprcvbuf 值無法設定太高,包含全部 containers 的 tcprcvbuffkmemsize、其它 socket 的暫存空間,都必需受限在作業系統硬體可以取用的資源。


 @othersockbuf

用於系統內部程序間(between processes)本地(Unix-Domain)連線(如連接本地端資料庫伺服器),傳送 UDP 還有其它 datagram 協定的緩衝區大小。

該參數與另一個參數 numothersock 有相依性,設定必需滿足以下:

openvz-2013-08-07-11-38-21.png  

為了提高內部(Unix-Domain)通訊的效能,增加 othersockbuf 的 limits 是必要的。

tcpsndbuf 相同的是,othersockbuf 到達 limits 時,只會降低網路通訊的效能,而不會影響功能。

othersockbuf值無法設定太高,包含全部 containers 的 othersockbufkmemsize、其它 socket 的暫存空間,都必需受限在作業系統硬體可以取用的資源。


 @dgramrcvbuf

用來接收 UDP 還有其它 datagram 協定的緩衝區大小。

該參數與另一個參數 numothersock 有相依性,dgramrcvbuf 的 limits 通常不需要太高,假如容器需要傳送接收非常大的 datagrams 的話,othersockbufdgramrcvbuf 的 barrier 都必需要提高。

不像其它的 socket buffer參數,dgramrcvbuf 的 barrier 必需設定成 limit。

dgramrcvbuf 值無法設定太高,包含全部 containers 的 dgramrcvbufkmemsize、其它 socket 的暫存空間,都必需受限在作業系統硬體可以取用的資源。


 @oomguarpages

保證可得多少記憶體當記憶體用完時(Out-Of-Memory kill guarantee)oomguarpages 與 vmguarpages 有關聯。

當應用程式消耗了電腦有的記憶體後,系統會進入記憶體用完的狀態(Out-Of-Memory condition),作業系統會開始殺掉容器(containers)的程序以得到更多可用的記憶體空間,以避免系統本身的死亡。雖然在一般的系統負載下,這種情況很少發生。但當記憶體空間用完的時後,刪除程序卻是作業系統一般的反應。

oomguarpages參數計算(accounts)了特定容器程序所使用的總記憶體量和交換空間,barrier值則是 OOM 的保證。

當 OOM 發生時,如果 oomguarpages 加上kmemsize、socket buffer 用量低於 barrier 設定值,系統保證不會刪除該容器裡的程序。若系統 OOM 發生時,有多個容器 oomguarpages 的用量超出了設定值,則容器裡超出最多的應用程序將會先被殺掉,同時 failcnt 的值會增加。

如果管理者需要確保應用程式不會被強制刪除,將 privvmpages 的 limits 設定不要超過 oomguarpages,則能顯著的降低被刪除的可能性,設定成1/2的話,則能完全避免發生。但這樣子的配置是不受歡迎的,因這樣會顯著的降低硬體的使用率。

oomguarpages 的 limits 值在目前的版本中的意義是不明的。

所有 containers 的 oomguarpages 的總和不應該超出電腦的實體容量,否則當 OOM 發生時,容器裡一些保證層級的服務或系統服務(system daemons)可能會被刪除。


@privvmpages

記憶體配置限制,單位 pages (通常指 4096 Bytes)。

privvmpages 參數可以控制應用程式分配的記憶體總量。

privvmpages 參數的 barrier 與 limits 值控制了分配記憶體總大小的上邊界,但這上邊界不保證容器可以分配到多少記體,也不保證其它的容器可以公平分配共享記憶體,最主要的控制機制還是在 vmgurapages

privvmpages 統計了記憶體配置的情況(但可能未使用中)。統計出來的值是估算應用程式啟動時實際上會消耗的記憶體,而實際上會消耗的記憶體是被統計在 oomguarpages 裡的。

privvmpages 統計的記憶體用量也許不是實際使用的,而所有容器的 privvmpages 值總和可能會超過電腦的記憶體和交換區(swap)的大小。

應該要有一個安全的區間在 privvmpages 的 barrier 與 limits 值之間,用來降低記憶體分配失敗的次數。這個區間將會被用來處理「高優先權」的記憶體配置,像是stack expansion,一般優先權的記憶體配置在 privvmpages 到達 barrier 值就會失敗了。

privvmpages 值應與電腦的實體資源相關。更重要是,不允許任何容器配置了資源的極大部分,而降級了其它容器服務的程度。

 


所有的次要參數都與記憶體有關,與記憶體有關的參數限制總額不能超出電腦實體的資源。相關的限制請參考 UBC systemwide configuration,這些限制非常重要,如果違反,可能因任何容器而卡住了整個系統。

arrow
arrow
    全站熱搜

    creative1223 發表在 痞客邦 留言(0) 人氣()