適用於 Solaris 2.6 的 Solaris Resource Manager 1.0 系統管理指南(SPARC 平台版)

第 7章 記憶體限制、處理記憶體限制以及處理計數限制

管理員可以利用 Solaris Resource Manager 來控制﹕

虛擬記憶體的控制屬性(總計)

有數種系統屬性可用來記錄虛擬記憶體使用量,並且指派其限制。

用來管理記憶體使用量的系統屬性為﹕

memory.myusage

一個 lnode 的 memory.myusage 屬性等於目前附加至 lnode 的所有處理虛擬記憶體使用量總數。

memory.usage

一個 lnode 的 memory.usage 屬性等於其 memory.myusage 屬性及其子 lnode 的 memory.usage 屬性總數。

memory.limit

memory.limit 屬性被應用於 memory.usage 屬性。它會限制附加至 lnode 的所有處理以及所有成員 lnode 的總記憶體使用量。

處理記憶體的控制屬性(每個-處理)

下列的系統屬性可用來記錄處理使用量並指派其限制。

memory.plimit

一個 lnode 的memory.plimit 屬性是一種每個-處理限制,分別應用於附加至其上及其任何成員的每個處理的記憶體使用量。

記憶體限制技術性說明

每當一個處理嘗試增加其記憶體大小時,就會受到其所附加的 lnode 記憶體限制(總計及每個-處理)。處理共有五種增加其記憶體大小的方法﹕

  1. 呼叫一個配置常式,如 malloc(3C),可以產生 sbrk(2) 系統呼叫的引動。如果超出一個記憶體限制,呼叫會回傳一個錯誤,其中 errno 設定為 ENOMEM。

  2. 擴展堆疊以造成一個堆疊錯誤,通常可以讓處理獲得額外的一個記憶體頁面。如果超出一個記憶體限制,處理會收到一個 SIGSEGV 信號。

  3. mmap(2) 的使用。

  4. 使用 fork(2)。子位址空間在仍由雙親處理擁有時被複製。在複製的過程中,新的位址空間不會超出 memory.plimit,因為雙親必須已經在此限制之內;然而配置必須受到 memory.limit 的限制。

  5. 使用 exec(2)。在一個 exec 期間,會因為放棄舊的位址空間而使一開始的記憶體使用量減少。然而如果新程式的位址空間比較大,因而導致超出限制,那麼 exec 可能會失敗。

動態再設置及虛擬記憶體限制

Enterprise 10000 系統所含的動態再設置 (DR) 功能對於 lnode 的虛擬記憶體限制影響有限。明確地說,DR 可以在系統啟動與執行期間,從系統中新增或移除實體記憶體。(系統的虛擬記憶體庫包括所有的實體記憶體,加上設置入系統的交換空間。)此外,swap(1M) 指令可以用在任何 Solaris 系統上以從系統中新增 (-a) 或刪除 (-d) 交換空間。因此虛擬記憶體總數量會在操作間增加或減少。

這會間接影響 Solaris Resource Manager 對虛擬記憶體採行的限制。因為虛擬記憶體是以絕對單位(而非配分)來管理,當系統的資源在操作中變更時,有效限制並不變更。(請注意這個行為與處理機的動態再設置不同,如"動態再配置"中所述。)

處理計數的控制屬性

用來管理處理使用量(處理的數目)的系統屬性為﹕

process.myusage

一個 lnode 的process.myusage 屬性等於附加至 lnode 之上的處理數。

process.usage

一個 lnode 的 process.usage 屬性等於其 process.myusage 屬性及其子 lnode 的 process.usage 屬性總數。

process.limit

process.limit 屬性是一種應用至 lnode 的 process.usage 屬性之上的限制,它可以限制同時附加至 lnode 及所有成員 lnode 的處理計數。

處理計數的技術性說明

fork(2)fork1(2) 以及 vfork(2) 系統呼叫可用來建立新的處理。如果導致處理限制超出的話,系統呼叫會失敗,然後回傳一個 EAGAIN 錯誤。大多數的程式會將 EAGAIN 解譯為一個系統資源的暫時性內存,並且在短暫的睡眠之後再試著 fork (派生)一次。如果是因為一個 Solaris Resource Manager 的限制而導致 fork 失敗,可能會造成無限時間的迴圈;因為直到受影響的 lnode 設定限制之前,每次重試都會一直回傳一個 EAGAIN。