修改 Linux 交换页大小,以便实现 SSD 上更快的随机查询问题?

2023-06-14 14:14:27 +08:00
 bigtang
在 linux 中,用 mmap 映射一个文件返回一个内存指针,从该指针中读取一个字节,Linux 会从磁盘上读取该字节所在的整页数据(一般是 4096 字节),这导致在磁盘上随机查询,比在内存中慢数千倍,因为 SSD 本来就比内存慢 100 倍,而读取几个字节可能就要读 4096 字节整页数据,又慢了几百倍。linux 的交换页大小 4096 字节是不能更改的,除非在编译 linux 系统前修改。如果不能更改交换页大小,如何能够在用 mmap 读取几个字节时,不要从磁盘读整页数据?我的最终目的是想在 SSD 磁盘中随机查找数据,速度可以是内存的 1/100 ,但不能更慢了。
1468 次点击
所在节点    Linux
10 条回复
billlee
2023-06-14 14:17:58 +08:00
但是磁盘读取也是一次至少读 4K 的啊
oldsix2
2023-06-14 14:31:39 +08:00
SSD 磁盘最小 IO 是 Block 限制的吧,这个 mount 之前应该可以修改的。
改的太小,对于一次获取大量数据的情况,IO 次数会成倍增加。
GrayXu
2023-06-14 14:37:03 +08:00
如#1 ,SSD 不能不读整页数据,就像 DRAM 也得按 64B 来操作。
codehz
2023-06-14 14:47:26 +08:00
还有 page size 的问题,这个部分也不是说改代码就能解决的(
lemonleo
2023-06-14 14:52:54 +08:00
从 SSD 向内存读取整页数据和读取几个字节数据相比,应该不会慢几百倍那么多。
twl007
2023-06-14 14:56:47 +08:00
整页读取就是为了解决按字节读取太慢的问题 如果真的按照按字节去读取 速度那是真的慢

另外 SSD 本身底层的逻辑也是随机读写 跟 HDD 不一样
x1596357
2023-06-14 14:58:35 +08:00
从读取几个字节跟读取 4k 速度几乎可以说没有多大差别。因为 ssd 的设计,一读就是一个 flash 的行。你可以尝试使用 vmtouch 之类的工具,先把文件预读到内存里。不要局限于一种思路。
ho121
2023-06-14 15:04:49 +08:00
1. 程序中只读取几个字节,操作系统不会真仅仅读取这几个字节的数据。第一次读取可能需要把页换到内存里,下一次读取同页的数据时,大概率是直接在内存中读取的。
2. 硬盘读取数据也是按“块”来读取的,而不是一个字节一个字节的读取。哪怕操作系统真的读取 1 字节的数据,硬盘也会把整个块读取出来,然后返回这一个字节的数据。如果是读取连续几个字节的数据,且在同一个块内,硬盘只需要一次读操作。
litguy
2023-06-14 15:15:49 +08:00
字节读取 SSD 不支持,这是块存储
你需要的是傲腾 memory
MrKrabs
2023-06-19 22:44:08 +08:00
是不是你的 ssd 太拉了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/948656

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX