3

我有一个 Java 应用程序,它使用 spymemcached 库 (http://code.google.com/p/spymemcached) 来读取对象并将对象写入 memcached。

该应用程序始终将相同类型的对象缓存到 memcached。缓存的对象始终是 5 或 6 个 java.util.Strings 的 ArrayList。使用 SizeOf 库 (http://www.codeinstructions.com/2008/12/sizeof-for-java.html),我确定 ArrayList 的平均深度大小约为 800 字节。

总的来说,我为 memcached 分配了 12 GB 的 RAM。我的问题是:memcached 可以容纳多少个这些对象?

我不清楚使用 SizeOf 中的“800 字节”度量是否正确,或者这是否具有误导性。例如,SizeOf 将每个 char 计为 2 个字节。我知道我的字符串中的每个字符都是常规的 ASCII 字符。我相信 spymemcached 使用 Java 序列化,我不确定这是否会导致每个字符占用 1 个字节或 2 个字节。

另外,我不知道 memcached 使用了多少每个对象的开销。因此,计算应考虑 memcached 用于其自身内部数据结构的 RAM。

我不需要一个 100% 准确的数字。粗略的粗略计算会很棒。

4

1 回答 1

4

简单的方法是实验:

  1. 重新启动内存缓存
  2. 检查分配的字节数:echo "stats" | nc localhost 11211 | fgrep "bytes "
  3. 插入 1 个对象,检查分配的字节数
  4. 插入 10 个对象,检查分配的字节数
  5. 等等

这应该让您对每键字节数有一个很好的了解。

但是,即使您计算出您的序列化大小,仅此一项也可能无法告诉您该大小的 memcache 将容纳多少对象。Memcache 的slab 系统和LRU 实现使得对这种性质的任何类型的估计都变得困难。

Memcache 似乎并没有真正围绕保证数据可用性而设计——当您获取密钥时,它可能存在,也可能不存在:也许它被过早地清除了;可能您池中的一两台服务器出现故障。

于 2011-04-01T19:47:01.657 回答