Linux KVM - 記憶體最佳化管理與應用

2023-10-28 19:58

本文主要是介绍Linux KVM - 記憶體最佳化管理與應用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Linux KVM 研究室

http://linuxkvm.blogspot.com/2011/06/linux-kvm_19.html

即使到現在,大部分的虛擬系統,在面對虛擬電腦記憶體的管理與分配上,所採用的方式,就是設定多少記憶體的容量,只要虛擬電腦一開機,實體電腦就會切割出多大的記憶體來讓虛擬電腦使用,例如,建立虛擬電腦時,若設定記憶體為 512 MB,只要虛擬電腦一開機,實體記憶體就會劃分出 512 MB 的記憶體給虛擬電腦使用,且每一台虛擬電腦都單獨處理,也就是說,若每一台虛擬電腦的記憶體大小都設定為 512 MB,則開啟兩台虛擬電腦,實際記憶體就必須空出 1 GB 的空間來,以此纍加,直到實體記憶體用光為止。

虛擬系統採用這樣的設計,一般來說,這樣的設計有以下的優點:

  • 簡化虛擬系統對記憶體的管理,減輕虛擬系統管理面的負擔
  • 各虛擬電腦記憶體彼此各自獨立使用,互不干擾,也互不影響
然而,上述的優點,若是站在記憶體的角度上,反而存在以下的缺點:
  • 記憶體閒置時,多出來的記憶體空間無法使用,反而造成閒置資源的浪費
  • 相同的記憶體內容,重覆在各個獨立劃分的記憶體區塊中,形成記憶體使用上的浪費
以上的缺點,當虛擬系統之內,虛擬電腦的數量增多的時候,就可以輕易的發現到記憶體明顯不足與系統遲滯的情形發生。

 Linux KVM 呢?在記憶體的管理上,它又是使用哪一種方式呢?其實,Linux KVM 本身包含三種不同的記憶體管理模式:
  1. 一次佔滿:說穿了,這就是上述一般虛擬系統的記憶體管理模式,設定多少,就一次給多少記憶體空間,適合運用在記憶體使用量大,且資料異動頻繁的系統之上,如提供資料庫服務的虛擬電腦

  2. Virtio balloonBalloon 有氣球的意思,簡單來說,就是在劃分的記憶體區塊內,塞入一個氣球,當氣球越大(佔的空間越多),就表示虛擬電腦此時使用的記憶體較少,相對來說,實體電腦(Host OS)可動用的記憶體就變多了

  3. Kernel Sharedpage MergingKSM:兩台,或兩台以上的虛擬電腦,若所用的記憶體內容都相同,那實體電腦會整合為一份,讓所有虛擬電腦共用此記憶體區塊,而不需要再新增多個相同的記憶體內容區塊給其他虛擬電腦使用,以減少記憶體的浪費

基本上,〝一次佔滿〞的記憶體設定方式,運用在大部分的虛擬系統之上,使用狀況比較單純,也因此比較沒有所謂管理方面的問題,只要實體電腦(Host OS)記憶體容量夠大,要給虛擬電腦多少的記憶體大小,就直接設定多少,等到虛擬電腦一開機,記憶體就直接被劃分出去,而至於虛擬電腦實際上記憶體的使用量是不足,或是過剩,則無法在開機狀況進行任何異動與處理,也沒也任何監控的機制,不過,〝Virtio balloon〞與〝KSM〞的記憶體管理模式,對於記憶體的管理與分配上,就比較具有兼顧效能與資源管理的功能,以下就分開介紹。


Virtio balloon

在前述中,提到〝Virtio balloon〞的記憶體管理方式,就是會在被劃分的記憶體區塊(最大記憶體容量)之中,塞入一個氣球,而這個氣球,則會將記憶體分為兩個區域,如下圖所示:



這兩區塊方別為〝Current Allocation〞或稱為〝系統初始值〞,另一區塊可稱為〝Balloon 區(氣球區)〞或是〝容量異動區〞,而〝系統初始值〞,表示虛擬電腦一開機時,至少會分配〝系統初始值〞大小的記憶體給虛擬電腦使用,若初始記憶體大小不敷使用,則會由〝容量異動區〞釋放記憶體空間給虛擬電腦使用,此時〝容量異動區〞的容量就會縮小(氣球縮小),反之,若虛擬系統閒置時,記憶體使用量小,則多出的記憶體空間,就會回到〝容量異動區〞,但不管〝容量異動區〞怎樣的變動,〝系統初始值〞與〝容量異動區〞的記憶體空間的總和,則為虛擬電腦的當初設定的最大記憶體空間(Maximum allocation)。


查詢〝Virtio balloon〞的記憶體大小

