動態記憶體

動態記憶體(Dynamic Memory),使用戶能夠指定虛擬作業系統啟動的RAM容量,並將平台可用的系統記憶體最大化。

定義

Integrity VM 的可選功能,通過該功能,您可以更改虛擬機使用的物理記憶體量,而無須重新引導該虛擬機。在 Integrity VM 的本發行版中,只能在 HP-UX guest 虛擬機上使用動態記憶體。

例如,該功能允許將作為 Servicegard 節點的 guest 虛擬機用作多個 Serviceguard 程式包的備用伺服器。當程式包故障切換到 guest 虛擬機時,可在故障切換之前、之後或期間更改 guest 虛擬機的記憶體,使其符合程式包的要求。要使用動態記憶體,guest 虛擬機必須安裝 guest 虛擬機管理軟體。

管理動態記憶體

在 VM Host 中,動態記憶體軟體隨 Integrity VM 一起提供。可使用 hpvmcreatehpvmmodifyhpvmclone 命令的 -x 選項在 VM Host 上管理動態記憶體。-x 選項可將各種配置參數與 guest 虛擬機(包括 guest 虛擬機的動態記憶體和網路管理)相關聯。 表 1提供了用於動態記憶體的 -x 關鍵字的完整列表。

表 1 動態記憶體控制命令選項

關鍵字值對 說明
dynamic_memory_control={1|0} 指定 guest 虛擬機上具有足夠許可權的用戶(例如 root)能否在 guest 虛擬機運行時更改動態記憶體值。要禁用 guest 虛擬機端的動態記憶體控制項,請指定 0(零)。如果 guest 虛擬機不處於活動狀態,唯一的影響是將修改 guest 虛擬機配置檔案。在正在運行的 guest 虛擬機上,更改可立即生效。
ram_dyn_type={none|any|driver} 指定 guest 虛擬機的動態記憶體控制項的類型。將此配置參數設定為 none 時,將禁用動態記憶體。這是預設設定。如果在啟用動態記憶體的情況下運行 guest 虛擬機,並且將此值設定為 none,則會修改 guest 虛擬機配置檔案,以便刪除所有動態記憶體範圍和控制信息。 如果將此配置參數設定為 any,則下一次引導 guest 虛擬機時將確定是否在該 guest 虛擬機上啟用動態記憶體。如果已載入動態記憶體驅動程式,則該參數的值將更改為 driver。如果未載入或未找到任何驅動程式,則不會更改該值。 將此配置參數設定為 driver 時,guest 虛擬機的動態記憶體控制項和範圍可正常運行。根據當前設定或預設設定,可顯示訊息,指示重置動態記憶體範圍值以便匹配當前記憶體範圍設定。如果使用 -r 選項更改可用 guest 虛擬機記憶體值,則會驗證動態記憶體值是否在指定範圍內,並進行相應的修改。
ram_dyn_min= 記憶體量 指定可向 guest 虛擬機動態分配的最小記憶體量。ram_dyn_min 值必須大於最小記憶體(由 hpvmstatus 命令顯示),且小於 ram_dyn_max 值。
ram_dyn_max= 記憶體量 指定可向 guest 虛擬機動態分配的最大記憶體量。ram_dyn_max 的值必須大於 ram_dyn_min 的值。
ram_dyn_target_start= 記憶體量 指定啟動 guest 虛擬機時動態記憶體驅動程式嘗試訪問的記憶體量。ram_dyn_target_start 的值必須大於 ram_dyn_min 參數,且小於或等於 ram_dyn_max 參數。guest 虛擬機啟動時,最初會訪問 guest 虛擬機記憶體大小(由 -r 選項指定),然後動態記憶體驅動程式會將記憶體降低到 ram_dyn_target_start 參數的值。
ram_target={0|start| 記憶體量} 設定 guest 虛擬機的當前記憶體大小。 ram_target 關鍵字僅在 hpvmmodify 命令和 hpvmmgmt 命令中有效。指定為 0(零)時,動態記憶體驅動程式會將 guest 虛擬機上的記憶體降至適當的最小值,而不會強制對 guest 虛擬機記憶體進行頁面換出操作。由於 guest 虛擬機的運行會發生更改,因此,最小值將隨時間而變化。指定 start 時,guest 虛擬機的動態記憶體大小會增大到使用 -r 選項指定的分配值。該參數為動態參數,只能在活動 guest 虛擬機上使用。

