3 回答
TA贡献1802条经验 获得超6个赞
您可能会喜欢我为此目的制作的directio 包。
从网站
这是 Go 语言的库,可以在所有支持的 Go 操作系统(openbsd 和 plan9 除外)下使用 Direct IO。
直接 IO 执行与磁盘的 IO 操作,而无需在操作系统中缓冲数据。当您正在读取或写入大量不想填满操作系统缓存的数据时,它很有用。
请参阅此处获取软件包文档
http://go.pkgdoc.org/github.com/ncw/directio
TA贡献1797条经验 获得超6个赞
从open
手册页,在 NOTES 下:
O_DIRECT 标志可能会对用户空间缓冲区的长度和地址以及 I/O 的文件偏移量施加对齐限制。在 Linux 中,对齐限制因文件系统和内核版本而异,并且可能完全不存在。
因此,您可能会遇到内存或文件偏移量的对齐问题,或者您的缓冲区大小可能“错误”。对齐方式和大小应该是什么并不明显。手册页继续:
然而,目前没有独立于文件系统的接口供应用程序发现给定文件或文件系统的这些限制。
甚至 Linus 也以他一贯低调的方式表示:
“关于 O_DIRECT 一直困扰我的事情是整个界面只是愚蠢的,并且可能是由疯狂的猴子在一些严重的精神控制物质上设计的。” ——莱纳斯
祝你好运!
ps 暗中刺痛:为什么不读取 512 字节?
TA贡献1963条经验 获得超6个赞
您可以尝试使用 fadvice 和 madvice,但不能保证。两者都更可能适用于更大的文件/数据,因为:
部分页面是故意保留的,因为期望保留需要的内存比丢弃不需要的内存要好。
查看 linux 源代码,什么会做什么,什么不会。例如 POSIX_FADV_NOREUSE 不做任何事情。
http://lxr.free-electrons.com/source/mm/fadvise.c#L62
http://lxr.free-electrons.com/source/mm/madvise.c
package main
import "fmt"
import "os"
import "syscall"
import "golang.org/x/sys/unix"
func main() {
advise := false
if len(os.Args) > 1 && os.Args[1] == "-x" {
fmt.Println("setting file advise")
advise =true
}
data := make([]byte, 100)
handler, err := os.Open("Foo.txt")
if err != nil {
fmt.Println("Failed on open: ", err)
}; defer handler.Close()
if advise {
unix.Fadvise(int(handler.Fd()), 0, 0, 4) // 4 == POSIX_FADV_DONTNEED
}
read, err := handler.Read(data)
if err != nil {
fmt.Println("Failed on read: ", err)
os.Exit(1)
}
if advise {
syscall.Madvise(data, 4) // 4 == MADV_DONTNEED
}
fmt.Printf("read %v bytes\n", read)
}
/usr/bin/time -v ./direct -x
Command being timed: "./direct -x"
User time (seconds): 0.00
System time (seconds): 0.00
Percent of CPU this job got: 0%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.03
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 1832
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 2
Minor (reclaiming a frame) page faults: 149
Voluntary context switches: 2
Involuntary context switches: 2
Swaps: 0
File system inputs: 200
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0
- 3 回答
- 0 关注
- 318 浏览
添加回答
举报