PMDK

简介: PMDK

PMDK is popular nowadays. To practice, please start from http://pmem.io.

在 src/examples/libpmem/ 目录下有三个简单的例子:full\_copy.c、manpage.c、simple\_copy.c。我们选择 full\_copy.c 做测试,并在其基础上修改为 copy\_mem.c。
在得到的测试数据中可以发现几个明显的拐点,例如:

  1. devdax 模式下,每次 flush 32 字节比 64 字节要慢很多。因为 cache line 的大小是 64 字节。
  2. devdax 模式下,每次 flush 128 字节也比 256 字节要慢很多。 推测是 PMEM\_MOVNT\_THRESHOLD 默认设置为 256 导致的,256 字节以上的数据将采用 Cache of Non-temporal Data 的写 Cache 模式。

    $ cat src/libpmem/x86_64/init.c

    define MOVNT_THRESHOLD 256

    size_t Movnt_threshold = MOVNT_THRESHOLD;

  3. xfs 模式下,每次 flush 2048 字节也比 4096 字节要慢很多。因为 xfs 的块大小(等同内核的页面大小)是 4096 字节。
  4. fsdax 模式下,每次 flush 128 字节也比 256 字节要慢很多。因为 fsdax 模式下,首次缺页都会要先写零并持久化。
  5. fsdax 模式比 devdax 模式大约会慢 2-3 倍。除了缺页写零之外还有哪些额外操作?

Perf 的输出中可以明显看到 fsdax 模式下有很多 memcpy\_flushcache 的调用。主要是走/不走 cache 的差别。

fsdax
    43.25%  copy_mem  libpmem.so.1.0.0  [.] memmove_movnt_sse2_clwb
    39.21%  copy_mem  [kernel.vmlinux]  [k] memcpy_flushcache

devdax
    86.16%  copy_mem  libpmem.so.1.0.0  [.] memmove_movnt_sse2_clwb
     7.14%  copy_mem  libpmem.so.1.0.0  [.] memmove_nodrain_sse2_clwb

那么为什么 fsdax 会有很多 memcpy\_flushcache 的调用,而 devdax 没有?从 perf 获得的调用栈:

__libc_start_main
main
memmove_movnt_sse2_clwb
page_fault
do_page_fault
__do_page_fault
handle_mm_fault
__handle_mm_fault
__xfs_filemap_fault
dax_iomap_fault
xfs_file_iomap_begin
xfs_iomap_write_direct
xfs_bmapi_write
xfs_bmapi_convert_unwritten
blkdev_issue_zeroout
submit_bio_wait
submit_bio
generic_make_request
pmem_make_request
pmem_do_bvec
write_pmem
memcpy_flushcache

那么 clwb 函数是怎么定义的?查 libpmem 代码即可。

[root@localhost libpmem]# grep -rwIn memmove_movnt_sse2_clwb /home/test/pmdk-sandbox/src
/home/test/pmdk-sandbox/src/libpmem/x86_64/memcpy/memcpy_nt_sse2_clwb.c:34:#define EXPORTED_SYMBOL memmove_movnt_sse2_clwb
/home/test/pmdk-sandbox/src/libpmem/x86_64/memcpy_memset.h:83:void memmove_movnt_sse2_clwb(char *dest, const char *src, size_t len);

注意上面那个 #define。找到对应的代码:src/libpmem/x86\_64/memcpy/memcpy\_nt\_sse2.h

void
EXPORTED_SYMBOL(char *dest, const char *src, size_t len)
{
    if ((uintptr_t)dest - (uintptr_t)src >= len)
    memmove_movnt_sse_fw(dest, src, len);
    else
    memmove_movnt_sse_bw(dest, src, len);

    maybe_barrier();
}

Since PMDK is in active development, the best practice is to read the code and follow the changes.

As for CLFLUSH、CLFLUSHOPT、CLWB's difference, read the code and refer to http://research.cs.wisc.edu/sonar/tutorial/03-hardware.pdf.

links to: https://zedware.github.io

目录
相关文章
|
存储 缓存 弹性计算
阿里巴巴开源 容器镜像加速技术DADI 上手指南
阿里资深技术专家在阿里云开发者社区特别栏目《周二开源日》直播中,介绍刚于3月份开源的容器镜像加速器项目 DADI ,并带大家快速上手使用。本文为直播内容文字整理,看直播回放,请点击文首链接~
阿里巴巴开源 容器镜像加速技术DADI 上手指南
|
9月前
|
存储 关系型数据库 MySQL
10个案例告诉你mysql不使用子查询的原因
大家好,我是V哥。上周与朋友讨论数据库子查询问题,深受启发。为此,我整理了10个案例,详细说明如何通过优化子查询提升MySQL性能。主要问题包括性能瓶颈、索引失效、查询优化器复杂度及数据传输开销等。解决方案涵盖使用EXISTS、JOIN、IN操作符、窗口函数、临时表及索引优化等。希望通过这些案例,帮助大家在实际开发中选择更高效的查询方式,提升系统性能。关注V哥,一起探讨技术,欢迎点赞支持!
499 5
|
9月前
|
数据挖掘 数据安全/隐私保护
抖音运营:解锁流量增长密码
在短视频盛行的时代,抖音成为流量蓝海,众多创作者和品牌竞相涌入。要在激烈竞争中脱颖而出,除了创作优质内容和巧妙运营外,数据分析至关重要。精准定位目标受众,挖掘创意与热门趋势,优化视频制作、剪辑节奏及发布时间,积极互动并分析关键数据指标(如播放量、点赞数、完播率等),不断优化运营策略,才能实现流量快速增长和账号的长期发展。
1068 11
|
SQL 人工智能 Oracle
PostgreSQL 递归查询(含层级和结构)
PostgreSQL 递归查询(含层级和结构)
|
并行计算 PyTorch TensorFlow
【Win11 搭建miniconda 的pytorch1.12环境】
值得注意的是。若采用conda环境配置后续环境,需要注意python版本与Pytorch、Tensorflow等的版本对应关系!接下来的安装与配置均建立在系统环境基础上,不建立在conda环境基础上
753 0
【Win11 搭建miniconda 的pytorch1.12环境】
|
关系型数据库 MySQL Linux
centos7 实现mysql 5.7主从复制(一主两从)
centos7 实现mysql 5.7主从复制(一主两从)
524 0
centos7 实现mysql 5.7主从复制(一主两从)
|
数据挖掘
2-华大时空组学分析软件 Spateo 空转数据基础分析用法示例
本分分享了使用华大时空组学分析软件 Spateo进行聚类、DE等简单空间转录组分析的用法示例,以供参考
1607 1
解决Node.js mysql客户端不支持认证协议引发的“ER_NOT_SUPPORTED_AUTH_MODE”问题
mysql模块(项目地址为https://github.com/mysqljs/mysql)是一个开源的、JavaScript编写的MySQL驱动,可以在Node.js应用中来操作MySQL。但在使用过程中,出现了“ER_NOT_SUPPORTED_AUTH_MODE”问题。
10723 1
|
SQL 前端开发 JavaScript
SpringBoot+VUE实现数据表格
SpringBoot+VUE实现数据表格
SpringBoot+VUE实现数据表格