使用動態記憶體

預設情況下,不啟用動態記憶體。要配置虛擬機以使用動態記憶體,請輸入 hpvmcreatehpvmmodifyhpvmclone 命令。包含以下 -x 選項以設定初始值:

-x ram_dyn_type = any | driver-x ram_dyn_min = minimum size for memory size changes-x ram_dyn_max = maximum size for memory size changes

可在引導過程的早期階段配置虛擬機,以減少其記憶體大小,從而使虛擬機在 VM Host 系統上保持可用並使記憶體開銷較低。使用以下 -x 選項可啟用此功能:

-x ram_dyn_target_start = memory size after boot

可在同一命令行上提供多個動態記憶體關鍵字。例如,要啟用動態記憶體並配置名為 compass1 的 guest 虛擬機以便在引導進程初期減少其大小,請輸入以下命令:

# hpvmmodify -P compass1 -r 6G \-x ram_dyn_type=any \-x ran_dyn_min=1222M \-x ram_dyn_max=6G \-x ram_dyn_target_start=2G

該命令指定下列值:

將虛擬機記憶體大小設定為 6 GB。

通過使用任何可用的動態記憶體支持啟用了動態記憶體。

此虛擬機可以減少至的最小記憶體量為 1222 MB。

此虛擬機可以增加至的最大記憶體量為 6 GB。

引導後減少至的記憶體量為 2 GB。

首次配置動態記憶體功能時,如果虛擬機正在運行,必須重新引導此虛擬機,才能使配置更改生效。

查看動態記憶體

可使用 Integrity VM 標準命令,為每個 guest 虛擬機顯示動態記憶體參數和狀態。例如,對於名為 compass1 的 guest 虛擬機,使用 hpvmstatus 命令可顯示以下動態記憶體信息:

# hpvmstatus -V -P compass1...[Dynamic Memory Information] Type : driver Minimum memory : 1222 MB Target memory : 2103 MB Maximum memory : 6144 MB Current memory : 2103 MB Comfortable minimum : 2167 MB Boot memory : 6135 MB Free memory : 125 MB Available memory : 286 MB Memory pressure : 0 Memory chunksize : 65536 KB Driver Mode(s) : STARTED ENABLED...

表 2 說明了 hpvmstatus 命令和 hpvmmgmt 命令顯示的動態記憶體的特性。

表2 動態記憶體的特性

特性 設定 說明
類型 none 不支持動態記憶體
any 已在主機上配置動態記憶體,但是 guest 虛擬機上的動態記憶體子系統未啟動並報告實現的類型。
driver 在驅動程式中實現動態記憶體,且不使用 Guest 虛擬機作業系統在線上添加/刪除功能。
OLAD 使用 Guest 虛擬機作業系統在線上添加/刪除功能實現動態記憶體。
最小記憶體量 值M(兆位元組)或 值G(千兆位元組) ram_target 和 ram_dyn_target_start 的下限。
目標記憶體 值M(兆位元組)或 值G(千兆位元組) guest 虛擬機的目標記憶體大小,可使用 ram_target 或 ram_dyn_target_start 進行設定。
最大記憶體量 值M(兆位元組)或 值G(千兆位元組) ram_target 和 ram_dyn_target_start 的上限。
當前記憶體 值M(兆位元組)或 值G(千兆位元組) guest 虛擬機的當前記憶體大小(通常等於目標記憶體)。
適當的最小值 值M(兆位元組)或 值G(千兆位元組) ram_target 的值,可用於降低 guest 虛擬機的記憶體,但允許使用足夠的記憶體資源來繼續運行最少的工作負荷。
引導記憶體 值M(兆位元組)或 值G(千兆位元組) 向 guest 虛擬機作業系統提供的虛擬機中的物理記憶體大小。
空閒記憶體 值M(兆位元組)或 值G(千兆位元組) guest 虛擬機中的空閒記憶體量。
可用記憶體 值M(兆位元組)或 值G(千兆位元組) guest 虛擬機中已由用戶進程分配但未鎖定的記憶體量。該記憶體可用於分頁。
記憶體壓力 介於 0 至 100 之間的一個值,用於指示記憶體不足和分頁。值越大,系統記憶體不足的時間越長。通常,記憶體壓力值接近 100 表示系統已掛起。
記憶體塊大小 增大或減小 guest 虛擬機記憶體時動態記憶體使用的分配塊大小。
驅動程式模式 started 動態記憶體可更改 guest 虛擬機的記憶體大小。
enabled 取代 started 的控制。
guestctl 啟用 guest 虛擬機端控制項。

