KSM应用实践

article/2025/9/17 4:33:07

KSM应用实践

原创 lyonger 网易游戏运维平台 2019-08-17

 

lyonger

18年加入网易,先后负责过多个游戏产品的运维工作,多年运维生涯。负责小游戏CI/CD、事件处理平台开发、游戏Nomad运维模式探索、gitlab平台维护等工作。主要关注Linux性能优化、DevOps、云原生领域。探索和分享是一趟美好的旅程。

 

背景介绍

业务对于服务器成本的要求越来越高。有些服务进程(如场景进程)load 完整的数据需要占用 900 多 M 内存,且会运行多个实例(几十个),有时也会使用多个容器共享宿主机内存使用会进一步加剧。此时内存成为了服务器的瓶颈。

KSM 原理

Kernel Samepage MergingLinux kernel 2.6.32 引入的新特性,最初时为 KVM 虚拟化技术开发的,但对于普通应用程序同样适用。具体参考官方文档。基本原理是定期扫描内存页,将相同的内存页合并,并将其标示为 cow(当需要修改时,copy 新的内存页,再做修改),最终达到节省内存的目的。

我们先了解一下Linux的内存机制,方便理解KSM原理。

Linux 内存机制

学过操作系统的同学应该知道Linux是采用分页的内存机制来管理物理内存。内核采用虚拟内存管理技术为每个进程分配独立的虚拟内存地址空间。而物理内存的分配是由进程去访问虚拟地址时产生缺页异常 (Page Fault) 来触发。

一个进程的虚拟地址空间在内核中用内存描述符struct mm_struct进行表示,而进程的虚拟地址空间又被划分为多个虚拟内存区域struct vm_area_struct,简称vma。另外,进程描述符由struct task_struct中的mm域记录。

我们来看一幅图详细了解一下内存的分配过程。

 

KSM 实现

KSM后常驻一个名叫ksmd非实时线程。

它会执行 ksm.c 源码里的ksm_do_scan接口定时扫描被标记为MMF_VM_MERGEABLEmm_struct[内存描述符],调用cmp_and_merge_page识别并合并内容完全一样的物理页,扫描的间隔和每次扫描的页数分别由/sys/kernel/mm/ksm/pages_to_scan/sys/kernel/mm/ksm/sleep_millisecs控制。

用户层可以通过系统调用madvise(addr,length,MADV_MERGEABLE)对一块页对齐的内存标记为可用于 KSM 合并。

此外由于madvise系统调用会通过内核源码 madvise.c 里的madvise_behavior接口对内存区域 vma 中的内存进行标记,如果该区间和周围的内存区间标记不同,那么会分配新的vma,而内核对进程持有的vma是有限制的,分配的 vma 数目必须小于/proc/sys/vm/max_map_count里的限制,一旦超出,那么会引发OOM Killer导致进程crash

如果调大max_map_count产生过多的vma会导致系统的性能下降,我们应该根据自身业务的规模进行合理调整,同时有必要加上监控预警。

我们来看一幅图详细了解一下 KSM 的扫描合并过程。

KSM 接入成本

对于需要接入的产品而言,主要的接入成本如下:

  • 需改动代码做适配,主动标记希望合并的数据。

  • 启用后会常驻一个扫描进程 ksmd,带来少量的额外 CPU 消耗。

 

KSM 收益与风险

收益

  • 对于普通进程,每个进程都要加载同样进程数据,一台机器同时打开几十个进程,有较多相同内存数据,KSM会取得良好效果。

  • 内存的节省,对公有云和容器能带来后续的成本收益。

风险

系统的虚拟内存区域vma最大的map数量是有限制的,一旦超出,那么会引发OOM Killer导致进程crash

如果调大max_map_count生成过多的vma会产生碎片导致系统的性能下降,我们应该根据自身业务的规模进行合理调整并加上监控预警,具体监控的指标可以参考下面的KSM配置部分。

KSM 配置

  • KSM 开关

echo 1 > /sys/kernel/mm/ksm/run   #启动KSM
echo 0 > /sys/kernel/mm/ksm/run   #关闭KSM
echo 2 > /sys/kernel/mm/ksm/run   #停止运行态的KSM并取消合并所有合并页
  • 控制参数

/sys/kernel/mm/ksm/sleep_millisecs    #ksmd两次扫描之间的时间间隔,单位毫秒,默认20ms。
/sys/kernel/mm/ksm/pages_to_scan      #控制一次扫描处理的页数,默认为100。
/sys/kernel/mm/ksm/merge_across_nodes #控制是否允许不同的NUMA节点之间进行页合并,默认允许,写入0表示不允许。
  • 用于监控的参数

