【问题标题】:Automatic cache eviction based on memory consumption基于内存消耗的自动缓存驱逐
【发布时间】:2013-11-15 11:48:01
【问题描述】:

我想实现一个高效的 LRU 缓存,它会根据空闲内存自动驱逐项目。

现在只有两件事浮现在脑海:

  • 投票gosigar
  • 或设置一个固定的最大值并定期检查runtime.ReadMemStats

还有其他方法吗? memcached是怎么做到的?

【问题讨论】:

  • 在 memcached 中,您指定要使用的内存量,它不适应操作系统或进程的内存容量或要求。
  • 我有点喜欢用户调整的缓存大小,比如 memcached(以及 Go 中的 groupcache)。如果你想要一些自适应策略,也许让用户根据 total RAM 的百分比来指定大小,并默认为 1% 之类的安全值。空闲 RAM 在 Linux 中是一个有趣的数字,因为内核会尝试将 RAM 用于缓冲区/缓存以加速 I/O,并且它会根据系统当前的工作负载而有所不同。依赖它可能会使你的缓存的行为和对它运行的盒子的影响有点不可预测。
  • 总内存的 1%?这就像缓存可以在 1GB 机器上保存 1000 个对象。也许我应该提到这不是一个单独的二进制文件,而是一个嵌入内存缓存的应用程序。

标签: go


【解决方案1】:

我实现了它每 1 秒轮询一次系统内存统计信息。

见:https://github.com/eaigner/last

在 Linux 上读取内存统计信息:

import (
    "syscall"
)

func ReadSysMemStats(s *MemStats) error {
    if s == nil {
        return nil
    }
    var info syscall.Sysinfo_t
    err := syscall.Sysinfo(&info)
    if err != nil {
        return err
    }

    s.Total = info.Totalram
    s.Free = info.Freeram
    s.Used = s.Total - s.Free

    return nil
}

在 Darwin/OSX 上

/*
#include <mach/mach.h>
#include <mach/mach_host.h>
*/
import "C"

import (
    "fmt"
    "unsafe"
)

func readSysMemStats(s *SysMemStats) error {
    if s == nil {
        return nil
    }
    var vm_pagesize C.vm_size_t
    var vm_stat C.vm_statistics_data_t
    var count C.mach_msg_type_number_t = C.HOST_VM_INFO_COUNT

    host_port := C.host_t(C.mach_host_self())

    C.host_page_size(host_port, &vm_pagesize)

    status := C.host_statistics(
        host_port,
        C.HOST_VM_INFO,
        C.host_info_t(unsafe.Pointer(&vm_stat)),
        &count)

    if status != C.KERN_SUCCESS {
        return fmt.Errorf("could not get vm statistics: %d", status)
    }

    // Stats in bytes
    free := uint64(vm_stat.free_count)
    active := uint64(vm_stat.active_count)
    inactive := uint64(vm_stat.inactive_count)
    wired := uint64(vm_stat.wire_count)
    pagesize := uint64(vm_pagesize)

    s.Used = (active + inactive + wired) * pagesize
    s.Free = free * pagesize
    s.Total = s.Used + s.Free

    return nil
}

【讨论】:

    猜你喜欢
    • 2014-10-27
    • 1970-01-01
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    相关资源
    最近更新 更多