在 VM Host 上修改虛擬機的記憶體大小

配置動態記憶體後,可以以塊大小 (64 MB) 為增量,將虛擬機記憶體大小更改為介於最小大小 ( ram_dyn_min) 和最大大小 ( ram_dyn_max) 之間的任意值。請使用 hpvmmodify 命令的以下 -x 選項更改記憶體大小:

# hpvmmodify -P compass1 -x ram_target = new memory size

管理動態記憶體

預設情況下,從 guest 虛擬機管理動態記憶體的功能將被禁用,必須通過 VM Host 啟用此功能。如果未啟用此功能,則可顯示動態記憶體信息,但是無法更改記憶體大小。

可使用 hpvmcreatehpvmmodifyhpvmclone 命令,並包含 -x dynamic_memory_control 選項。指定 1 作為該選項的參數。例如,在 VM Host 系統中,輸入以下命令可在名為 compass1 的 guest 虛擬機上啟用動態記憶體控制項:

# hpvmmodify -P compass1 -x dynamic_memory_control=1

從 Guest 虛擬機查看動態記憶體信息

可在 HP-UX guest 虛擬機上使用 hpvmmgmt 命令管理和查看動態記憶體信息。安裝 guest 虛擬機管理軟體時將安裝該命令。

表 3說明了 hpvmmgmt 命令的選項。

表 3 hpvmmgmt 命令的選項

-l 類型 指定要列出相關詳細信息的數據類型。對於 類型,請輸入 ram
-l 類型 -t 間隔 允許連續監視和查看動態 ram 值。對於 間隔,請指定兩次提取實時數據之間的秒數。
-t 間隔 允許 hpvmmgmt 命令使用針對 間隔參數指定的值連續重新提取請求的數據類型。
-v 顯示 hpvmmgmt 命令的版本號。
-V 顯示有關虛擬機的詳細信息(詳細模式)。
-M 以機器可讀格式顯示詳細的屬性和資源信息。
-X 以 XML 格式顯示詳細的屬性和資源信息。
-x ram_target={0 | start | 記憶體量} 指定 guest 虛擬機 RAM 目標,其中: 0 表示 guest 虛擬機動態記憶體將被降低到一個適當的最小值。start 表示 guest 虛擬機動態記憶體將被設定回引導時的值。amount 是 guest 虛擬機的特定目標記憶體大小。

例如,在 guest 虛擬機上,使用 hpvmmgmt 命令列出動態記憶體信息。輸入以下命令:

# hpvmmgmt -l ram [Dynamic Memory Information] ======================================= Type : driver Current memory : 6135 MB Target memory : 6135 MB Comfortable minimum : 2167 MB

要顯示詳細信息,請包含 —V 選項。例如:

# hpvmmgmt -V -l ram [Dynamic Memory Information] ======================================= Type : driver Current memory : 2103 MB Target memory : 2103 MB Comfortable minimum : 2423 MB Minimum memory : 1222 MB Maximum memory : 6144 MB Boot memory : 6135 MB Free memory : 124 MB Available memory : 286 MB Memory pressure : 12 Memory chunksize : 65536 KB Driver Mode(s): STARTED ENABLED GUESTCTL

在 Guest 虛擬機上修改虛擬機的記憶體大小

配置和啟用動態記憶體功能後,可以一個塊的大小 (64 MB) 為單位,將虛擬機記憶體大小更改為介於最小大小 (ram_dyn_min) 和最大大小 (ram_dyn_max) 之間的任意值。可使用 hpvmmgmt 命令的以下 -x 選項:

# hpvmmgmt -x ram_target=memory size

例如,要將 guest 虛擬機記憶體大小修改為 4 GB,請輸入以下命令:

# hpvmmgmt -x ram_target=4096MAttempting to increase memory from 2103 MB to 4096 MB.Successfully began to change ram_target to 4096 MB.

排除故障

動態記憶體限制

使用動態記憶體具有下列限制:

虛擬機大小不能增加到其初始引導大小(如 -r 選項所指定)以上。如果虛擬機記憶體已產生碎片,則嘗試減少虛擬機大小可能會失敗或需要很長時間。如果無法將虛擬機大小降低到所需大小,請通過設定新的目標大小來異常中止操作。增加虛擬機大小需要 VM Host 上具有一定的可用記憶體。如果 VM Host 記憶體不足,該操作可能需要很長時間才能完成,並可能失敗。如果 ram_target 和 ram_dyn_target_start 的值不在 ram_dyn_min 和 ram_dyn_max 值之間,則會發出一條警告。

