本文介绍了基于内存消耗的自动缓存驱逐的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想实现一个高效的LRU缓存,可以根据空闲内存自动清除项目。

现在只有两件事情可以想到:




  • 使用进行投票

  • 或设置固定的最大值并定期检查 runtime.ReadMemStats



是否有其他方法? memcached 如何做到这一点?

解决方案

我实现了轮询系统内存统计数据每1秒。



请参阅:



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

 导入(
系统调用


func ReadSysMemStats(s * MemStats)错误{
if s == nil {
返回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

$ n
}

在Darwin / OSX上

  / * 
#include< mach / mach.h>
#include< mach / mach_host.h>
* /
进口C

进口(
fmt
不安全


func readSysMemStats(s * SysMemStats)错误{
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)
}

//以字节为单位的数据
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
}


I want to implement an efficient LRU cache that automatically evicts items based on free memory.

Right now only 2 things come to mind:

  • Poll with gosigar
  • or set a fixed maximum and periodically check runtime.ReadMemStats.

Are there any other ways? How does memcached do it?

解决方案

I implemented it polling the system memory statistics every 1 second.

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

Read memory stats on 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
}

And on 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
}

这篇关于基于内存消耗的自动缓存驱逐的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-20 01:33