有三種方式可以得知與設定〝Virtio balloon〞的記憶體大小,分別如下:
  1. xml 檔案:xml 檔案最一開始有兩個設定標籤,一個為 〝〞,另一個則為〝〞,前者就是系統最大記憶體空間的大小,後者則為〝系統初始值〞的記憶體大小,而兩者差值,則為〝容量異動區〞的記憶體空間,也就是所謂的〝Balloon 



    備註1: xml 檔案中,記憶體空間數值的單位為 kb,而 1 MB 則為 1024 kb,以上圖的 524288 kb,其實就等同於 512 MB1024 x 512

  2. 視窗管理工具:在 virt-maneger 管理工具中,虛擬電腦的硬體資訊頁面,記憶體的欄位內,就有〝Current allocation〞與〝Maximum allocation〞這兩個記憶體設定區域




  3. 終端機查詢:virsh 的指令中,有個指令可以查詢虛擬電腦的基本資訊,在終端機輸入以下指令:

    $ sudo virsh dominfo Ubuntu1004Ubuntu1004 為欲查詢的虛擬電腦名稱)



    上圖即為指令輸出結果,紅色區域就是記憶體相關資訊

    備註2:上圖中,〝Id〞的欄位值為〝-〞,這表示目前此虛擬電腦處在關機狀態中,若以開機,則會有一組隨機數值

啟動〝Virtio balloon〞記憶體管理方式

然而,以 Ubuntu 10.04 LTS 版本來說,其內定是沒有啟動〝Virtio balloon〞的記憶體管理方式,必須先針對系統(實體電腦)進行修改,才能開啟〝Virtio balloon〞的功能,如果沒有開啟,接下來所介紹的記憶體修改方式,可是無法套用的喔!

開啟〝Virtio balloon〞功能的設定,是在實體電腦上進行,先開啟終端機,並切換到 /usr/bin 目錄,並依序進行以下動作:

$ sudo mv kvm kvm.real (若需要輸入密碼,請輸入管理員密碼)

$ sudo vim kvm (若系統無安裝 vim ,可用 nano 這套來代替)

在新開啟的 kvm 檔案內,輸入以下內容:

#!/bin/bash
exec /usr/bin/kvm.real -balloon virtio "$@"

輸入完成,存檔之後退出編輯,接著賦予檔案執行的權限:

$ sudo chmod +x kvm

這樣就完成開啟〝Virtio balloon〞的功能了。


修改〝Virtio balloon〞的記憶體大小

既然有上述三個地方可以顯示〝系統初始值〞與〝最大系統記憶體〞的記憶體空間,當然就可以進行記憶體大小型調整,其中,xml 與視窗管理工具的修改方式,比較直覺化,共同的特點,就是必須在關機的情形下,才能進行修改,而 xml 檔案修改完成之後,必須重新定義此 xml 檔案,這樣新的設定值才會套用到虛擬電腦之上。

比較特別的,就是利用 virsh 內定的指令來〝動態〞進行〝系統初始值〞記憶體大小的修改,先來查詢目前虛擬電腦記憶體的狀態,指令如下:

$ sudo virsh dominfo Ubuntu1004



直接在虛擬電腦之內查詢目前系統記憶體使用狀態(在終端機下輸入: free -m):



由上圖得知,目前記憶體的使用狀況不到 64 MB,那嘗試將記憶體閒置的空間釋放到 Balloon 區域,可以利用以下指令來縮小〝系統初始值〞,並查詢縮小之後的記憶體配置:

$ sudo virsh setmem Ubuntu1004 262144

$ sudo virsh dominfo Ubuntu1004



查詢之後,發現〝系統初始值〞的記憶體空間確實有縮小,那實際在虛擬電腦系統之內呢?在虛擬系統之內,在終端機下輸入 free -m ,其輸出如下:



這邊就可以明顯的發現,〝total〞欄位的記憶體空間縮小了,這就是動態線上調整虛擬電腦記憶體的模式。


Kernel Sharedpage MergingKSM

前面提到,兩台,或兩台以上的虛擬電腦,若所用的記憶體內容都相同,那 KSM會整合為一份共用的記憶體區塊,而不需要再新增多個相同的記憶體內容區塊,以減少記憶體的浪費,這個部分是虛擬系統會自行調整設定,只需要確認 KSM 是否有啟動就好,確認方式如下:

$ cat /etc/default/qemu-kvm (在實體電腦之內)



若看到〝KSM_ENABLED〞的數值為 1,就表示虛擬系統已經啟動 KSM 的功能了,而藉由以下指令,可以來查詢可以共用的 page 有多少:

$ cat /sys/kernel/mm/ksm/pages_sharing

系統會回應一個數值,此數值所表示的就是 page 的大小(可共用的記憶體區塊大小),啟動同系統的虛擬電腦越多,此數值就會越大,代表可共用的記憶體區塊越大。

