1
ruandao 2021-03-16 19:42:24 +08:00 2
不是因为零拷贝所以比较快吗?
|
2
lusi1990 2021-03-16 19:49:06 +08:00
HDD 顺序读写 比 乱序读写 快
|
3
jim9606 2021-03-16 23:15:33 +08:00
如果你没用 os.lseek,那基本就是顺序读写,具体是不是顺序读写还要看文件是不是顺序分布在磁盘上,但这是文件系统管的事,python 管不着这个。
|
4
ch2 2021-03-16 23:43:32 +08:00
|
5
xupefei 2021-03-16 23:46:54 +08:00 via iPhone
顺序还是乱序是系统底层的事,面向用户的是一个抽象层,不再有顺序乱序的概念。
不过有一句话是可以说的:如果不断追加写入同一个文件,那这个文件在磁盘里是一整块的可能性比较高。 |
6
BBCCBB 2021-03-17 08:45:15 +08:00
比如机械盘, 就是不要让他重复去寻址, 写完继续在当前地址继续写..
|
7
lewis89 2021-03-17 09:06:09 +08:00 via iPhone
一般是预申请磁盘空间,这样文件驱动系统分配会连续
|
8
wakzz 2021-03-17 09:06:56 +08:00
1. 同一个文件从头都到尾
2. 该文件物理磁盘位置顺序,即写的时候是先申请大块存储空间,然后再在申请的空白空间上写文件,防止文件碎片的问题 3. 该文件不修改或少修改,避免文件碎片 |
9
wakzz 2021-03-17 09:10:09 +08:00 1
@ruandao 零拷贝看上去高大上,其实效果远不如物理文件顺序读写,IO 读写才是性能损耗大头,数据内核拷贝的消耗相对来说就是个零头
|
10
smallpython OP @jim9606 这就是我疑惑的点, 我也觉得默认就是顺序读写的, 但是如果是这样的话 kafka 单独拿这个出来吹嘘就感觉很奇怪了, 可能还是得深入了解一下他到底是什么意思
|
11
xxxyh 2021-03-17 09:32:10 +08:00
kafka 只有追加写的场景,肯定是顺序写,又不是 mysql,还有中间插入一条记录和修改某条记录的需求
|
12
4kingRAS 2021-03-17 09:41:27 +08:00
计算机的原理都是相似的,可以看看 malloc 的算法。为了减少 “找 /切换” 的开销,就会用 “池 /预分配” 的方法。
|
13
passerbytiny 2021-03-17 09:51:18 +08:00 via Android
印象中,kafka 只用很小的篇幅介绍了“顺序读写的 HDD 也很快”,然后花了大量的篇幅去介绍它是如何做到顺序读写的。
|
14
cheng6563 2021-03-17 09:58:49 +08:00
一些支持数据库都是写一点数据就写一点日志的,写完日志又回去标记下数据,这样就不顺序了。
|
15
xx6412223 2021-03-17 10:20:26 +08:00
@smallpython kafka 的快主要是工作的流程上。client 和分区一一对应,无锁,无随机读,无数据预处理。直接将一个文件的字节一段段传输给 client 。
|
16
draymonder 2021-03-17 10:58:46 +08:00 1
|
17
swulling 2021-03-17 12:51:36 +08:00
@smallpython 人家也没有吹嘘。
顺序读写你直接 append 是无法保证顺序的,kafka 是通过预创建 segment 文件才能保证顺序,每个文件大小默认应该是 1G 。另外读取用的 MMAP 才能保证零拷贝读取,这里面有很多工程细节,远不如你想的那么简单。 |
18
abersheeran 2021-03-17 13:06:28 +08:00
任何语言,不 seek 只用 write 都是会保持写入顺序的,但是实际落盘的扇区不一定连续。扇区不连续就意味着读的时候磁头还会做无意义的移动,而不是很顺畅的从头划到尾就行了。
你可以试试用 Python 在一块垃圾机械磁盘上不停 write,效率还是不错的,我在公司发给我的垃圾电脑上试过。 另外,如果你使用过 Windows,那么应该记得 Windows 有一个系统功能就是整理碎片。这个碎片就是指扇区的分布太散,文件读写的时候会慢。 |
19
GrayXu 2021-03-17 13:06:53 +08:00
@smallpython 这里的 default 只是说选择吧,不是说这个设计是 naive 的。。
|
20
mepwang 2021-03-17 13:58:22 +08:00
这和操作系统的 IO 缓存机制有关
由于 IO 操作比 CPU 和内存操作慢数个数量级,在进行磁盘 IO 时,操作系统不会一次只读取一个或几个字节,而是一次性读取一大块数据(比如每次 IO 都会读取 64K )。要是顺序读取的话,需要的数据大概率落在一个数据块中,实际发生的 IO 操作只有一次,因此就表现的比较快。 |
21
sakura1 2021-03-17 14:07:44 +08:00
这两个问题不是一个层面的问题吧,python 不得参考 python 的解释器,如果是 c 写的,那不得看对应的系统调用是哪个,kafka 写磁盘用的是 java nio,jvm 的实现底层也是系统调用,所以说这个问题,往深里挖跟 python 与 kafka 关系不大。
|
22
zhzy0077 2021-03-17 23:07:57 +08:00
@smallpython 顺序写大家都行,但是只用顺序写实现一个 Kafka 就不是人人都能做到的了,普通人 append-only 写个二叉树更新都难
|