/sys/kernel/mm/ksm/full_scans        #记录已经执行的全区域扫描次数。
/sys/kernel/mm/ksm/pages_shared      #记录稳定树节点数,即共享的物理页数。
/sys/kernel/mm/ksm/pages_sharing     #记录被共享的物理页数,通过此可计算节省的物理内存。
/sys/kernel/mm/ksm/pages_unshared    #记录不稳定树的节点树,即未共享的物理页数。
/sys/kernel/mm/ksm/pages_volatile    #记录频繁改变的物理页数。

KSM 应用实例

空载试验

  • 在 4 台宿主上,共启动 8 个容器,每个容器部署 32 个进程,宿主机内存对比如下:

机器IP总内存大小未启动KSM时内存占用启动KSM时内存占用
10.203.10.18364G35.4688G20.6592G
10.203.10.18564G35.4816G20.6592G
10.203.10.18464G35.4048G20.4544G
10.203.10.18664G35.4432G20.48G
10.203.10.16564G34.8032G19.5328G
10.203.10.16764G34.8032G19.5584G
10.203.10.16464G34.816G19.5456G
10.203.10.16664G34.8032G19.5328G
  • 如上表格可知,启动 KSM,内存使用减少了大概15G,减幅达到23%

运行试验

  • 在一个宿主上,启动 2 个容器,每个容器部署 32 个进程,其中一个容器有 9600 个用户在不停的请求,一个容器有 800 个用户在不停的进行请求,请求人数较多的容器数据对比如下:

机器IP总内存大小未启动KSM时内存占用启动KSM时内存占用
10.203.10.18364G44.1856G29.3632G
10.203.10.18664G44.1472G29.2864G
10.203.10.18464G44.0832G29.1584G
10.203.10.18564G44.1984G29.1968G
  • 如上表格可知,启动 KSM,内存中战斗最终减低了大概15G,减幅达23%

总结

  • 使用KSM之前,需对此有一定的了解,对于单进程消耗内存比较大且进程数目集中在某一台机器上的业务建议考虑接入,实际上我们接入的成本换取的收益是可观的。

特别鸣谢

  • 特别感谢  Kuso 同学对于本文的贡献和支持。

往期精彩

NEW

S3 的中文编码问题及修复方案

 

通用实时日志分类统计实践

 

从清档需求谈谈 Redis 二级索引的使用

 

Swap 与 Swappiness

 

网易游戏海外 AWS 动态伸缩实践

 


http://chatgpt.dhexx.cn/article/5luy4600.shtml

相关文章

linux ksm,内存页面共享-KSM

导读 本文适合有基本Linux内存管理概念的新手阅读,且本文旨在从工作流程和设计思想上介绍KSM,在涉及到源代码的地方,进行了部分删减,如果想详细了解KSM,推荐阅读源代码及源代码中的注释。 作者也是初次接触Linux内核源…

Linux内存管理 之 KSM功能介绍

目录 前言1. 概述1.1 使用 madvise 控制 KSM1.1 KSM 守护进程 sysfs 接口 2.KSM技术应用场景3. KSM技术实践3.1 查看KSM运行情况3.2 KSM设置3.3 对vm的设置 前言 KSM(Kernel Samepage Merging) 共享内存的概念在现代操作系统中很常用了,比如,一个程序启…

HTTP 401 错误 - 未授权: (Unauthorized)

http://blog.csdn.net/patronsaint/article/details/5639962 介绍 您的Web服务器认为,客户端(例如您的浏览器或我们的 CheckUpDown 机器人)发送的 HTTP 数据流是正确的,但进入网址 (URL) 资源 , 需要用户身份验证 &a…

403错误(已解决)

问题描述: 取得到图片的地址,但是显示图片无法加载 浏览器开发者模式报错403 问题解决: 图片的url部署在阿里云的oss存储仓库上,登陆阿里云发现是欠费导致的oss文件存储功能失效 补充: 403 Forbidden错误的原因和解…

Error:Request failed with status code 401

Error:Request failed with status code 401 错误示例: // 获取个人信息 export const getUserInfoAPI () > {return request({url: /v1_0/user/profile,method: GET,Headers: {Authorization: Bearer ${getToken()}}}) }正确做法 // 获取个人信息 export co…

服务器发送了 HTTP 状态代码 401: Unauthorized

根据wsdl连接生成客户端代码,调用接口报错:服务器发送了 HTTP 状态代码 401: Unauthorized。查询此错误的原因是没有访问权限,想到客户再提供接口wsdl访问连接的时候提供了用户名和密码。 解决办法: 增加此类 在接口运行前增加此…

前端401错误 解决方法:响应拦截器

目录 1.该问题出现的原因 2.处理401问题的解决方案原理 3.使用响应拦截器解决问题 1.该问题出现的原因 在前后端分离项目中,最常见的是前端点击登录后,后端返回token字符串,这个token可以看作是一个“令牌”,就比如你去酒店办理…

