【推荐阅读】

浅谈linux 内核网络 sk_buff 之克隆与复制

深入linux内核架构--进程&线程

了解Docker 依赖的linux内核技术

在现代操作系统中,共享内存 被很普遍地应用。比如著名的“写时复制”(copy-on-write,COW)技术。

而本节介绍的KSM技术却与这种内存共享概念不同。

1、KSM概述

KSM是“Kernel SamePage Merging ”的缩写,中文可称为“内核同页合并 ”。

KSM允许内核在两个或多个进程(包括虚拟客户机)之间共享完全相同的内存页。KSM让内核扫描检查 正在运行中的程序 并比较它们的内存 ,如果发现它们有完全相同的内存区域或内存页 ,就将多个相同的内存合并为一个单一的内存页,并将其标识为“写时复制 ”。这样可以起到节省系统内存使用量的作用。之后,如果有进程试图去修改被标识为“写时复制”的合并内存页,就为该进程复制出一个新的内存页供其使用。

在QEMU/KVM中,一个虚拟客户机 就是一个QEMU进程 ,所以使用KSM也可以实现多个客户机之间 的相同内存合并 。而且,如果在同一宿主机 上的多个客户机 运行的是相同的操作系统 或应用程序 ,则客户机之间的相同内存页的数量就可能比较大,这种情况下KSM的作用就更加显著 。

在KVM环境下使用KSM,还允许KVM请求哪些相同的内存页是可以被共享而合并的 ,所以KSM只会识别 并合并那些不会干扰客户机运行 且不会影响宿主机或客户机运行的安全内存页 。

可见,在KVM虚拟化环境中,KSM能够提高内存的速度 和使用效率 。

具体可以从以下两个方面来理解。

1)在KSM 的帮助下,相同的内存页被合并 了,减少了客户机的内存使用量。

一方面,内存中的内容 更容易被保存到CPU的缓存 中,

另一方面,有更多的内存 可用于缓存一些磁盘中的数据 。

因此,不管是内存的缓存命中率(CPU缓存命中率 ),还是磁盘数据的缓存命中率 (在内存!!!中命中磁盘数据缓存 的命中率)都会提高,从而提高了KVM客户机中操作系统或应用程序的运行速度 。

2)正如在5.3.3节中提及的那样,KSM 是内存过载使用 的一种较好的方式 。

KSM通过减少每个客户机实际占用的内存数量 ,可以让多个客户机分配的内存数量之和大于物理上的内存数量。而对于使用相同内存量的客户机而言,在物理内存量不变的情况下,可以在一个宿主机中创建更多的客户机,提高了虚拟化客户机部署的密度,提高了物理资源的利用效率 。

KSM是在Linux内核2.6.32 中被加入内核主干代码中去的。目前多数流行的Linux发型版都已经将KSM的支持编译到内核 中了,其内核配置文件中有“CONFIG_KSM=y ”项。

Linux系统的内核进程ksmd 负责扫描后合并进程的相同内存页 ?,从而实现KSM功能。root用户可以通过“/sys/kernel/mm/ksm /”目录 下的文件来配置和监控ksmd这个守护进程 。

KSM只会 去扫描和试图合并那些应用程序建议!!!为可合并的内存页 ,应用程序 (如QEMU)通过如下的madvice系统调用 来告诉内核哪些页可合并 。

目前的QEMU都是支持KSM的,也可以通过查看其代码中对madvise函数的调用 情况来确定是否支持KSM。

QEMU中的关键函数简要分析如下:

/* 将地址标志为KSM可合并的系统调用*/?
/* int madvise(addr, length, MADV_MERGEABLE) */?
/* madvise系统调用的声明在 <sys/mman.h>中*/?
/* int madvise( void *start, size_t length, int advice ); */?
?
/* qemu代码的exec.c文件中,开启内存可合并选项*/?
static int memory_try_enable_merging(void *addr, size_t len)?
{?
/*这里可以看到:通过qemu的-machine mem-merge=on|off参数可以对每个客户机开启或关闭KSM支持。?我们后面通过实例观察效果。*/?if (!machine_mem_merge(current_machine)) {?/* disabled by the user */?return 0;?}?
?return qemu_madvise(addr, len, QEMU_MADV_MERGEABLE);?
}?
?
/* qemu代码的osdep.c文件中对qemu_madvise()函数的定义*/?
int qemu_madvise(void *addr, size_t len, int advice)?
{?if (advice == QEMU_MADV_INVALID) {?errno = EINVAL;?return -1;?}?
#if defined(CONFIG_MADVISE)?return madvise(addr, len, advice);?
#elif defined(CONFIG_POSIX_MADVISE)?return posix_madvise(addr, len, advice);?
#else?errno = EINVAL;?return -1;?
#endif?
}?
?
/*在osdep.h中看到,只有QEMU configure了CONFIG-MADVISE(检查你的config-host.mak)并且你?
的宿主机系统支持MADV_MERGEABLE标准POSIX系统调用,QEMU才可以支持KSM;否则,QEMU就不会去调用POSIX接口来做KSM*/?
#if defined(CONFIG_MADVISE)?
?
...?
#ifdef MADV_MERGEABLE?
#define QEMU_MADV_MERGEABLE MADV_MERGEABLE?
#else?
#define QEMU_MADV_MERGEABLE QEMU_MADV_INVALID?
#endif

