aboutsummaryrefslogtreecommitdiff
path: root/bolt_unix.go
diff options
context:
space:
mode:
authorBen Johnson <benbjohnson@yahoo.com>2015-06-02 13:04:44 -0600
committerBen Johnson <benbjohnson@yahoo.com>2015-06-02 13:04:44 -0600
commit88f777f332022ad2b92be5ceccf1863e9fb4d53f (patch)
treecae3e76e053a1931b9ac9699f3c1b7df7aad2e8b /bolt_unix.go
parentMerge pull request #379 from benbjohnson/tx-doc (diff)
downloaddedo-88f777f332022ad2b92be5ceccf1863e9fb4d53f.tar.gz
dedo-88f777f332022ad2b92be5ceccf1863e9fb4d53f.tar.xz
Add madvise() after mmap().
This commit advises the mmapped data file to use MADV_RANDOM to avoid readahead. This can provide a performance boost to Bolt databases that are larger than memory by avoiding unnecessary disk i/o.
Diffstat (limited to 'bolt_unix.go')
-rw-r--r--bolt_unix.go14
1 files changed, 14 insertions, 0 deletions
diff --git a/bolt_unix.go b/bolt_unix.go
index 266222a..17ca318 100644
--- a/bolt_unix.go
+++ b/bolt_unix.go
@@ -63,6 +63,11 @@ func mmap(db *DB, sz int) error {
return err
}
+ // Advise the kernel that the mmap is accessed randomly.
+ if err := madvise(b, syscall.MADV_RANDOM); err != nil {
+ return fmt.Errorf("madvise: %s", err)
+ }
+
// Save the original byte slice and convert to a byte array pointer.
db.dataref = b
db.data = (*[maxMapSize]byte)(unsafe.Pointer(&b[0]))
@@ -84,3 +89,12 @@ func munmap(db *DB) error {
db.datasz = 0
return err
}
+
+// NOTE: This function is copied from stdlib because it is not available on darwin.
+func madvise(b []byte, advice int) (err error) {
+ _, _, e1 := syscall.Syscall(syscall.SYS_MADVISE, uintptr(unsafe.Pointer(&b[0])), uintptr(len(b)), uintptr(advice))
+ if e1 != 0 {
+ err = e1
+ }
+ return
+}