use fadvise to control Linux page-cache (#13312)

This PR brings two optimizations mainly
for page-cache build-up and how to avoid
getting OOM killed in the process. Although
these memories are reclaimable Linux is not
fast enough to reclaim them as needed on a
very busy system. fadvise is a system call
implemented in Linux to advise page-cache to
avoid overload as we get significant amount
of requests on the server.

- FADV_SEQUENTIAL tells that all I/O from now
  is going to be sequential, allowing for more
  resposive throughput.

- FADV_NOREUSE tells kernel to start removing
  things for this 'fd' from page-cache.
This commit is contained in:
Harshavardhana
2021-09-28 10:02:56 -07:00
committed by GitHub
parent dd5804c10e
commit 38027c8f52
6 changed files with 73 additions and 1 deletions

View File

@@ -23,6 +23,8 @@ package disk
import (
"os"
"syscall"
"golang.org/x/sys/unix"
)
// Fdatasync - fdatasync() is similar to fsync(), but does not flush modified metadata
@@ -38,3 +40,15 @@ import (
func Fdatasync(f *os.File) error {
return syscall.Fdatasync(int(f.Fd()))
}
// fdavise advice constants
const (
FadvSequential = unix.FADV_SEQUENTIAL
FadvNoReuse = unix.FADV_NOREUSE
)
// Fadvise implements possibility of choosing
// offset: 0, length: 0
func Fadvise(f *os.File, advice int) error {
return unix.Fadvise(int(f.Fd()), 0, 0, advice)
}

View File

@@ -29,3 +29,15 @@ import (
func Fdatasync(f *os.File) error {
return syscall.Fsync(int(f.Fd()))
}
// fdavise advice constants
const (
FadvSequential = 0
FadvNoReuse = 0
)
// Fadvise implements possibility of choosing
// offset: 0, length: 0
func Fadvise(f *os.File, advice int) error {
return nil
}

View File

@@ -28,3 +28,15 @@ import (
func Fdatasync(f *os.File) error {
return nil
}
// fdavise advice constants
const (
FadvSequential = 0
FadvNoReuse = 0
)
// Fadvise implements possibility of choosing
// offset: 0, length: 0
func Fadvise(f *os.File, advice int) error {
return nil
}