Linux内核- KSM相关推荐

  1. KSM(Kernel Samepage Merging) 剖析:Linux 内核中的内存去耦合

    简介:作为一个系统管理程序(hypervisor),Linux® 有几个创新,2.6.32 内核中一个有趣的变化是 KSM(Kernel Samepage Merging)  允许这个系统管理程序通过 ...

  2. linux内核(4.17.10)配置项详解(x86)

    64-bit kernel--支持64位 General setup--通用设置 Cross-compiler tool prefix--交叉编译工具前缀 Local version-append t ...

  3. 【Linux 内核】Linux 内核体系架构 ( 进程调度 | 内存管理 | 中断管理 | 设备管理 | 文件系统 )

    文章目录 一.进程调度 二.内存管理 三.中断管理 四.设备管理 五.文件系统 一.进程调度 进程调度 : 进程 是 系统中 进行 资源分配 的 基本单位 ; 每个进程 在 运行时 , 都 感觉自己占 ...

  4. 复制linux内核,linux内核写时复制机制源代码解读

    作者简介 写时复制技术(一下简称COW)是linux内核比较重要的一种机制,我们都知道:父进程fork子进程的时候,子进程会和父进程会以只读的方式共享所有私有的可写页,当有一方将要写的时候会发生COW ...

  5. 奔跑吧Linux内核初识

    断更新博客有一段时间了.入职两年了一家创业公司,那是真心的累,当然了获得了技术上很大的提升.搞了两年的vr产品,唯一遗憾的是,平台是ST单片机,远离了系统级别的知识.回看刚出校园时的三年计划,和第一年 ...

  6. 阿里linux内核月报201412

    Live kernel patching on track for 3.20 运行时间敏感的用户一直以来都很希望有一种方法可以在不重启系统的情况下对运行的操作系统内核打补丁.目前有几个还没有进入主线内 ...

  7. linux 内核配置简介

    Gentoo Linux Gentoo内核(gentoo-sources)特有的选项 Gentoo Linux support CONFIG_GENTOO_LINUX 选"Y"后, ...

  8. 嵌入式Linux内核配置、裁剪与编译浅析(ARM版)

    第一部分Linux内核裁减 (1)安装新内核: i)将新内核copy到/usr/src下并解压: #tar -zxvf linux-2.6.38.4.tar.gz ii) 将名为linux的符号链接删 ...

  9. Linux内核数据学习总结

    目录 1. 进程相关数据结构1) structtask_struct2) structcred3) structpid_link4) structpid5) structsignal_struct6) ...

最新文章

  1. MSI-X 之有别于MSI
  2. 计算机网络总结:第一章 计算机网络和因特网
  3. ubuntu下交叉编译环境构建
  4. 现在相亲还要体检报告了?
  5. nginx哪个版本性能好_nginx性能为什么好
  6. php检测表大小,查询mysql数据库、表的大小
  7. python中input()与raw_input()的区别到底是啥?-----marsggbo原创作品为你解答
  8. 【动态规划】01背包问题:猫狗大战
  9. 阶段1 语言基础+高级_1-3-Java语言高级_07-网络编程_第2节 TCP协议_1_TCP通信的概述(上)...
  10. Fashion-MNIST数据集无法下载解决方案
  11. python爬取快手视频_【原创开源】快手爬虫,根据id批量爬取用户的所有图集和视频...
  12. 卷积神经网络与深度学习
  13. Residual Networks Behave Like Ensembles of Relatively Shallow Networks
  14. 【JZOJ】3424. 粉刷匠
  15. [IOI2019] 景点划分
  16. 惠普服务器lio装系统,惠普Pavilion一体机一键u盘装系统win10教程
  17. 计算机网络传输介质的特点,计算机网络基础:数据通信技术之传输介质
  18. 韩国美女黑客是怎样的一种存在?
  19. 用python画好看的圣诞树
  20. 昆明理工大学计算机学院研究生录取分数线,2021昆明理工大学研究生分数线一览表(含2019-2020历年复试)...

热门文章

  1. pgsql处理文档类型数据_PostgreSQL 基本数据类型及常用SQL 函数操作
  2. 珍贵!分享!全国各省市最全乡镇、街道行政区划边界shp矢量数据+wgs84坐标系+2021年7月最新获取+2018年更新数据
  3. redis evict.c内存淘汰机制的源码分析
  4. 解决myeclipse破解运行后出现的security alert:integrity check error
  5. 如何用技术手段“干掉”优酷、腾讯视频 App 里讨厌的广告?
  6. 计算机二级office题库有多少道,计算机二级MS Office题库(600道).docx
  7. 微软Google等互联网公司经典面试智力题和解答
  8. python概率编程_Python概率编程库PyMC应用案例二则,pymc应用案例
  9. java关闭窗口按钮_java swing 使用按钮关闭窗口
  10. mysql端口号3306被占用_使用pandas将excel表格数据导入到mysql中