相关知识点介绍

1: Kafka 为什么读写性能这么快 

      Kafka 使用了顺序读写

         kafka 顺序读写 大约 600M/s ;随机读写 大约 100kb/s

         随机和顺序读写,是存储器的两种输入输出方式。

         随机写:存储的数据再磁盘中占据空间,对于一个新磁盘,操作系统会将数据文件依次写入磁盘,当有些数据呗删除时,就会空出改数据原来占用的存储空间,时间长了,不断的写入删除数据,就会产生很多零零散散的空间,就会造成一个较大的数据文件放在许多不连续的存储空间上,读写这部分数据时,就是随机写;

        随机读写,磁头要不断的调整磁道的位置,以在不同的位置上读写数据,相对于连续空间上的顺序读写,要耗时很多。在开机时、启动大型程序时,电脑要读取大量小文件,而这些文件也不是连续存放的,也属于随机读取的范围。

       改善方法 : 做磁盘碎片整理,合并碎片文件,但随后还会再产生碎片造成磁盘的读写性能下降,而且也解决不了小文件的随机读取问题,这只是治标! 更好的解决办法:更换电子硬盘(ssd),电子硬盘忧郁免除了机械硬盘的磁头运动,对于数据读写有极大提高。

      Memory Mapped Files

         即便顺序写入硬盘,硬盘的访问速度还是不可能追上内存。所以,kafka的数据并不是实时的写入硬盘,它充分利用了现代操作系统分页存储来利用内容提高I/O效率。

         Memory Mapped Files 也成为内存映射文件,在64位操作系统中一般可以表示 20G 的数据文件,它的工作原理直接利用操作系统的Page来实现文件到屋里内存的映射。完成映射之后你对物理内存的操作会被同步到硬盘上。

         通过 mmap ,进程像读写硬盘一样读写内存(虚拟内存),也不必关心内存的大小,有虚拟内存为我们兜底。

      消费者读取数据

         一个 web server 传送一个静态文件,如何优化?答案是 zero copy 。传统模式下,我们从硬盘读取一个文件如下:先复制到内核空间(read是系统调用,放到DMA,所以用内核空间),然后复制到用户空间,从用户空间重新复制到内核空间,最后发送给网卡。

         Zero Copy中直接从内核空间(DMA)到内核空间 (Socket),然后发送给网卡。

总结:

         Kafka 把所有的消息都放在一个一个文件中。通过mmap提高I/O速度,写入数据的时候它是末尾添加所以速度最优;读取数据的时候配合sendfile直接暴力输出。

发布了33 篇原创文章 · 获赞 3 · 访问量 5857

猜你喜欢

转载自blog.csdn.net/WandaZw/article/details/85324159
今日推荐