An open API service indexing awesome lists of open source software.

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)

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
```