玖叶教程网

前端编程开发入门

rocketmq 的消费读取消息 很高效 , mmap 你知道吗?

rocketmq 如果 每次 consumer 读取消息都从硬盘读取文件,由于都是磁盘 IO,是非常耗时的,有什么办法可以解决呢?

对于传统的文件 IO,

由于 page cache 存在内核空间中,

还需要将其拷贝到用户空间中才能为进程所用

( 同样的,写入消息也要写将消息写入用户空间的 buffer, 再拷贝到 内核空间 中的 page cache)



于是我们使用了 mmap 来避免了这次拷贝.

我们把这些存储消息的文件集合称为 commitlog

通过 mmap 的方式我们极大地提高了读写文件的效率,这样的话即可将 commitlog 采用 mmap 的方式加载到 page cache 中,然后再在 page cache 中读写消息


mmap(Memory Mapped Files)

mmap(Memory Mapped Files)是一种在 Linux 和其他操作系统上实现进程间通信(IPC)以及文件映射的技术。它允许将一个文件或者设备映射到进程的地址空间中,使得对内存的访问就像访问文件一样。这种方法可以提高文件 I/O 的效率,尤其是在处理大数据集时,因为它可以减少用户态到内核态的上下文切换次数,并且可以利用操作系统的页面缓存机制。

工作原理

当一个文件被映射到进程的地址空间时,操作系统会创建一个从文件的一部分或全部到进程虚拟地址空间的一个区域的映射。当进程访问这个映射区域时,实际上是在访问文件的内容。如果对映射区域进行了写操作,那么这些更改也会反映到文件中。

mmap 的优势

减少系统调用:通过内存映射文件,可以直接在内存中操作数据,而不需要频繁地调用 read 或 write 系统调用来读取或写入文件。

高效的数据共享:多个进程可以通过映射同一个文件来共享数据,而无需复制数据。

利用页面缓存:操作系统可以自动管理页面缓存,使得数据访问更高效。

支持大文件:即使文件很大,也可以只映射需要的部分,而不是整个文件。

使用 mmap 的基本步骤

打开文件:使用 open 函数打开文件。

映射文件:使用 mmap 函数将文件映射到内存中。

操作映射区域:直接通过指针操作映射区域。

取消映射:使用 munmap 函数取消映射。


Java 运用 mmap 的示例代码


import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.StandardCharsets;

public class MemoryMappedFilesExample2 {
    public static void main(String[] args) throws Exception {


        String fileName = null;
        try {
            fileName = "D://example.txt";
            //int mapSize = 1024; // 映射大小
            int mapSize = 32; // 映射大小
            RandomAccessFile raf = new RandomAccessFile(fileName, "rw");
            FileChannel fc = raf.getChannel();
            // 映射文件
            MappedByteBuffer buffer = fc.map(FileChannel.MapMode.READ_WRITE, 0, mapSize);
            // 操作映射区域
            buffer.put(0, (byte)'H'); // 修改第一个字符
            // 读取映射区域
            byte[] bytes = new byte[mapSize];
            buffer.get(bytes); // 读取所有数据
            String content = new String(bytes, StandardCharsets.UTF_8);
            System.out.println("Mapped file content: " + content);

        } catch (Exception e) {
            System.out.println(e);
        }

    }
}


