ITPub博客

首页 > 数据库 > PostgreSQL > 持久内存指令(PMDK)简介

持久内存指令(PMDK)简介

原创 PostgreSQL 作者:yzs87 时间:2020-09-11 22:49:37 0 删除 编辑

持久内存指令(PMDK )简介

PMDK函数

libpmem 库主要特性是提供一种将脏数据刷写到持久内存的方法。常用的函数主要包括 pmem_flush 、pmem_drain 、 pmem_memcpy_nodrain 。由于CPU CACHE 内容向 PM 刷写的时机和顺序不受用户控制,所以需要特定指令进行强制刷写。 pmem_flush 的功能为调用 CLWB 、 CLFLUSHOPT 或 CLFLUSH 指令强制将 CPU CACHE 中内容(以 cache line 为单位)刷写到 PM ;指令发起后,由于 CPU 是多核, cache 中内容到 PM 的顺序也不一样,所以还需要 pmem_drain 即调用 SFENCE 指令,确保 CLWBs 全部执行完成。如果 pmem_flush 调用的指令是 CLFLUSH ,则该指令中包含 sfence ,所以理论上不再需要调用 pmem_drain ,实际上如果是这个指令的话, pmem_drain 什么也不做。

     上述讲述了CPU cache 内容向 PM 刷写的函数。下面讲述内存拷贝,即从内存向 PM 拷贝数据。该功能由 pmem_memcpy_nodrain 完成,调用 MOVNT 指令( MOV 或 MOVNTDQ ),该指令拷贝不经过 CPU CACHE ,所以这个功能不需要 flush 。但是需要在结束的时候建立 sfence 确保所有数据都已经拷贝到 PM 。

优势

1、write的IO机制

 

经历两次内核态切换,经过一次CPU COPY。

2 、 mmap+memcpy 的IO机制

 

没有了内核态到用户态之间的切换。仍然需要一次CPU COPY 。

3 、 PMDK 的IO机制

 

都是在用户态进行操作,同样需要经过一次CPU COPY ,不过通过 MOVNT 指令,不经过 CPU CACHE 。另外通过单指令多数据进行 copy 。理论上比 memcpy 快。

附录

内存屏障作用、指令顺序:

https://blog.lovezhy.cc/2020/03/14/%E6%90%9E%E6%87%82%E5%86%85%E5%AD%98%E5%B1%8F%E9%9A%9C-%E6%8C%87%E4%BB%A4%E4%B8%8EJMM/

https://blog.csdn.net/maokelong95/article/details/80727952

   


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31493717/viewspace-2718980/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: PG密码安全
请登录后发表评论 登录
全部评论
专注于MySQL、Aerospike、PostgreSQL数据库

注册时间:2017-10-03

  • 博文量
    149
  • 访问量
    285428