关键字: memcached
memcached因为性能的缘故,没有提供遍历整个缓存当中对象的功能,不过memcached也提供了很多命令来监控memcached的状态,例如stats命令就有:
不一一详细解释了,比较有价值的是stats items和stats cachedump,以及stats detail dump这几个命令,用前两条命令,实际上我们可以遍历整个memcached缓存(尽管效率低下),后一条命令则可以显示最近memcached当中对缓存对象的详细操作情况。
因为我想详细了解一下JavaEye在线运行的memcached服务器当中缓存对象的详细情况,所以花了几十分钟用ruby写了一个小脚本,用来方便的统计缓存对象,此外它还可以让你方便的发送stats命令。用法很简单:
1、统计memcached server当中的对象:
./memcached.rb
输出的结果大致是这样的:
可以告诉你每个对象缓存的确切数量,比方说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
以下是该脚本的源代码,写的很粗糙。
- 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 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
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