英文:
Automatic cache eviction based on memory consumption
问题
我想实现一个高效的LRU缓存,它可以根据可用内存自动淘汰项目。
目前我只能想到两种方法:
- 使用gosigar进行轮询。
- 或者设置一个固定的最大值,并定期使用
runtime.ReadMemStats
进行检查。
还有其他的方法吗?memcached
是如何实现的?
英文:
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?
答案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
}
英文:
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
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论