оценка размера объектов Java внутри memcached - PullRequest
3 голосов
/ 01 апреля 2011

У меня есть приложение Java, которое использует библиотеку spymemcached (http://code.google.com/p/spymemcached) для чтения и записи объектов в memcached.

Приложение всегда кэширует один и тот же тип объекта в memcached. Кэшированный объект всегда представляет собой ArrayList из 5 или 6 java.util.Strings. Используя библиотеку SizeOf (http://www.codeinstructions.com/2008/12/sizeof-for-java.html), Я определил, что средний глубокий размер ArrayList составляет около 800 байт.

В целом, я выделил 12 ГБ оперативной памяти для memcached. Мой вопрос: сколько из этих объектов может хранить memcached?

Мне не ясно, правильно ли использовать метрику "800 байт" из SizeOf, или это вводит в заблуждение. Например, SizeOf считает каждый символ равным 2 байта. Я знаю, что каждый символ в моей строке - это обычный символ ASCII. Я полагаю, что spymemcached использует сериализацию Java, и я не уверен, что каждый символ занимает 1 или 2 байта.

Кроме того, я не знаю, сколько накладных расходов на каждый объект использует memcached. Таким образом, расчет должен учитывать оперативную память, которую memcached использует для своих собственных внутренних структур данных.

Мне не нужен номер, который на 100% точен. Грубый расчет с обратной стороны был бы хорош.

1 Ответ

4 голосов
/ 01 апреля 2011

Простым подходом будет эксперимент:

  1. перезапустить memcache
  2. Проверка выделенных байтов: echo "stats" | nc localhost 11211 | fgrep "bytes "
  3. вставить 1 объект, проверить выделенные байты
  4. вставить 10 объектов, проверить выделенные байты
  5. и т.д.

Это должно дать вам хорошее представление о байтах на ключ.

Однако, даже если вы определите свой сериализованный размер, одно это, вероятно, не скажет вам, сколько объектов этого размера будет содержать memcache. Система slab-систем Memcache и реализация LRU затрудняют любую оценку такого рода.

Memcache, похоже, на самом деле не предназначен для обеспечения доступности данных - когда вы ПОЛУЧАЕТЕ ключ, он может быть там или не может: возможно, он был преждевременно очищен; возможно один или два сервера в вашем пуле вышли из строя.

...