探讨一下 Linux 共享内存的 N 种方式

探讨一下 Linux 共享内存的 N 种方式,第1张

关于 Linux 共享内存,写得最好的应该是宋宝华的 《世上最好的共享内存》 一文。

本文可以说是对这篇文章的学习笔记,顺手练习了一下 rust libc —— shichaoyuan/learn_rust/linux-shmipc-demo

按照宋宝华的总结,当前有四种主流的共享内存方式

前两种方式比较符合传统的用法,共享内存做为进程间通信的媒介。

第三种方式更像是通过传递内存“句柄”进行数据传输。

第四种方式是为设备间传递数据设计,避免内存拷贝,直接传递内存“句柄”。

这里尝试了一下第二种和第三种方式。

这套 API 应该是最普遍的 —— shm_open + mmap,本质上来说 Aeron 也是用的这种方式(关于 Aeron 可以参考 我之前的文章 )。

看一下 glibc 中 shm_open 函数的实现就一清二楚了:

shm_open 函数就是在 /dev/shm 目录下建文件,该目录挂载为 tmpfs,至于 tmpfs 可以简单理解为存储介质是内存的一种文件系统,更准确的理解可以参考官方文档 tmpfs.txt 。

然后通过 mmap 函数将 tmpfs 文件映射到用户空间就可以随意 *** 作了。

优点:

这种方式最大的优势在于共享的内存是有“实体”(也就是 tmpfs 中的文件)的,所以多个进程可以很容易通过文件名这个信息构建共享内存结构,特别适合把共享内存做为通信媒介的场景(例如 Aeron )。

缺点:

如果非要找一个缺点的话,可能是,文件本身独立于进程的生命周期,在使用完毕后需要注意删除文件(仅仅 close 是不行的),否则会一直占用内存资源。

memfd_create 函数的作用是创建一个匿名的文件,返回对应的 fd,这个文件当然不普通,它存活在内存中。更准确的理解可以参考官方文档 memfd_create(2) 。

直观理解,memfd_create 与 shm_open 的作用是一样的,都是创建共享内存实体,只是 memfd_create 创建的实体是匿名的,这就带了一个问题:如何让其它进程获取到匿名的实体?shm_open 方式有具体的文件名,所以可以通过打开文件的方式获取,那么对于匿名的文件怎么处理呢?

答案是:通过 Unix Domain Socket 传递 fd。

rust 的 UDS 实现:

rust 在 std 中已经提供了 UDS 的实现,但是关于传递 fd 的 send_vectored_with_ancillary 函数还属于 nightly-only experimental API 阶段。所以这里使用了一个三方 crate —— sendfd ,坦白说可以自己实现一下,使用 libc 构建好 SCM_RIGHTS 数据,sendmsg 出去即可,不过细节还是挺多,我这里就放弃了。

这套 API 设计更灵活,直接拓展了我的思路,本来还是受限于 Aeron 的用法,如果在这套 API 的加持下,是否可以通过传递数据包内存块(fd)真正实现零拷贝呢?

优点:

灵活。

缺点:

linux NFS共享存储

NFS 是(Network Flie System)网络文件系统的缩写,通过网络存储和组织文件的一种方法或机制。

在企业中前端所有的应用服务器接收到用户上传的图片、文件、视频,都会统一存放到后端的存储服务器上,方便前端应用服务器的统一存取。

8.创建共享目录并授权

7.因为在前面优化的时候把开机自动挂载的服务关了,所以没有挂载上,

挂载扩展

服务端参数查看

mount -0 本地参数优化

1,请看上述笔记

linux服务器通过multipath多路径连接到共享存储,那么当文件系统空间不足的时候,有几种方式可以扩展文件系统的大小:

1、pv不变,原lun存储扩大容量,扩大lv,扩大文件系统

2、新增pv,加入到vg中,扩大lv,扩大文件系统

下文是针对场景1的情况下如何 *** 作(但是个人建议采取新建pv的方式2进行):

Environment

If you have this specific scenario, you can use the following steps:

Note: if these lv's are part of a clustered vg, steps 1 and 2 need to be performed on all nodes. 注意:集群模式下步骤1和步骤2两个节点都需要执行。

1) Update block devices

Note: This step needs to be run against any sd devices mapping to that lun. When using multipath, there will be more than one. 通过multipath -ll命令查看每个聚合卷对应的路径。

2) Update multipath device

例子:

3) Resize the physical volume, which will also resize the volume group

4) Resize your logical volume (the below command takes all available space in the vg)

5) Resize your filesystem

6) Verify vg, lv and filesystem extension has worked appropriately

模拟存储端扩容testlv增加

查看客户端多路径情况

客户端更新存储

更新聚合设备

更新pv空间

更新lv空间

更新文件系统空间


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/6069308.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-13
下一篇 2023-03-13

发表评论

登录后才能评论

评论列表(0条)

保存