请您先登录,才能继续操作
浏览 6157 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-10-13
stats stats reset stats malloc stats maps stats sizes stats slabs stats items stats cachedump slab_id limit_num stats detail [on|off|dump] 不一一详细解释了,比较有价值的是stats items和stats cachedump,以及stats detail dump这几个命令,用前两条命令,实际上我们可以遍历整个memcached缓存(尽管效率低下),后一条命令则可以显示最近memcached当中对缓存对象的详细操作情况。 因为我想详细了解一下JavaEye在线运行的memcached服务器当中缓存对象的详细情况,所以花了几十分钟用ruby写了一个小脚本,用来方便的统计缓存对象,此外它还可以让你方便的发送stats命令。用法很简单: 1、统计memcached server当中的对象: ./memcached.rb 输出的结果大致是这样的: Problem : 4564 GroupPost : 5643 User : 27133 Group : 144 ... Post : 44442 PostText : 255286 ...... views : 36260 Forum : 27 Category : 15065 可以告诉你每个对象缓存的确切数量,比方说PostText被缓存了25万个对象,页面被缓存了3.6万个。这个统计方法是根据Rails内置的Cache生成的key做的解析,也许你要根据自己的应用调整一下解析代码。 2、统计memcached的对象和对象的大小 ./memcached.rb stats sizes 3、监控memcached的缓存操作情况 ./memcached.rb stats detail on ./memcached.rb stats detail dump ./memcached.rb stats detail off 以下是该脚本的源代码,写的很粗糙。 #!/usr/bin/env ruby require 'socket' # stats # stats reset # stats malloc # stats maps # stats sizes # stats slabs # stats items # stats cachedump slab_id limit_num # stats detail [on|off|dump] class Memcache class << self def open(host, port) s = TCPSocket.open(host, port) yield s if block_given? ensure s.close if s end def command(command_string, s) s.send(command_string + "\r\n", 0) buff = [] until ["END", "OK", "DELETE", "ERROR"].include?(line = s.gets.strip) do buff << line end buff end def exec(command_string, host = "javaeye", port = 11211) open(host, port) { |socket| command(command_string, socket).each {|line| puts line } } end def cache_stats(host = "javaeye", port = 11211) cache_objects = {} open(host, port) do |socket| slabs = [] command("stats items", socket).each do |line| slab_id = line.split[1].split(":")[1].to_i slabs << slab_id unless slabs.include?(slab_id) end slabs.each do |slab_id| puts "browse slab #{slab_id}..." command("stats cachedump #{slab_id} 0", socket).each do |item| key = item.split[1].split("/")[0].to_s cache_objects.include?(key) ? cache_objects[key] += 1 : cache_objects[key] = 1 end end end cache_objects.each_pair {|key, value| puts "#{key} : #{value}"} end end end if ARGV.size == 0 Memcache.cache_stats else Memcache.exec(ARGV.join(" ")) end 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-10-13
你好,请问能不能把这两个命令(stats items和stats cachedump)遍历的过程说一下
不过通过stats detail dump也可以拿到所有的KEY,应该也可以遍历 |
|
返回顶楼 | |
发表时间:2008-10-22
你好,我现在要使用memcached,目前正在为key如何定义犯难。主要问题在于如何保证从memcached中取出的和数据库中的保持一致,因为同一表同一字段的数据可以用不同的sql获取,如果进行了修改,如何才能保证memcached中的也都修改了呢?请指点迷津!!!谢谢
|
|
返回顶楼 | |
发表时间:2008-10-23
请教robbin大哥,我记得memcachetool可以移动slab中page到另一个slab中,这个是用什么命令呢
------------------------------------------- 找到了,是 slabs reassign #{from} #{to} \r\n 问题是只有一个slab满了才能把其他slab中的page移动过来,看来这个操作的前提条件还是比较严格的 |
|
返回顶楼 | |
发表时间:2008-10-23
ahuaxuan 写道 请教robbin大哥,我记得memcachetool可以移动slab中page到另一个slab中,这个是用什么命令呢 ------------------------------------------- 找到了,是 slabs reassign #{from} #{to} \r\n 问题是只有一个slab满了才能把其他slab中的page移动过来,看来这个操作的前提条件还是比较严格的 我们JavaEye的memcached server是所有的slab都满了,缓存命中率又很高,达到了96%。所以一直没有机会用上这个命令,呵呵。 |
|
返回顶楼 | |