複製鏈接
請複製以下鏈接發送給好友

動態內存

鎖定
動態內存(Dynamic Memory),使用户能夠指定虛擬操作系統啓動的RAM容量,並將平台可用的系統內存最大化。
中文名
動態內存
外文名
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釋放空間,不然會造成內存泄漏