解密网站401错误:了解发生原因和修复方法

​  每个网站都会有不同的错误码,其中,401错误被认为是相对常见的错误码。那么,什么是网站401错误呢?在摸清了这一点之后,我们也需要学习一下如何解决它。 什么是 401 状态码? 401 状态代码是 Web 服务器发送给浏览器的 HTTP …

401 错误原因和解决方案

401.1 您未被授权查看该页 HTTP 错误 401.1 - 未经授权:访问由于 凭据无效被拒绝。 出现问题的原因: 计算机用户名ftpname帐号的密码和IIS中记录的不一致。 出现这个问题的原因就是手工到IIS中修改了用户的登录密码,从而导致计算机用户名…

401错误 解决方法:响应拦截器

关于401错误 401错误场景 1. 用户未登录,代码报401,应该回到登录页 2. 登录用户的token过期 : 怎样理解token过期? . 就是登录成功了以后,后端会返回一个token值,这个值在后续请求时带上(就像是开门钥匙), 但是,这个值一般会有有效期(具…

点到超平面的距离公式

超平面: 第一步:求出超平面的法向量 超平面上任意两点, 则向量一定垂直于该超平面的法向量。这两点满足: 两式相减: 就是向量,由此可以看出超平面的法向量就是向量 第二步:求出点到超平面的距离r 假设…

模式识别中的最优分类超平面与线性支持向量机

模式识别中的最优分类超平面与线性支持向量机 本章的内容需要你理解一下的基础知识。 模式识别部分:线性分类器基本概念、感知器 数学基础部分:拉格朗日乘子法、拉格朗日对偶问题 当然,以上的基础知识不需要你现在就看,可以在阅…

平面、超平面的法线,平行超平面的距离

1. 法线 一个平面或超平面由一个方程(不是一组方程)定义: { x ∣ a T x b } \{x\mid a^Txb\} {x∣aTxb} 其中 a a a 是一个非零的列向量,而 b b b 是一个实数。那么它的法线(垂线)向量是 a a a。 例如…

如何理解超平面?

超平面的公式 首先明确几个定义:(1) 超平面是指n维线性空间中维度为n-1的子空间。它可以把线性空间分割成不相交的两部分。比如二维空间中,一条直线是一维的,它把平面分成了两块;三维空间中,一个平面是二维的&#xf…

支持向量所在超平面方程_如何用python绘制超平面支持向量机?

一个完整的例子 import numpy as np import matplotlib.pyplot as plt def __intersect(rect, line): l = [] xmin,xmax,ymin,ymax = rect a,b,c = line assert a!=0 or b!=0 if a == 0: y = -c/b if y<=ymax and y>=ymin: l.append((xmin, y)) l.append((xmax, y)) retu…

SVM(四):超平面详细解释

目录 背景定义超平面方程推导平面直线方程空间平面方程超平面 点到超平面的距离推导点到平面直线的距离点到空间平面的距离超平面 判断超平面的正反 背景 关于超平面的介绍&#xff0c;网上的博客资料太多了&#xff0c;然而真正简洁易懂、切中要害的实在是太少了&#xff0c;…

【支持向量机】最大间隔超平面及Matlab代码

线性可分 在特征空间中&#xff0c;有两个训练样本可以通过一条直线区分开&#xff0c;则称为线性可分。而在特征空间大于等于四维时&#xff0c;分开训练样本的平面&#xff0c;称为超平面。 我们定义一条直线方程&#xff1a; ω 1 x 1 ω 2 x 2 b 0 ω_1x_1ω_2x_2b0 …

第三节- 超平面

这一节我们来讲一个新的东西&#xff0c;叫做 超 平面( hyper-plane)。 其实这个东西本身并不难理解。 只是我们在三维直角坐标系里面习惯了 直线 平面什么的&#xff0c;可能有些疑惑而已。 老规矩&#xff0c;我们先甩出定义&#xff1a; 超平面 hyperplane 看起来&am…

躺平国历险记:两个超平面之间距离的计算

王二麻听说躺平国是一个非常神奇的地方。在躺平国里&#xff0c;有各种神奇的东西。比如&#xff1a;会说话的铁片&#xff0c;能够分拣垃圾的小狗&#xff0c;还有会唱京剧的电线杆子。 王二麻的表哥张三李是一个糙汉子&#xff0c;他前几年在国内混不下去了&#xff0c;一个…

SVM超平面的理解

超平面的理解 超平面的定义 超平面是n维欧氏空间中(n-1)维度的子空间&#xff0c;例如3维空间的“超平面”就是一个面&#xff0c;但通常超过3维空间之后我们才称之为超平面&#xff0c;是纯粹的数学概念&#xff0c;不是现实的物理概念。公式表示为1-1&#xff0c;W、x是一个…