VM Host 資源注意事項

HP-UX 支持“大型頁面”記憶體管理功能,可用於提高性能。Integrity VM 可通過確保在虛擬機啟動時分配容量最大的可用頁面來實現此功能。一旦分配並鎖定這些頁面之後,將無法更改其大小。此限制可使大型頁面的碎片降至最低。

該功能會限制可在 VM Host 系統上運行的軟體類型。如果 VM Host 系統支持虛擬機以外的其他工作負荷,則大型頁面可能會產生碎片,並可能導致新啟動的虛擬機性能降低。

動態記憶體增加了 VM Host 記憶體產生碎片的可能性。動態記憶體的當前實現方式可釋放向虛擬機分配的記憶體部分。必須以大型連續塊為單位執行這些操作;否則,減少虛擬機大小會使為該虛擬機分配的 VM Host 記憶體產生碎片。可通過軟體防止產生此潛在碎片,即以物理連續記憶體的最小塊大小 64 MB 的倍數為單位減少虛擬機大小。

Guest 虛擬機資源注意事項

運行某一工作負荷的系統正常運行期間,大型頁面可能會逐漸產生碎片。VM Host 和運行 HP-UX 作業系統的虛擬機都會出現這種情況。如果虛擬機記憶體產生碎片,動態記憶體子系統將無法減少 guest 虛擬機的大小。這是因為此減少大小的操作使用最小塊大小。如果動態記憶體無法刪除至少 64 MB 的物理連續 guest 虛擬機記憶體,則不會減少大小。

指定足夠的 Guest 虛擬機記憶體

如果將 ram_dyn_target_start 的值設定得過小,則 guest 虛擬機作業系統可能會在引導時掛起或崩潰。此種情況下,guest 虛擬機無法訪問足夠的記憶體量。通常,降低分配給 HP-UX guest 虛擬機的記憶體時降幅不能超過其分配的記憶體大小的 75%。對於配置了 2 GB 記憶體的虛擬機,其記憶體降低幅度不能超過 50%。

如果 guest 虛擬機在引導時崩潰,請在 VM Host 上使用 hpvmmodify 命令增大 ram_dyn_target_start 參數的值。例如,要增加名為 compass1 的 guest 虛擬機的記憶體大小,請在 VM Host 上輸入以下命令:

# hpvmmodify -P compass1 -x ram_dyn_target_start=2GB

設定該參數之後,請重新引導該 guest 虛擬機。

如果 guest 虛擬機掛起,請在 VM Host 上使用 hpvmstatus 命令查看 guest 虛擬機上的記憶體統計信息。例如:

# hpvmstatus -V -P compass1...[Dynamic Memory Information] Type : driver Minimum memory : 1222 MB Target memory : 2103 MB Maximum memory : 6144 MB Current memory : 2103 MB Comfortable minimum : 2167 MB Boot memory : 6135 MB Free memory : 0 MB Available memory : 286 MB Memory pressure : 100 Memory chunksize : 65536 KB Driver Mode(s) : STARTED ENABLED...

該問題的一個指示為可用記憶體量過小或為零,並且記憶體壓力值較大 (100)。如果出現這些指示,請在 VM Host 上使用 hpvmmodify 命令增加 guest 虛擬機的記憶體大小。然後,按正常方式引導該 guest 虛擬機。

實際記憶體分配可能不相同

如果指定的 ram_target 或 ram_dyn_target_start 參數的值所更改的記憶體大小不是 64 MB 的倍數,則會重置目標值。

例如,如果指定 6 GB 的記憶體,HP-UX guest 虛擬機實際可訪問 6135 MB 的記憶體。如果嘗試將記憶體大小設定為 2048 MB,則實際刪除的記憶體大小為 4087 MB。由於它不是 64 MB 的倍數,因此會將目標記憶體大小重置為 2103 MB。

在 Guest 虛擬機和 VM Host 上啟用動態記憶體

在 VM Host 系統中使用動態記憶體參數之前,必須在 guest 虛擬機上安裝 guest 虛擬機管理軟體。例如,如果未安裝 guest 虛擬機管理軟體, hpvmstatus 命令將顯示以下內容:

