3 回答

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超6個(gè)贊
您可能會(huì)喜歡我為此目的制作的directio 包。
從網(wǎng)站
這是 Go 語(yǔ)言的庫(kù),可以在所有支持的 Go 操作系統(tǒng)(openbsd 和 plan9 除外)下使用 Direct IO。
直接 IO 執(zhí)行與磁盤的 IO 操作,而無(wú)需在操作系統(tǒng)中緩沖數(shù)據(jù)。當(dāng)您正在讀取或?qū)懭氪罅坎幌胩顫M操作系統(tǒng)緩存的數(shù)據(jù)時(shí),它很有用。
請(qǐng)參閱此處獲取軟件包文檔
http://go.pkgdoc.org/github.com/ncw/directio

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊
從open
手冊(cè)頁(yè),在 NOTES 下:
O_DIRECT 標(biāo)志可能會(huì)對(duì)用戶空間緩沖區(qū)的長(zhǎng)度和地址以及 I/O 的文件偏移量施加對(duì)齊限制。在 Linux 中,對(duì)齊限制因文件系統(tǒng)和內(nèi)核版本而異,并且可能完全不存在。
因此,您可能會(huì)遇到內(nèi)存或文件偏移量的對(duì)齊問題,或者您的緩沖區(qū)大小可能“錯(cuò)誤”。對(duì)齊方式和大小應(yīng)該是什么并不明顯。手冊(cè)頁(yè)繼續(xù):
然而,目前沒有獨(dú)立于文件系統(tǒng)的接口供應(yīng)用程序發(fā)現(xiàn)給定文件或文件系統(tǒng)的這些限制。
甚至 Linus 也以他一貫低調(diào)的方式表示:
“關(guān)于 O_DIRECT 一直困擾我的事情是整個(gè)界面只是愚蠢的,并且可能是由瘋狂的猴子在一些嚴(yán)重的精神控制物質(zhì)上設(shè)計(jì)的?!?nbsp;——萊納斯
祝你好運(yùn)!
ps 暗中刺痛:為什么不讀取 512 字節(jié)?

TA貢獻(xiàn)1963條經(jīng)驗(yàn) 獲得超6個(gè)贊
您可以嘗試使用 fadvice 和 madvice,但不能保證。兩者都更可能適用于更大的文件/數(shù)據(jù),因?yàn)椋?/p>
部分頁(yè)面是故意保留的,因?yàn)槠谕A粜枰膬?nèi)存比丟棄不需要的內(nèi)存要好。
查看 linux 源代碼,什么會(huì)做什么,什么不會(huì)。例如 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 關(guān)注
- 361 瀏覽
添加回答
舉報(bào)