而由另一指令,則可以查詢目前已共用的 page(記憶體區塊)的大小,指令如下:

$ cat /sys/kernel/mm/ksm/pages_shared

系統一樣會回應一個數值,而此數值則表示目前已經共用的記憶體區塊大小,如果將兩者數值相除(已共用的記憶體區塊 / 可共用的記憶體區塊),數值越大,則表示效能越好,記憶體最佳化越好。

这篇关于Linux KVM - 記憶體最佳化管理與應用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/295580

相关文章

Linux磁盘分区、格式化和挂载方式

《Linux磁盘分区、格式化和挂载方式》本文详细介绍了Linux系统中磁盘分区、格式化和挂载的基本操作步骤和命令,包括MBR和GPT分区表的区别、fdisk和gdisk命令的使用、常见的文件系统格式以... 目录一、磁盘分区表分类二、fdisk命令创建分区1、交互式的命令2、分区主分区3、创建扩展分区,然后

Linux中chmod权限设置方式

《Linux中chmod权限设置方式》本文介绍了Linux系统中文件和目录权限的设置方法,包括chmod、chown和chgrp命令的使用,以及权限模式和符号模式的详细说明,通过这些命令,用户可以灵活... 目录设置基本权限命令:chmod1、权限介绍2、chmod命令常见用法和示例3、文件权限详解4、ch

Linux内核之内核裁剪详解

《Linux内核之内核裁剪详解》Linux内核裁剪是通过移除不必要的功能和模块,调整配置参数来优化内核,以满足特定需求,裁剪的方法包括使用配置选项、模块化设计和优化配置参数,图形裁剪工具如makeme... 目录简介一、 裁剪的原因二、裁剪的方法三、图形裁剪工具四、操作说明五、make menuconfig

Linux使用nohup命令在后台运行脚本

《Linux使用nohup命令在后台运行脚本》在Linux或类Unix系统中,后台运行脚本是一项非常实用的技能,尤其适用于需要长时间运行的任务或服务,本文我们来看看如何使用nohup命令在后台... 目录nohup 命令简介基本用法输出重定向& 符号的作用后台进程的特点注意事项实际应用场景长时间运行的任务服

什么是cron? Linux系统下Cron定时任务使用指南

《什么是cron?Linux系统下Cron定时任务使用指南》在日常的Linux系统管理和维护中,定时执行任务是非常常见的需求,你可能需要每天执行备份任务、清理系统日志或运行特定的脚本,而不想每天... 在管理 linux 服务器的过程中,总有一些任务需要我们定期或重复执行。就比如备份任务,通常会选在服务器资

SpringBoot使用minio进行文件管理的流程步骤

《SpringBoot使用minio进行文件管理的流程步骤》MinIO是一个高性能的对象存储系统,兼容AmazonS3API,该软件设计用于处理非结构化数据,如图片、视频、日志文件以及备份数据等,本文... 目录一、拉取minio镜像二、创建配置文件和上传文件的目录三、启动容器四、浏览器登录 minio五、

Linux限制ip访问的解决方案

《Linux限制ip访问的解决方案》为了修复安全扫描中发现的漏洞,我们需要对某些服务设置访问限制,具体来说,就是要确保只有指定的内部IP地址能够访问这些服务,所以本文给大家介绍了Linux限制ip访问... 目录背景:解决方案:使用Firewalld防火墙规则验证方法深度了解防火墙逻辑应用场景与扩展背景:

IDEA中的Kafka管理神器详解

《IDEA中的Kafka管理神器详解》这款基于IDEA插件实现的Kafka管理工具,能够在本地IDE环境中直接运行,简化了设置流程,为开发者提供了更加紧密集成、高效且直观的Kafka操作体验... 目录免安装:IDEA中的Kafka管理神器!简介安装必要的插件创建 Kafka 连接第一步:创建连接第二步:选

Linux下MySQL8.0.26安装教程

《Linux下MySQL8.0.26安装教程》文章详细介绍了如何在Linux系统上安装和配置MySQL,包括下载、解压、安装依赖、启动服务、获取默认密码、设置密码、支持远程登录以及创建表,感兴趣的朋友... 目录1.找到官网下载位置1.访问mysql存档2.下载社区版3.百度网盘中2.linux安装配置1.

Linux使用粘滞位 (t-bit)共享文件的方法教程

《Linux使用粘滞位(t-bit)共享文件的方法教程》在Linux系统中,共享文件是日常管理和协作中的常见任务,而粘滞位(StickyBit或t-bit)是实现共享目录安全性的重要工具之一,本文将... 目录文件共享的常见场景基础概念linux 文件权限粘滞位 (Sticky Bit)设置共享目录并配置粘