https://github.com/brk0v/directio
Direct IO Golang Writer (Linux O_DIRECT)
https://github.com/brk0v/directio
direct directio io o-direct pagecache
Last synced: 3 days ago
JSON representation
Direct IO Golang Writer (Linux O_DIRECT)
- Host: GitHub
- URL: https://github.com/brk0v/directio
- Owner: brk0v
- License: apache-2.0
- Created: 2019-02-20T22:22:50.000Z (almost 7 years ago)
- Default Branch: master
- Last Pushed: 2024-11-05T17:26:41.000Z (about 1 year ago)
- Last Synced: 2024-11-05T18:32:38.060Z (about 1 year ago)
- Topics: direct, directio, io, o-direct, pagecache
- Language: Go
- Homepage:
- Size: 15.6 KB
- Stars: 41
- Watchers: 2
- Forks: 10
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Linux Direct IO Writer
Direct IO writer using O_DIRECT
> [!WARNING]
> `/tmp/` in modern systems doesn't supoprt Direct I/O, for tests use `/var/tmp` instead.
Example:
```go
package main
import (
"io"
"log"
"net/http"
"os"
"syscall"
"github.com/brk0v/directio"
)
func main() {
// Open file with O_DIRECT
flags := os.O_WRONLY | os.O_EXCL | os.O_CREATE | syscall.O_DIRECT
f, err := os.OpenFile("/var/tmp/mini.iso", flags, 0644)
if err != nil {
log.Fatal(err)
}
defer f.Close()
// Use directio writer
dio, err := directio.New(f)
if err != nil {
log.Fatal(err)
}
defer dio.Flush()
// Downloading iso image
resp, err := http.Get("http://archive.ubuntu.com/ubuntu/dists/bionic/main/installer-amd64/current/images/netboot/mini.iso")
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
// Write the body to file
_, err = io.Copy(dio, resp.Body)
}
```
Check that dio bypass linux pagecache using `vmtouch`:
```bash
$ vmtouch /var/tmp/mini.iso
Files: 1
Directories: 0
Resident Pages: 1/16384 4K/64M 0.0061%
Elapsed: 0.000356 seconds
```
or using my `https://github.com/brk0v/cpager` to check per cgroup pagecache usage:
```bash
$ sudo ~/go/bin/cpager /var/tmp/mini.iso
Files: 1
Directories: 0
Resident Pages: 1/16385 4K/64M 0.0%
cgmem inode percent pages path
- 100.0% 16384 not charged
2187 0.0% 1 /sys/fs/cgroup/memory/user.slice/user-1000.slice/session-3.scope
```