深入拆解消息队列 47 讲
许文强
前腾讯云 Kafka 技术负责人
5385 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 50 讲
深入拆解消息队列 47 讲
15
15
1.0x
00:00/00:00
登录|注册

18|性能:Java开发分布式存储系统都有哪些常用的编码技巧?

你好,我是文强。
到了这节课,我们的课程已经讲完三分之一了。前面我们讲了消息队列各个模块的设计、权衡、思考、选型,基本覆盖了基础核心架构中的所有细节了。
我一直认为,架构设计选型和编码是两个事情,魔鬼在细节,不管多牛逼的架构,都需要细致的工程化实现,才能达到我们预期的效果。这节课我们将用很零散的方式讲一下用 Java 来开发存储系统时会用到的一些技巧及其背后的原理。其中的每个知识点都是独立的,你可以挑自己感兴趣的部分学习。

PageCache 调优和 Direct IO

我们一直会听到 PageCache,简单理解它就是内存。写内存性能肯定是最高的。但是 PageCache 并不是万能的,在某些情况下会存在命中率低,导致读写性能不高的情况。遇到这种情况,就需要在业务上进行处理。我们先来看下面这张图:
如上图所示,应用程序读取文件,会经过应用缓存、PageCache、DISK(硬盘)三层。即应用程序读取文件时,Linux 内核会把从硬盘中读取的文件页面缓存在内存一段时间,这个文件缓存被称为 PageCache。
缓存的核心逻辑是:比如应用层要读 1KB 文件,那么内核的预读算法则会以它认为更合适的大小进行预读  I/O,比如 16-128KB。当应用程序下次读数据的时候,会先尝试读 PageCache,如果数据在 PageCache 中,就会直接返回;如果数据不在 PageCache 中,就会触发从硬盘读取数据,效率就会变低。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文总结了Java开发分布式存储系统中常用的编码技巧,涵盖了PageCache调优和Direct IO、FileChannel和mmap、预分配文件、预初始化和池化等方面。其中,介绍了PageCache的作用和不足,并探讨了通过使用Direct IO来模拟实现PageCache的效果。此外,还详细介绍了FileChannel和mmap的基本使用方式和性能特点,以及如何通过预分配文件和预初始化来提高文件写入性能,以及对象池化的思路和实现方式。此外,还涉及了堆内内存和堆外内存的选择、同步刷盘、AEP存储介质、线程绑核、SSD的4KB对齐等优化手段。这些技巧对于Java开发者在开发存储系统时具有重要的指导意义,能够帮助他们优化性能、提高效率。另外,文章还提到了一些其他知识点,如顺序读写的优势、合并写入的效率、以及在某些场景下可以考虑数组替代或重写Map等。总的来说,本文为读者提供了丰富的Java开发存储系统的优化技巧,对于提高系统性能具有重要参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入拆解消息队列 47 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(2)

  • 最新
  • 精选
  • Kevin
    干货总结,点赞six six six
    2023-08-07归属地:广东
    1
  • 如果可以改变
    在某些场景下,比如数据的集合长度是固定的时候,可以考虑数组替代或者重写 Map,用来降低 HashMap 的 overheap。 上述 HashMap 的 overheap 应该是 overhead 吧!老师,如何降低 map 的 overhead ?
    2023-07-31归属地:上海
    2
    1
收起评论
显示
设置
留言
2
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部