# hpvmstatus -V -P compass1...[Dynamic Memory Information] NOTE: Dynamic data unavailable, configured values onlyType : driverMinimum memory : 1024 MBTarget memory : 2048 MBMaximum memory : 3072 MB...

如果嘗試從 VM Host 修改 guest 虛擬機的動態記憶體,則會顯示下列錯誤:

# hpvmmodify -x ram_target=2048M -P compass1hpvmmodify: ERROR (compass1): Query to dynamic memory driver failed: Function is not available.hpvmmodify: Failed to set ram_target.hpvmmodify: Unable to modify the guest.

如果嘗試從 guest 虛擬機修改動態記憶體,則會顯示下列錯誤:

# hpvmmgmt -V -l ramDynamic memory driver not found on guest.hpvmmgmt: Unable to continue.# hpvmmgmt -x ram_target=2048Failed to open dynamic memory driver, error: No such device.Failed to set dynamic value error: No such devicehpvmmgmt: Unable to continue.

在升級 Integrity VM 時升級 Guest 虛擬機工具包

動態記憶體軟體包含兩個組件:VM Host 支持和 HP-UX guest 虛擬機支持。要使動態記憶體正常運行,以上兩個組件的版本級別必須相同。升級 Integrity VM 時,還必須在 guest 虛擬機上安裝新的 guest 虛擬機工具包(如果不再支持 guest 虛擬機作業系統,則應同時升級該作業系統)。在此升級過程中,動態記憶體可能無法運行。

如果版本不匹配,啟動 guest 虛擬機時會向 VM Host 的 syslog 檔案 (/var/adm/syslog/syslog.log) 寫入一條訊息。例如:

vmunix: (hpvmdvr) Dynamic memory version mismatch Guest 5. Please update the guest kit

此示例表明編號為 5 的虛擬機上的 guest 虛擬機管理軟體工具包已過期。要確定編號為 5 的虛擬機,請使用 hpvmstatus 命令。在以下示例中,guest 虛擬機 5 名為 dale

# hpvmstatusVirtual Machine Name VM # OS Type State #VCPUs #Devs #Nets Memory Runsysid==================== ===== ======= ========= ====== ===== ===== ======= ========chip 1 HPUX On (OS) 2 1 1 3 GB 0dale 5 HPUX On (OS) 2 1 1 3 GB 0

分配函式解析

對於指針,正確的分配動態記憶體是十分重要的,本文將著重闡述動態記憶體分配函式malloc,calloc,realloc以及memset的用法。

i.對於malloc,在終端輸入 #:man malloc可以知道函式原型是

Void *calloc(size_t size) ,包含在庫函式 stdlib.h中,作用是在記憶體的堆區分配一個大小為size的連續空間,如果分配記憶體成功,函式返回新分配記憶體的首地址,否則,返回NULL,注意:鑒於上述這點,一般在寫程式需要判斷分配記憶體是否成功,如下程式語句:

int *p;

p=(int *)malloc(sizeof(int));

if(p!=NULL)

.................................//需要執行的語句

else

.........................//列印分配記憶體不成功出錯信息

通常造成記憶體分配失敗的原因如下:

1、 記憶體訪問越界

2、 所需連續的記憶體空間不足

ii.對於函式calloc用法大致與malloc相同,函式原型為:

void *callo(size_t num,size_t size),作用是在記憶體中分配連續大小為

num*size的空間,這一點在動態數組記憶體分配有所體現,返回值以及判斷返回是否成功與上面相同,下面重點來討論

malloc與calloc區別:

1、後者在返回指向記憶體的指針之前把它初始化為0。

2、請求記憶體數量的方式不同。malloc的參數僅僅是需要分配的記憶體位元組數;calloc的參數包括元素的數量和每個元素的位元組數。

iii.對於realloc(),函式原型是*void realloc(void *ptr,size_t size),改變ptr所指記憶體區域的大小為size長度,如果重新分配成功則返回指向被分配記憶體的指針,否則返回空指針NULL。當記憶體不再使用時,應使用free()函式將記憶體塊釋放。

有一點需要注意:當分配記憶體成功之後,應將原本的指針ptr=NULL,否則會形成野指針,可能造成系統崩潰。

提示:不論是以上那種方式申請記憶體,在申請記憶體之後,最終都要用free釋放空間,不然會造成記憶體泄漏。

相關詞條

相關搜尋

熱門詞條

聯絡我們