Linux kernel Memory Pin机制的实现以及测试

阅读: 评论:0

Linux kernel Memory Pin机制的实现以及测试

Linux kernel Memory Pin机制的实现以及测试

提起Memory Pin机制,就不得不提到swap的概念,这两个概念息息相关,为了避免在CPU忙碌的时候,也就是在缺页异常发生的时候,临时搜索可供换出的内存页面并加以换出,Linux内核定期地检查系统的空闲页面数量是否小于预定义的极限,一旦发现空闲页面数太少,就预先将若干页面换出,以减轻缺页异常发生时系统所承受的负担,当然,由于无法确切地预测页面的使用,即使这样做了也还可能出现缺页异常发生时内存依然没有足够的空闲页面。但是,预换出毕竟能减少空闲页面不够用的利率。并且通过选择适当的参数,比如每隔多久换出一次,每次换出多少页,可以使临时寻找要换出页面的情况很少发生,为此,linux内核设置了一个专伺定期将页面换出的守护进程kswapd.

kswapd的分析参考博客:

.2014.3001.5502

swap的原理是,当内存不足的时候,把最近很少访问的没有存储设备支持的物理页(其实就是匿名页)数据暂时保存到交换区,释放内存空间,当交换区中的存储页被访问的时候,再把数据从交换页读取到内存中。

kswapd每个NUMA NODE创建一个,负责本NODE的内存交换,kswapd属于内核线程,它的父进程是PID为2的kthreaddd守护进程,注意虽然叫做swap,但是它和PID为0的IDLE进程(task comm叫做swapper)没有任何关系,PID也是随机的,所以只是一个普通内核进程。

Pin Memory

交换功能并不是在所有场景下就是需要的,以CUDA为例,熟悉cuda的同学一定知道cudaMallocHost函数,cudaMallocHost和malloc分配的都是主机端内存,但是他们是有区别的。cudaMallocHost函数用于分配页锁定内存,使用方法如下:

cudaMallocHost((void**)&pdataA, MATRIX_M * MATRIX_N * sizeof(int));
cudaHostGetDevicePointer((void**)&pdata_gpuA, (void*)pdataA, 0);

使用malloc分配的内存是swapable(交换页)的(malloc的都是匿名页),而上面的代码例子中,调用cudaHostGetDevicePointer的目的,实质是强制让分配得到的页面不参与页交换,目的是让一片用户

buffer永驻内存,从而提高系统应用效率,同时,由于应用场景要求被映射的物理内存会被其他的设备,比如GPU,或者IB卡以及DMA访问和饮用,所以必须固定这个映射关系,防止被CPU映射的VA对应的物理页面被PAGE OUT除去后,再swap in近来可能就不是原来的物理页面了,这样一定会影响物理页面在多个设备之间的共享。另外一点就是,当CPU侧一个进程触发 PAGE FAULT后,会进入COW流程,而当一个IO设备访问了不村在的映射页面,理论上也需要进行COW,之后再次进行访问尝试,但是目前DEVICE端很难满足这一点,所以当遇到IO PAGE FAULT时,IOMMU的做法通常是中断访问。解决以上问题的软件层面的规避方法是将用于DMA传输的内存PIN住,既不让它在内存中移动,也不让他换出到磁盘,就不会发生IO PAGE FAULT了。

下图是nvidia关于函数cudaHostGetDevicePointer的官方文档,可以明显看到pin memory的字眼。

本文发布于:2024-01-31 14:15:07,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170668170929116.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:机制   测试   kernel   Linux   Pin
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23