Как оценить или рассчитать размер ArrayBlockingQueue - PullRequest
1 голос
/ 31 октября 2011

Как заголовок, в моем модуле была блокирующая очередь для доставки моих данных.Данные, которые сервер может выдавать, представляют собой большое количество информации для регистрации.Чтобы не влиять на производительность сервера, я написал многопоточные клиенты, которые используют эти данные и сохраняют их в кэшах данных.Поскольку данные могут быть получены в огромных количествах в минуту, я был озадачен тем, сколько размеров я должен инициализировать мою очередь.И я знал, что могу установить свою политику очередей, чтобы при получении большего количества данных я мог пропустить часть переполнения.Но сколько я создал в очереди, чтобы хранить эти данные как можно больше.

Не могли бы вы дать мне несколько советов? Насколько я знаю, это было связано с размером стека JVM моего сервера иданные единой регистрации в моей JVM ???

Ответы [ 2 ]

2 голосов
/ 01 ноября 2011

Непрерывная запись на диск выполняется достаточно быстро (легко 20 МБ в секунду).Вместо того, чтобы хранить данные в ОЗУ, лучше записать их на диск, не беспокоясь о требованиях к памяти.Ваши клиенты могут читать данные из файлов, а не из оперативной памяти.

Чтобы узнать размер Java-объекта, вы можете использовать любой Java-профилировщик.YourKit - мой любимый.

Я думаю, что настоящая проблема не в размере очереди, а в том, что вы хотите делать, когда все превышает запланированную емкость.ArrayBlockingQueue просто заблокирует ваши потоки, что может или не может быть правильным решением.Обычно вы можете выбрать следующие варианты:

1) Блокировать потоки (используйте ArrayBlockingQueue) на основе памяти, выделенной для этой цели. 2) Вернуть ошибку в «слой выше» и позволить этому слою решить, что делать ... может бытьотправить ошибку клиенту 3) Можете ли вы выбросить некоторые данные ... скажем, которые были в очереди давно.4) Начните запись на диск после переполнения ОЗУ.

2 голосов
/ 31 октября 2011

Сделайте это "настолько большим, насколько это разумно".Например, если вы согласны с тем, что он потребляет до 1 ГБ памяти, выделите его размер равным 1 ГБ, поделенному на среднее число байтов объектов в очереди.

Если мне нужно было выбрать "разумный номер, я бы начал с 10000.Причина в том, что если он вырастет до большего, то увеличение его не будет хорошей идеей и вряд ли поможет, потому что требования к ведению журнала явно опережают вашу способность регистрироваться, поэтому пришло время отказаться отклиенты.

«Настройка» с помощью экспериментов, как правило, является наилучшим подходом, поскольку зависит от профиля вашего приложения:

  • Если в работе вашего приложения есть максимумы и минимумы, тобольшая очередь поможет «сгладить» нагрузку на ваш сервер.
  • Если ваша прикладная программа имеет относительно устойчивую загрузку, тогда подходит меньшая очередь, так как большая очередь только задерживает неизбежную точку.когда клиенты заблокированы - вам лучше уменьшить его и выделить больше ресурсов (пару потоков журналирования) для выполнения работы.

Обратите также внимание, что очень большая очередь может повлиять на отзывчивость сборки мусора для освобождения памяти, поскольку при каждом запуске она должна обходить гораздо большую кучу (все объекты в очереди), увеличиваязагрузка как процессора, так и памяти.

Вы хотите сделать размер как можно меньшим, не оказывая слишком большого влияния на пропускную способность и скорость отклика.Чтобы оценить это, вам нужно настроить тестовый сервер и загрузить его с типичной нагрузкой, чтобы увидеть, что происходит.Обратите внимание, что вам, вероятно, понадобится подключить его к нескольким машинам, чтобы создать реалистичную нагрузку на сервер, поскольку попадание на него с одного компьютера может ограничить нагрузку из-за количества ядер ЦП и других ресурсов на тестовом клиентском компьютере.

Если честно, я бы просто сделал размер 10000 и настроил количество рабочих потоков, а не размер очереди.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...