metaclass: (Default)
[personal profile] metaclass
Делаю генератор отчетов, у которого часть работы - запросы к БД и часть - постобработка. Все это работает в фоновых потоках clojure (внутри future) и паралелльно еще несколько потоков (из ScheduledThreadPool и его вариаций из java.util.concurrent) выполняют всякую вспомогательную работу типа "очистить старые данные", "пересчитать изменения пришедшие в очередь в БД".
future в clojure реализованы в том же thread pool что и функция send-off для агентов. Этот thread pool не имеет ограничений по размеру и изначально предполагался для операций, ожидающих i/o, а не cpu-bound. Пока отчет считается в БД - это нормально, но когда начинается постобработка, при превышении некоторого порога количества потоков - возникают совершенно непропорциональные тормоза, типа 30 отчетов одновременно считается за 2 минуты, 64 отчета считаются 30 минут.
Надо как-то более равномерно распределить работу по времени, чтобы количество нагружающих CPU потоков было ограничено, что ли. И вообще, надо как-то осилить профилирование нагрузки, чтобы знать, чем там кложурь и JVM занимаются.

Date: 2013-05-05 08:02 pm (UTC)
From: [identity profile] kiryl.livejournal.com
Похоже на lock contention. Интересно на каком уровне: жаба или глубже в ОС. Это винда или как?

С локами есть куча тонких эффекторов. Коллеги недавно статейку опубликовали по поводу некоторых из них: www.intel.com/content/dam/www/public/us/en/documents/white-papers/xeon-lock-scaling-analysis-paper.pdf

Date: 2013-05-05 08:13 pm (UTC)
From: [identity profile] metaclass.livejournal.com
У меня там локов конкретно во время расчета нет - все взаимодействия между потоками производятся по завершению расчетов. И я на 99% уверен, что во внутренностях clojure нету неявных блокировок - это бы полностью противоречило всей идеологии языка.

Сейчас я повторил эксперимент, постепенно наращивая количество запросов - теперь нормально, 4 минуты на 64 отчета. Но были мелкие изменения в условиях эксперимента, надо бы воспроизвести в оригинальных условиях.

Вообще говоря, там очень много разных эффектов - например, первая версия тупила на том, что в пуле коннектов к БД было ограничение на 8 активных коннектов.

Date: 2013-05-05 09:03 pm (UTC)
From: [identity profile] kiryl.livejournal.com
Локи в любом случае есть. Хотя бы в memory management в ядре.

Date: 2013-05-06 10:29 am (UTC)
From: [identity profile] tonsky.livejournal.com
В stm есть, Рич сам говорил: не фантазируйте, конечно, локи есть. Главное, что наружу не торчат.

Date: 2013-05-06 02:13 pm (UTC)
From: [identity profile] prepor.livejournal.com
Во всем, что касается shared мемори (stm, атомы, агенты) кложа, конечно, полна локов. Локи вредны не как таковые, а как интерфейс.

Date: 2013-05-05 08:08 pm (UTC)
From: [identity profile] andymur.livejournal.com
VisualVM в помощь, на хабре статья (http://habrahabr.ru/post/61857/) хорошая.

Вот где жестокий реальный мир наносит ответный удар. Чё-то ещё...да есть книжки, которые советовали ребята из Oracle, по перформансу, но может там все не так страшно.
Edited Date: 2013-05-05 08:09 pm (UTC)

Date: 2013-05-05 08:16 pm (UTC)
From: [identity profile] metaclass.livejournal.com
О, отлично, можно будет профилировать до одури :)

Date: 2013-05-05 08:24 pm (UTC)
From: [identity profile] theiced.livejournal.com
хабр, тупеют.

Date: 2013-05-05 08:27 pm (UTC)
From: [identity profile] metaclass.livejournal.com
А есть ли англоязычный ресурс типа хабра?
Я правда сомневаюсь, что где-нибудь, кроме русскоязычного интернета, жизнеспособна идея "дрочить на карму" :)

Date: 2013-05-05 08:49 pm (UTC)
From: [identity profile] mehanizator.livejournal.com
все что в рунете есть - заимствования и копии. дрочить на карму начали в digg еще в 2004

Date: 2013-05-06 04:00 am (UTC)
From: [identity profile] bydl0coder.livejournal.com
Во-во. Метакласс, по ходу, интернет вчера увидел.

Date: 2013-05-06 02:23 pm (UTC)
From: [identity profile] prepor.livejournal.com
или еще предстоит. завтра на стэковерфлоу наткнется.

Date: 2013-05-05 09:24 pm (UTC)
From: [identity profile] theiced.livejournal.com
я не в курсе про аналогично ненужные ресурсы.

Date: 2013-05-05 10:20 pm (UTC)
From: [identity profile] golikov konstantine (from livejournal.com)
в stackoverflow жизнеспособна же
Edited Date: 2013-05-05 10:21 pm (UTC)

Date: 2013-05-06 04:21 am (UTC)
From: [identity profile] thedeemon.livejournal.com
reddit, hacker news
Оттуда большинство переводимых статей хабровских.

Date: 2013-05-05 08:11 pm (UTC)
From: [identity profile] andrew kondratovich (from livejournal.com)
есть такое.

с агентами проще - можно выбирать куда совать.

можно поменять экзекутор - но он затронет весь рантайм.

Date: 2013-05-05 08:15 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Да я тут в процессе насмотрелся на java.util.concurrent - там все сделано крайне грамотно, можно использовать напрямую, создать отдельный пул и в нем считать.

Date: 2013-05-06 10:31 am (UTC)
From: [identity profile] tonsky.livejournal.com
мы так и делаем: scheduledthreadpool, timer, очереди

Date: 2013-05-06 10:37 am (UTC)
From: [identity profile] tonsky.livejournal.com
почему весь? send-via же

Date: 2013-05-06 01:17 pm (UTC)
From: [identity profile] andrew kondratovich (from livejournal.com)
Ага... в итоге экзекутор для фьючеров ставим глобальный, а для агентов - экплисит. не кошерно как-то.

Date: 2013-05-06 07:27 am (UTC)
From: [identity profile] bydlorus.livejournal.com
Когда я читаю про генераторы отчётов на closure, то в ужасе просыпаюсь, а рука в горшке.

Date: 2013-05-06 03:43 pm (UTC)
From: [identity profile] berezovsky.livejournal.com
мозг в горшке, рука в горшке

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 10th, 2025 09:13 pm
Powered by Dreamwidth Studios