"C:\Program Files\Java\jdk1.8.0_201\bin\java.exe" "-javaagent:D:\tool\IntelliJ IDEA 2021.2.1\lib\idea_rt.jar=64335:D:\tool\IntelliJ IDEA 2021.2.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_201\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\rt.jar;D:\tool\code\contract-seal-sign\contract-seal-sign-common\target\classes;D:\tool\code\contract-seal-sign\contract-seal-sign-model\target\classes;D:\maven-repository-xs-idea\redis\clients\jedis\2.7.3\jedis-2.7.3.jar;D:\maven-repository-xs-idea\org\apache\commons\commons-pool2\2.3\commons-pool2-2.3.jar;D:\maven-repository-xs-idea\org\springframework\spring-context\4.1.4.RELEASE\spring-context-4.1.4.RELEASE.jar;D:\maven-repository-xs-idea\org\springframework\spring-aop\4.1.4.RELEASE\spring-aop-4.1.4.RELEASE.jar;D:\maven-repository-xs-idea\aopalliance\aopalliance\1.0\aopalliance-1.0.jar;D:\maven-repository-xs-idea\org\springframework\spring-beans\4.1.4.RELEASE\spring-beans-4.1.4.RELEASE.jar;D:\maven-repository-xs-idea\org\springframework\spring-core\4.1.4.RELEASE\spring-core-4.1.4.RELEASE.jar;D:\maven-repository-xs-idea\org\springframework\spring-expression\4.1.4.RELEASE\spring-expression-4.1.4.RELEASE.jar;D:\maven-repository-xs-idea\org\springframework\spring-context-support\4.1.4.RELEASE\spring-context-support-4.1.4.RELEASE.jar;D:\maven-repository-xs-idea\javax\mail\mail\1.4.7\mail-1.4.7.jar;D:\maven-repository-xs-idea\javax\activation\activation\1.1\activation-1.1.jar;D:\maven-repository-xs-idea\org\apache\poi\poi\3.7\poi-3.7.jar;D:\maven-repository-xs-idea\org\apache\poi\poi-ooxml\3.7\poi-ooxml-3.7.jar;D:\maven-repository-xs-idea\org\apache\poi\poi-ooxml-schemas\3.7\poi-ooxml-schemas-3.7.jar;D:\maven-repository-xs-idea\org\apache\xmlbeans\xmlbeans\2.3.0\xmlbeans-2.3.0.jar;D:\maven-repository-xs-idea\stax\stax-api\1.0.1\stax-api-1.0.1.jar;D:\maven-repository-xs-idea\org\apache\geronimo\specs\geronimo-stax-api_1.0_spec\1.0\geronimo-stax-api_1.0_spec-1.0.jar;D:\maven-repository-xs-idea\dom4j\dom4j\1.6.1\dom4j-1.6.1.jar;D:\maven-repository-xs-idea\xerces\xercesImpl\2.12.0\xercesImpl-2.12.0.jar;D:\maven-repository-xs-idea\xml-apis\xml-apis\1.4.01\xml-apis-1.4.01.jar;D:\maven-repository-xs-idea\net\sourceforge\javacsv\javacsv\2.0\javacsv-2.0.jar;D:\maven-repository-xs-idea\com\101tec\zkclient\0.7\zkclient-0.7.jar;D:\maven-repository-xs-idea\org\slf4j\slf4j-api\1.6.1\slf4j-api-1.6.1.jar;D:\maven-repository-xs-idea\org\slf4j\slf4j-log4j12\1.6.1\slf4j-log4j12-1.6.1.jar;D:\maven-repository-xs-idea\org\apache\zookeeper\zookeeper\3.4.6\zookeeper-3.4.6.jar;D:\maven-repository-xs-idea\jline\jline\0.9.94\jline-0.9.94.jar;D:\maven-repository-xs-idea\io\netty\netty\3.7.0.Final\netty-3.7.0.Final.jar;D:\maven-repository-xs-idea\com\google\guava\guava\20.0\guava-20.0.jar;D:\maven-repository-xs-idea\commons-codec\commons-codec\1.9\commons-codec-1.9.jar;D:\maven-repository-xs-idea\net\dongliu\requests\4.14.1\requests-4.14.1.jar;D:\maven-repository-xs-idea\com\gexin\platform\gexin-rp-sdk-http\4.1.0.5\gexin-rp-sdk-http-4.1.0.5.jar;D:\maven-repository-xs-idea\com\gexin\platform\gexin-rp-sdk-template\4.0.0.24\gexin-rp-sdk-template-4.0.0.24.jar;D:\maven-repository-xs-idea\com\gexin\platform\gexin-rp-sdk-base\4.0.0.30\gexin-rp-sdk-base-4.0.0.30.jar;D:\maven-repository-xs-idea\com\google\protobuf\protobuf-java\2.5.0\protobuf-java-2.5.0.jar;D:\maven-repository-xs-idea\com\gexin\platform\gexin-rp-fastjson\1.0.0.3\gexin-rp-fastjson-1.0.0.3.jar;D:\maven-repository-xs-idea\cn\hutool\hutool-all\4.6.13\hutool-all-4.6.13.jar;D:\maven-repository-xs-idea\com\alibaba\fastjson\1.2.62\fastjson-1.2.62.jar;D:\maven-repository-xs-idea\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;D:\maven-repository-xs-idea\org\apache\pdfbox\fontbox\2.0.15\fontbox-2.0.15.jar;D:\maven-repository-xs-idea\org\apache\pdfbox\pdfbox\2.0.15\pdfbox-2.0.15.jar;D:\maven-repository-xs-idea\io\netty\netty-all\4.1.36.Final\netty-all-4.1.36.Final.jar;D:\maven-repository-xs-idea\org\projectlombok\lombok\1.18.8\lombok-1.18.8.jar;D:\maven-repository-xs-idea\org\apache\curator\curator-framework\2.12.0\curator-framework-2.12.0.jar;D:\maven-repository-xs-idea\org\apache\curator\curator-client\2.12.0\curator-client-2.12.0.jar;D:\maven-repository-xs-idea\org\apache\curator\curator-recipes\2.12.0\curator-recipes-2.12.0.jar;D:\maven-repository-xs-idea\org\apache\tomcat\embed\tomcat-embed-core\8.5.35\tomcat-embed-core-8.5.35.jar;D:\maven-repository-xs-idea\org\apache\tomcat\tomcat-annotations-api\8.5.35\tomcat-annotations-api-8.5.35.jar;D:\maven-repository-xs-idea\javax\validation\validation-api\1.1.0.Final\validation-api-1.1.0.Final.jar;D:\maven-repository-xs-idea\javax\el\javax.el-api\2.2.4\javax.el-api-2.2.4.jar;D:\maven-repository-xs-idea\org\hibernate\hibernate-validator\5.2.0.Final\hibernate-validator-5.2.0.Final.jar;D:\maven-repository-xs-idea\org\jboss\logging\jboss-logging\3.2.1.Final\jboss-logging-3.2.1.Final.jar;D:\maven-repository-xs-idea\com\fasterxml\classmate\1.1.0\classmate-1.1.0.jar;D:\maven-repository-xs-idea\net\coobird\thumbnailator\0.4.8\thumbnailator-0.4.8.jar;D:\maven-repository-xs-idea\com\alibaba\transmittable-thread-local\2.12.1\transmittable-thread-local-2.12.1.jar;D:\maven-repository-xs-idea\commons-lang\commons-lang\2.6\commons-lang-2.6.jar;D:\maven-repository-xs-idea\com\huaban\jieba-analysis\1.0.2\jieba-analysis-1.0.2.jar;D:\maven-repository-xs-idea\org\apache\commons\commons-lang3\3.3.1\commons-lang3-3.3.1.jar;D:\maven-repository-xs-idea\log4j\log4j\1.2.17\log4j-1.2.17.jar;D:\maven-repository-xs-idea\com\github\pagehelper\pagehelper\5.1.3\pagehelper-5.1.3.jar;D:\maven-repository-xs-idea\com\github\jsqlparser\jsqlparser\1.0\jsqlparser-1.0.jar;D:\maven-repository-xs-idea\commons-io\commons-io\2.4\commons-io-2.4.jar;D:\maven-repository-xs-idea\commons-fileupload\commons-fileupload\1.2.2\commons-fileupload-1.2.2.jar" com.yaoex.contract.common.mmap.MemoryMappedFilesExample2
Mapped file content: H2345                           

Process finished with exit code 0



发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言